一开始程序只有一个产生PWM信号输出的中断,可以通过错误联防模块设置当采集到Fault信号时使PWM输出变为高阻态,但没有办法在异常出现后通过按键恢复PWM信号的输出,于是在程序里加上了错误联防模块的中断,用于实现此功能,关键代码如下:
程序开始前需要声明中断函数:
interrupt void PMW_TZ_ISR(void);
指定PWM_TZ_ISR()函数作为EPWM1_TZINT中断的响应函数:
PieVectTable.EPWM1_TZINT = &PMW_TZ_ISR;
通过查询中断向量表可知EPWM1_TZINT中断为PIE组2的第一个向量,故激活PIE组2的第一个中断向量,即ePWM_TZINT中断向量:
PieCtrlRegs.PIEIER2.all = M_INT1;
同样有上面的表格可以得出,由于PIE组2的中断向量复用的是CPU的INT2中断,所以还要使能CPU的INT2用来处理EPWM1_TZINT中断:
IER |= M_INT2;
准备工作完成后,即可在中断函数里实现上述的内容,具体为:
首先判断ONE-SHORT标志位EPwm1Regs.TZFLG.bit.OST是否为1,如果为一直为1,则说明故障还没有去除,系统不能继续工作,所以程序就一直在while循环里:
while(EPwm1Regs.TZFLG.bit.OST == 1)
{
...
}
一旦故障解除,用户按下了按键请求继续输出PWM信号,此时在while循环里用if语句判断按键是否被按下(从datasheet可以查到按键S1与GPIO13相连,所以判断按键是否按下,只需检查GPIO13的值是否为0即可,按下了就为0);这里的去抖由于不需要太精确的延时,所以直接用for循环延时,延时时间后面再具体确定: