原因
我们设计的简易PLC有的时候需要一些实时的操作,比如故障检测及保护,到位检测等等。
如果外部中断太多、太频繁,可能导致MCU陷于中断程序中,无法执行主程序以及其它中断程序,导致控制器无法及时响应,造成假死现象,影响客户体验,甚至影响控制器的功能。
因此,我们在设计时参照SDS的要求做了以下的规定:
要求
1) 不允许外部输入造成CPU的中断。
2)如果必须要使用外部中断,必须满足以下条件:
输入信号必须用硬件的低通滤波器进行过滤,比如通过R、C滤波电路进行过滤。
根据控制器定义的功能,确定输入信号在最坏情况下的最大频率,将硬件低通滤波器的截止频率设计为比该频率高5%。
当输入信号的频率高于硬件低通滤波器的截止频率时,输入信号不应该让MCU产生中断。
当输入信号的频率为硬件低通滤波器的截止频率时,MCU处理输入信号产生的中断所处理的时间加上其它所有中断所花费的时间,不应该高于中断产生的最小周期的30%。

R、C滤波电路
设计实例
比如,我们在给客户定制的一款控制器中,用了主、从两个MCU,从MCU通过单线通信将数据发送给主MCU,其中用到了IO口的电平变化中断。
其中,bit 1用大概256us的脉宽表示,bit 0用128us的脉宽表示。
考虑到主、从MCU的时钟偏差以及器件的公差,bit 0的最短脉宽考虑为128us*0.5=64us,则最高频率为15.625kHz。根据计算,用于滤波的R、C低通滤波器的R阻值为5.1K,电容为12.5nF,选择103的电容。
当输入信号为频率超过15.625kHz的方波信号时,MCU不应该产生电平变化中断。
当输入信号为频率15.625kHz的方波信号时,
MCU处理电平变化中断的时间,经实际测试为5.1us ,中断周期为62.5us,即每隔62.6us中断一次。
此外还有100us的定时器中断,处理花费4us,中断周期为100us,即每隔100us中断一次。
串口接收中断花费7us,最高支持115200bps的波特率,中断周期约为86.8us,即每隔86.8us中断一次。
串口发送中断花费6us,最高支持115200bps的波特率,中断周期约为86.8us,即每隔86.8us中断一次。
当所有中断同时发时的,MCU处理花费的总时间为5.1us+4.0us+7us+6us=22.1us。
总处理时间/最小中断周期=22.us/62.5us=35%,勉强满足要求。
来源:物联网全栈开发