首先,我的外部输入信号是一个频率为60hz的,0到3.3V的一个方波信号。
其次,我的Ecap模块配置如下。可以看到,此处我将Ecap1(GPIO24)与Ecap2(GPIO25)使能,且均工作在捕获工作状态下。其中Ecap1用于捕获外部输入方波信号的4个上升沿,而Ecap2用于捕获外部输入方波信号的4个下降沿。Ecap1和Ecap2四个捕获中断均使能。
void SetCap1Mode(void)
{
ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP2POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP4POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CTRRST1 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRRST2 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRRST3 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRRST4 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap1Regs.CTRPHS=0;
ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap1Regs.ECCTL2.bit.SYNCI_EN = 1;
ECap1Regs.ECEINT.all=0x0000;//stop all interrupt
ECap1Regs.ECCLR.all=0xFFFF;//clare all flag
ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启动
ECap1Regs.ECEINT.bit.CEVT1=1;// Enable all interrupt
ECap1Regs.ECEINT.bit.CEVT2=1;
ECap1Regs.ECEINT.bit.CEVT3=1;
ECap1Regs.ECEINT.bit.CEVT4=1;
}
void SetCap2Mode(void)
{
ECap2Regs.ECCTL1.bit.CAP1POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CAP3POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CTRRST1 = EC_ABS_MODE;
ECap2Regs.ECCTL1.bit.CTRRST2 = EC_ABS_MODE;
ECap2Regs.ECCTL1.bit.CTRRST3 = EC_ABS_MODE;
ECap2Regs.ECCTL1.bit.CTRRST4 = EC_ABS_MODE;
ECap2Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap2Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap2Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap2Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap2Regs.CTRPHS=0;
ECap2Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap2Regs.ECCTL2.bit.SYNCI_EN = 1;
ECap2Regs.ECEINT.all=0x0000;//stop all interrupt
ECap2Regs.ECCLR.all=0xFFFF;//clare all flag
ECap2Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启动
ECap2Regs.ECEINT.bit.CEVT1=1;// Enable all interrupt
ECap2Regs.ECEINT.bit.CEVT2=1;
ECap2Regs.ECEINT.bit.CEVT3=1;
ECap2Regs.ECEINT.bit.CEVT4=1;
}
我的Epwm模块配置如下,其中Epwm1输出一个频率为50kHz的PWM波,AB口输出波形相同,上下沿处设置死区。Epwm2通过AQ子模块设置,将A口置高,B口置低。
void EPwmSetup()
{
InitEPwm1Gpio();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
//counting method
EPwm1Regs.TBCTL.bit.CTRMODE = 2;//up&down
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1;
EPwm1Regs.TBCTL.bit.CLKDIV = 0;//TBCLK=75M
EPwm1Regs.TBCTL.bit.PHSEN=TB_DISABLE;
// EPwm1Regs.TBCTL.bit.PHSDIR=TB_UP;
EPwm1Regs.TBCTL.bit.SYNCOSEL=TB_SYNC_IN;
//Comp set
EPwm1Regs.CMPCTL.bit.SHDWAMODE = 1;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = 1;
//Action qualifier
EPwm1Regs.AQCTLA.bit.CAU = 2;//CTR=CMPA up,epwmA set
EPwm1Regs.AQCTLA.bit.CAD = 1;//CTR=CMPA down,epwmA reset
EPwm1Regs.AQCTLB.bit.CAU = 2;
EPwm1Regs.AQCTLB.bit.CAD = 1;
EPwm1Regs.AQSFRC.all = 0;//software enforcement
EPwm1Regs.AQCSFRC.all = 0;
//DB set
EPwm1Regs.DBCTL.bit.OUT_MODE = 3;
EPwm1Regs.DBCTL.bit.IN_MODE = 2;
EPwm1Regs.DBCTL.bit.POLSEL = 0;//
//Epwm1 config
EPwm1Regs.TBSTS.all = 0;
EPwm1Regs.TBPHS.half.TBPHS = 0;
EPwm1Regs.TBCTR = 0;
EPwm1Regs.TBPRD = 750;//PWM1 freq=50khz
EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD * 0.4;//D=0.6 D=1-(CMPA/TBPRD) D=1-Dset
EPwm1Regs.DBRED = 45;//up dead time=0.6u
EPwm1Regs.DBFED = 45;//dowm dead time=0.6u
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
InitEPwm2Gpio();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
// SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1;
//counting method
EPwm2Regs.TBCTL.bit.CTRMODE = 2;//up&down count
EPwm2Regs.TBCTL.bit.HSPCLKDIV = 2;
EPwm2Regs.TBCTL.bit.CLKDIV = 6;
// EPwm2Regs.TBCTL.bit.PRDLD =TB_SHADOW;
// EPwm2Regs.TBCTL.bit.PHSEN=TB_ENABLE;
// EPwm2Regs.TBCTL.bit.PHSDIR=TB_UP;
// EPwm2Regs.TBCTL.bit.SYNCOSEL=TB_SYNC_IN;
//Comp set
EPwm2Regs.CMPCTL.bit.SHDWAMODE = 1;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = 1;
// EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
// EPwm2Regs.CMPCTL.bit.LOADBMODE = 0;
//Action qualifier
EPwm2Regs.AQCTLA.bit.CAU = 2;//CTR= up,epwmA set
EPwm2Regs.AQCTLA.bit.CAD = 2;
EPwm2Regs.AQCTLB.bit.CAU = 1;//CTR= down,epwmB reset
EPwm2Regs.AQCTLB.bit.CAD = 1;
EPwm2Regs.AQSFRC.all = 0;//software enforcement
// EPwm2Regs.AQCSFRC.bit.CSFA = 2;
// EPwm2Regs.AQCSFRC.bit.CSFB = 2;
//DB set
EPwm2Regs.DBCTL.bit.OUT_MODE = 3;//enable DB
EPwm2Regs.DBCTL.bit.IN_MODE = 2;//pwmA_DB up;pwmB_DB down
EPwm2Regs.DBCTL.bit.POLSEL =0;//A低B高,cap斩波
//Epwm1 config
EPwm2Regs.TBSTS.all = 0;
EPwm2Regs.TBPHS.half.TBPHS = 0;
EPwm2Regs.TBCTR = 0;
//
EPwm2Regs.TBPRD = 5000;//PWM2 freq=60hz
EPwm2Regs.CMPA.half.CMPA = EPwm2Regs.TBPRD * 0.5;//D=0.5
// EPwm2Regs.DBRED = 100;//up dead time=0.5m
// EPwm2Regs.DBFED = 100;//dowm dead time=0.5m
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
}
最后,主程序中断配置如下。根据外部输入60hz的方波信号配置Epwm1和Epwm2信号。此时Epwm1输出频率变为60Hz,其中半个周期为高频信号,半个周期置低,AB口输出互补。Epwm2输出通过重新配置AQ子模块各寄存器参数,对其进行斩波,输出一个频率与外部输入信号相同的PWM信号。
interrupt void ISRCap1(void)
{
// m++;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;//0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断
ECap1Regs.ECCLR.all=0xFFFF;//写0XFFFF对CAP1中断清除寄存器进行清除操作
EALLOW;
EPwm1Regs.AQCTLA.bit.CAU = 2;//CTR=CMPA up,epwmA set
EPwm1Regs.AQCTLA.bit.CAD = 1;//CTR=CMPA down,epwmA reset
EPwm1Regs.AQCTLB.bit.CAU = 1;
EPwm1Regs.AQCTLB.bit.CAD = 1;
EPwm2Regs.AQCTLA.bit.CAU = 1;//CTR=CMPA up,epwmA set
EPwm2Regs.AQCTLA.bit.CAD = 1;//CTR=CMPA down,epwmA set
EPwm2Regs.AQCTLB.bit.CAU = 2;
EPwm2Regs.AQCTLB.bit.CAD = 2;
EDIS;
}
interrupt void ISRCap2(void)
{
// n++;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;//0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断
ECap2Regs.ECCLR.all=0xFFFF;//写0XFFFF对CAP2中断清除寄存器进行清除操作
EALLOW;
EPwm1Regs.AQCTLA.bit.CAU = 1;//CTR=CMPA up,epwmA reset
EPwm1Regs.AQCTLA.bit.CAD = 1;//CTR=CMPA down,epwmA reset
EPwm1Regs.AQCTLB.bit.CAU = 2;
EPwm1Regs.AQCTLB.bit.CAD = 1;
EPwm2Regs.AQCTLA.bit.CAU = 2;//CTR=CMPA up,epwmA reset
EPwm2Regs.AQCTLA.bit.CAD = 2;//CTR=CMPA down,epwmA reset
EPwm2Regs.AQCTLB.bit.CAU = 1;
EPwm2Regs.AQCTLB.bit.CAD = 1;
EDIS;
}
我的问题有两点,且不知怎么解决:
1. 由输出波形可见,其中Epwm1输出可以与外界信号可以同步。而Epwm2输出似乎与外界信号存在相移,始终无法与外部输入信号同步。(图1中黄色紫色波形为epwm1AB口输出,绿色为外部输入方波,蓝色为Epwm2 A口输出波形)
2. 可以看到epwm的输出波形存在短暂丢失,似乎我的捕获程序丢失了信号。(图2、3)



