把控制算法离散化成C语言时,有一个问题:几乎所有的系数都是浮点型。单片机一般都没有硬件浮点运算功能,因此单片机的浮点运算速度肯定是比单片机的整数运算慢的。在过程控制中,因为离散化周期较长,至少是秒级别的,单片机在这段时间内足以完成浮点运算,因此对单片机的要求不高。但是在运动控制中,离散化周期几乎都是毫秒级别的,对一些低端的单片机而言,在几毫秒内完成大量的浮点运算几乎是不可能的,因此有必要对离散化算式进行优化。
假设有个一阶滤波环节,其离散化话后的算式为:
u(k)=0.333*u(k-1)+0.667*e(k);
因0.333=333/1000,故上式可化为
u(k)=333*u(k-1)/1000+667*e(k)/1000;
将上式再做简化,可以减少一个除法运算,
u(k)=(333*u(k-1)+667*e(k))/1000;
因移位运算比乘除法运算要快,且 333/1000=341/1024, 667/1000=683/1024,故上式又可表达为
u(k)=(341*u(k-1)+683*e(k))/1024;
u(k)=(341*u(k-1)+683*e(k))>>10; //右移10位
另外,当e(k)很小时,因为整除的关系,u(k)可能会为0,在这种情况下可以先将e(k)放大,在后续环节再对其做处理。
|