工具/软件:Code Composer Studio
您好!
实际上,当电网电压通过零点时、我需要检测电网电压(如果电网电压从负到正、则输出高电平;如果电网电压从正到负、则输出低电平。)
因此、我编写一个测试程序来验证该函数。 我使用 EPwm1A 生成占空比为50%的50Hz PWM。 则 eCAP1将捕获此 PWM。 如果 ECAP 捕获上升沿、强制 EPwm1B 输出高电平;如果下降沿、强制 EPwm1B 输出低电平。 理想结果是、我将通过示波器检测引脚 GPIO1 (EPwm1B)中占空比为50%的同步50Hz PWM。
但是、在 DSP 运行后、我遇到了一些问题。 我没有看到理想的结果。
首先、GPIO1没有输出 PWM。 它输出高电平或低电平。 然后我更改了一些配置。 GPIO1以50%的占空比输出25Hz PWM。
我将输出 EPwm1B 与输入 EPwm1A 进行了比较。 我发现 EPwm1B 的输出在 EPwm1A 的上升沿或下降沿没有变化。 它在 EPwm1A 高电平或低电平的中点发生变化。 eCAP1似乎没有捕获上升沿或下降沿。
我知道我的 eCAP1模块必须有一些错误的配置。 以下是我的配置代码:
void SetCap1模式(void)
{
ECap1Regs.ECEINT.ALL = 0x0000;//禁用所有中断
ECap1Regs.ECCLR.ALL = 0xFFFF;//清除全部标志
ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;//上升边沿
ECap1Regs.ECCTL1.bit.CAP1POL = EC_FALLING;//下降边沿
ECap1Regs.ECCTL1.bit.CAPLDEN = EC_DISABLE;//禁用 CAP1-CAP4寄存器加载
ECap1Regs.ECCTL1.bit.prescale = EC_DIV1;//输入/ 1.
ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;//在 CAP 模式下工作
ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_OneShot;//在单次触发模式下工作
ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;//禁用 SYNC OUT 信号
ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;//禁用同步输入
ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_FREEZE;//在不使用时停止计数器
ECap1Regs.ECCTL2.bit.STOP_Wrap = EC_EVENT2;//在事件2处停止
ECap1Regs.ECCTL2.bit.rearm = EC_ARM;// ARM 单次触发
ECap1Regs.ECEINT.BIT.CEVT1 = 1;
ECap1Regs.ECEINT.BIT.CEVT2 = 1;
}
中断空 ISRCap1 (空)
{
if (((ECap1Regs.ECFlG.bit.CEVT1 =1)&&(EPwm1Regs.AQCSFRC.bit.CSFB =1))
{
capcount1++;
LED1 =~LED1;
EPwm1Regs.AQCSFRC.bit.CSFB = 2;
ECap1Regs.ECCLR.bit.CEVT1 = 1;//清除事件1的标志
ECap1Regs.ECCLR.bit.CEVT2 = 1;
ECap1Regs.ECEINT.BIT.CEVT1 = 0;
ECap1Regs.ECEINT.BIT.CEVT2 = 1;
}
if (((ECap1Regs.ECFlG.bit.CEVT2 == 1)&&(EPwm1Regs.AQCSFRC.bit.CSFB == 2))
{
capcount2++;
LED2 =~LED2;
EPwm1Regs.AQCSFRC.bit.CSFB = 1;
ECap1Regs.ECCLR.bit.CEVT1 = 1;
ECap1Regs.ECCLR.bit.CEVT2 = 1;//清除事件2的标志
ECap1Regs.ECEINT.BIT.CEVT1 = 1;
ECap1Regs.ECEINT.BIT.CEVT2 = 0;
}
ECap1Regs.ECCLR.bit.INT = 1;//清除全局中断标志;
ECap1Regs.ECCTL2.bit.rearm = EC_ARM;//确认下一个中断
PieCtrlRegs.PIEACX.ALL = PIEACK_group4;
}
我查找寄存器、它表示每次进入中断时 、ECap1Regs.ECFlG.bit.CEVT1和 ECap1Regs.ECFlG.bit.CEVT2都将通道为1、我猜是配置
ECap1Regs.ECCTL2.bit.STOP_Wrap = EC_EVENT2;//在事件2处停止
可能是原因。 但是、如果在 EC_EVENT1上设置该位、它无法检测到下降沿、对吧?
因此、我想知道是否有任何解决方案可以解决这个问题、最好不要使用中断。
谢谢你。
此致、