提 问
卓老师,学生想请教一个有关“定时器中断服务函数的问题”。 我们之前一直都是把直立车的主要控制部分放在主函数的while循坏中的。 可是据说中断服务函数的效率很高,我们就把控制部分全部放在了中断服务函数里,每1us一次中断。结果数据失真了很多。那为什么大家都喜欢把代码放中断服务函数呢?

提问:同一个学校不同队伍之间的电路板是否可以相同?
回复:可以相同。只是比赛完之后比赛成绩都会被取消。
回 复
你提的问题非常好,是嵌入式系统初学者容易混淆的一些概念。你所提到的软件效率,通常是讲在有限的时间内,执行更多的指令。这在一般软件设计和实现中所讲的概念,即一个字“快”。
在嵌入式系统(有MCU,FPGA等可编程器件组成的具有特定功能的电子系统)中,则讲求的是系统的实时性-即在恰当的时间(或者事件发生时刻)执行恰当的软件指令。这些指令既不能提前,也不要落后(延迟),要恰到好处(puntuality)。
比如通过固定时间测量电机输出轴上光码盘的脉冲个数,并进行转速控制。如果读取的时间点不是按照定时器指定的时间间隔进行读取,则所获得的脉冲数就会与电机实际转速有偏差,进而影响电机转速控制。

通过定时计数码盘脉冲测量电机转速
为了实现实时性,通常可以采用查询和中断方式。
查询方式的实现通常是在主程序(main())中通过无限循环指令,将需要查询的各个事件进行排队串行循环查询。如果所有事件的查询和执行事件都非常短,这种方式可以实现实时执行。
如果有的事件查询和执行时间长,而且不攻读,这种方式会因为前后执行顺序,相互有影响。比如一个车查询事件发生了,并执行了相应的处理子程序。在此过程中如果有了另外的事件发生,则就会被耽搁。而且这种耽搁的时间长度不是固定的。

事件循环查询方法
中断方式则相对比较灵活。对于实时性要求比较高的事件处理,则可以通过MCU中相对应的中断触发相应的服务程序,完成事件的查询和处理。而对于一些实时性要求不高的任务,仍然可以放在主程序里循环执行。比如一些人机界面程序。
此时程序可以分成前台(中断服务程序)和后台(主循环执行)程序。由于只有少部分要求实时性比较高的程序被放在前台执行,所以整体程序的实时性就提高了。

中断事件查询方法
为了进一步保证实时性,一方面可以通过设置中断的不同 优先级提高重要事件执行的实时性;另一方面可以通过关闭中断服务,来避程序被打断。需要保证每个中断程序都尽可能的执行时间短。
将程序放在定时器周期中断中,可以保证任务执行周期间隔的精确性。显然,中断中所有执行程序所花费的时间总和要小于定时器中断时间间隔,否则就会扰乱中断程序响应。

最后,在来分析你在提问中的做法的错误:
1)将所有的执行程序都放在定时器的周期中断中,这与将所有的程序都放在主程序里执行没有什么两样,在中断程序里,它们仍然是顺序执行。
2)你的时钟中断周期设置为1微秒实在是太短了。假如你的MCU的指令频谱为100MIPS,所执行的程序稍微复杂一点(大于100个机器指令),执行指令时间就会超过1微妙,就会干扰时间中断的响应,进而使得程序执行发生阻塞。

接收快递包裹就是生活中典型的中断处理事件方式
中断的概念是在相同的MCU执行速度的情况下,通过优化不同任务执行顺序来提高系统的实时性的。如果没有按照任务实时性的轻重缓急进行分开,反而使得问题变得更糟。这是因为一些原本实时性要求不强的任务反而被强迫做更加频繁的执行,浪费了很多MCU的计算资源,使得MCU执行效率下降。
中断的应用是在有限的CPU的资源下,提高系统实时性的非常好的方法。但也会使得系统的稳定性受到“竞争冒险”现象的威胁。这需要在使用过程中通过其它手段加以保护。

如果定时中断方式查询快递则会浪费大量的时间
提 问
卓老师,请问电机的PWM频率大小对电机有什么影响呢,怎样才是最佳的嘞?我在网上找不到很权威的结论,感觉这里面挺有学问。

回 复
1)电机驱动的PWM过低:(<500Hz):PWM所激励的电枢电流就不会由电枢电感进行平滑,近而产生波动电流,近而产生波动力矩,因此会出现电机震动;
2)电机驱动的PWM过高(>10kHz)过高的频率会造成驱动板过高的切换功耗; 上下桥臂开关死区所占的PWM的比例增加,近而减少输出动态范围;同时,过高的PWM频率也会降低PWM输出的精度(动态范围)
3)电机的PWM合适的频率范围是很宽的,没有特别明显的最佳频率。设置它需要综合考虑控制周期、转速采用时间间隔等因素。

4)这个公众号里的回复,不一定是很权威。只有你能够理解到其中原理,通过实验解决你的工程问题才是权威的。