您好...
我正在使用TSM320f2.8035万来运行其中一个应用程序。
我正在使用设备的捕获模块来检查滤线栅信号(230 VAC RMS)的零交叉点,这进一步用于计算滤线栅的频率。
请注意,我正在使用上升和下降边缘触发器捕获每个备用样本中的信号。
下面是用于初始化捕获模块的代码。
我使用GPIO5作为捕获引脚。
void init_capture (void)
{
ecapFlag =0;
EALLOW;
/*为所选引脚启用内部上拉*/
GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0; //在GPIO5 (CAP1)上启用上拉
//默认情况下,输入与SYSCLKOUT同步。
gpioCtrlRegs.GPAQSEL1.bit.GPIO5 = 0; //同步到SYSCLKOUT GPIO5 (CAP1)
gpioCtrlRegs.GPAMUX1.bit.GPIO5 =3; //将GPIO5配置为CAP1
EDIS;
ECap1Regs.ECEINT.ALL = 0x0000; //禁用所有捕获中断
ECap1Regs.ECCLr.ALL = 0xFFFFFF; //清除所有CAP中断标志
ECap1Regs.ECCTL1.bit.CAPLDEN = 0; //禁用CAP1-CAP4寄存器加载
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; //确保计数器停止
//配置外设寄存器
ECap1Regs.ECCTL1.bit.prescale = 0; //绕过 预分频器
ECap1Regs.ECCTL2.bit.CAP_APWM = 0; //捕获模式
ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0; // OneShot 模式
ECap1Regs.ECCTL1.bit.CAP1POL = 1; //在下降边缘捕获事件 ECap1Regs.ECCTL1.bit.CAP2POL = 0; //在下降边缘捕获事件
ECap1Regs.ECCTL1.bit.CAP3POL = 0; //在下降沿捕获事件
ECap1Regs.ECCTL1.bit.CAP4POL = 0; //在下降沿捕获事件
ECap1Regs.ECCTL1.bit.CTRRST1 = 1; //不要重置计数器
ECap1Regs.ECCTL1.bit.CTRRST2 = 1; //不要重置计数器
ECap1Regs.ECCTL1.bit.CTRRST3 = 1; //请勿重置计数器
ECap1Regs.ECCTL1.bit.CTRRST4 = 1; //请勿重置计数器
ECap1Regs.ECCTL2.bit.SYNCI_EN = 0; //禁用同步输入
ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0; //通过
ECap1Regs.ECCTL1.bit.CAPLDEN = 1; //启用捕获装置
ECap1Regs.ECCTL2.bit.stop_wrap = 0; //捕获序列在捕获事件2后停止
ECap1Regs.ECCTL2.bit.rearm =1; //重置和 解冻 计数器
ECap1Regs.ECEINT.Bit.CEVT1 =1; //捕获事件1是中断源
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; //启动计数器
}
ISR中断如下。
中断 无效 eCAP1_ISR(void)
{
GpioDataRegs.GPATOGLE.bit.GPIO23 = 1;
IF (ecapFlag == 1)
{
ecapFlag =0;
ECap1Regs.ECCLr.bit.CEVT1 = 1;
ECap1Regs.ECCLr.bit.INT =1;
ECap1Regs.ECCLr.ALL = 0xFFFFFF; //清除所有CAP中断标志
ECap1Regs.ECCTL1.bit.CTRST1 = 1;
ECap1Regs.ECCTL2.bit.rearm = 1;
ECap1Regs.ECCTL1.bit.CAP1POL = 1; //在下降沿捕获事件
ECap1Regs.TSCTR = 0;
//确认此中断以接收来自组4的更多中断
PieCtrlRegs.PIEACK.ALL = PIEACK_group4;
返回;
}
ECap1Regs.ECCLr.bit.CEVT1 = 1;
ECap1Regs.ECCLr.bit.INT =1;
ECap1Regs.ECCLr.ALL = 0xFFFFFF; //清除所有CAP中断标志
ECap1Regs.ECCTL1.bit.CTRST1 = 1;
ECap1Regs.ECCTL2.bit.rearm = 1;
ECap1Regs.ECCTL1.bit.CAP1POL = 0; //在下降沿捕获事件
ecapFlag =1;
ECap1Regs.TSCTR = 0;
//确认此中断以接收来自组4的更多中断
PieCtrlRegs.PIEACK.ALL = PIEACK_group4;
}
请注意,我已经启用了捕获模块的外设时钟以及捕获的中断向量,但在示例代码中没有提到。
我还在代码"ADC interrupt riggered by PWM signal & Capture module event interrupt"中使用了2个中断
执行上述例程时,有时会显示突然的结果,进而导致我的系统跳闸。
为了确保我的捕获事件被正确触发,我在中断中切换了GPIO引脚(在中断例程中显示的GPIO23)。
捕获的波形如下所示。
图1.
图2.
请忽略图中的"绿色"和"黄色"波形。
图2是图1的放大版本。
"粉红色"是零交叉波形,每10毫秒打开和关闭一次。 “蓝色”是我切换的GPIO23引脚。
从波形中可以很清楚地看出,存在一个正确的零交叉波形,当存在一些错误捕获事件时,即"蓝色"波形的时间段已更改,我正在捕获该波形。
即使零交叉引脚上似乎也没有噪音问题,因为波形中的事件上没有捕获到峰值。
这导致我的系统跳闸。
我们衷心感谢您的真诚回应。
提前感谢。
此致,
卡迈勒

