我用TI自带的28069的HRPWM的例程,发现端口没有脉冲产生,我仔细核对了一下TI提供的SPRUH18D(讲诉3HRPWM的技术文档)中给的关于HRPWM的说明与例子,发现对HRPWM的初始化都是相同的,现在一直没找到原因在哪里,求助啊啊?????????????现在把程序贴出来,供各位解读!
#include "F2806x_Device.h" // F2806x Headerfile
#include "F2806x_Examples.h" // F2806x Examples Headerfile
#include "F2806x_EPwm_defines.h" // useful defines for initialization
void HRPWM1_Config(int);
void HRPWM2_Config(int);
void HRPWM3_Config(int);
void HRPWM4_Config(int);
Uint16 i,j, DutyFine, PeriodFine ,n,update;
Uint32 temp;
void main(void)
{
InitSysCtrl();
InitEPwm1Gpio();
InitEPwm2Gpio();
InitEPwm3Gpio();
InitEPwm4Gpio();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
update =1; DutyFine =0; PeriodFine =0;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
HRPWM1_Config(10); // ePWM1 target, Period = 10
HRPWM2_Config(20); // ePWM2 target, Period = 20
HRPWM3_Config(10); // ePWM3 target, Period = 10
HRPWM4_Config(20); // ePWM4 target, Period = 20
EALLOW;
EPwm1Regs.HRPCTL.bit.HRPE = 1; //Enable High resolution EPwm1 period
EPwm2Regs.HRPCTL.bit.HRPE = 1; //Enable High resolution EPwm2 period
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; //Enable TBCLKSYNC
EDIS;
while (update ==1) //测试微调HRPWM的占空比,精度可以达到0.02%
{
for(DutyFine =1; DutyFine <256 ;DutyFine ++) {
// Example, write to the HRPWM extension of CMPA
EPwm1Regs.CMPA.half.CMPAHR = DutyFine << 8; // Left shift by 8 to write into MSB bits
EPwm2Regs.CMPA.half.CMPAHR = DutyFine << 8; // Left shift by 8 to write into MSB bits
// Example, 32-bit write to CMPA:CMPAHR
EPwm3Regs.CMPA.all = ((Uint32)EPwm3Regs.CMPA.half.CMPA << 16) + (DutyFine << 8);
EPwm4Regs.CMPA.all = ((Uint32)EPwm4Regs.CMPA.half.CMPA << 16) + (DutyFine << 8);
for (i=0;i<10000;i++){} // Dummy delay between MEP changes
}
}
void HRPWM1_Config(period)
{
EPwm1Regs.TBCTL.bit.PRDLD = TB_IMMEDIATE; // set Immediate load,立即装载TBPRD寄存器的值
EPwm1Regs.TBPRD = period-1; // PWM frequency = 1 / period 设置周期值
EPwm1Regs.CMPA.half.CMPA = period / 2; // set duty 50% initially,设置占空比
EPwm1Regs.CMPA.half.CMPAHR = (1 << 8); // initialize HRPWM extension EPwm1Regs.CMPB = period / 2; // set duty 50% initially
EPwm1Regs.TBPHS.all = 0; EPwm1Regs.TBCTR = 0;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; //向上计数方式
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // EPwm1 is the Master
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; //disable EPWMxSYNCO signal
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //TBCLK的时钟等于系统时钟
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // PWM toggle low/high
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;
EALLOW; EPwm1Regs.HRCNFG.all = 0x0;
EPwm1Regs.HRCNFG.bit.EDGMODE = HR_REP; //MEP control on Rising edge
EPwm1Regs.HRCNFG.bit.CTLMODE = HR_CMP; //选择CMPAHR寄存器和TBPRDHR寄存器控制 the edge position
EPwm1Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO;
EDIS;
}
其他的HRPWM的配置都是和HRPWM1的配置相同,这里把void InitEPwm1Gpio(void)的代码页贴出来:
void InitEPwm1Gpio(void)
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1; // Disable pull-up on GPIO0 (EPWM1A)
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // Configure GPIO0 as EPWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // Configure GPIO1 as EPWM1B
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
EDIS;
}
请各位帮忙找找问题在哪,在GPIO0管脚始终没有PWM脉冲,GPIO1和其他的都没有!我通过延时程序可以在GPIO0处产生PWM波,硬件上应该没有什么问题,不知道是不是哪里设置有问题!