把控制算法離散化成C語言時,有一個問題:幾乎所有的系數(shù)都是浮點(diǎn)型。單片機(jī)一般都沒有硬件浮點(diǎn)運(yùn)算功能,因此單片機(jī)的浮點(diǎn)運(yùn)算速度肯定是比單片機(jī)的整數(shù)運(yùn)算慢的。在過程控制中,因為離散化周期較長,至少是秒級別的,單片機(jī)在這段時間內(nèi)足以完成浮點(diǎn)運(yùn)算,因此對單片機(jī)的要求不高。但是在運(yùn)動控制中,離散化周期幾乎都是毫秒級別的,對一些低端的單片機(jī)而言,在幾毫秒內(nèi)完成大量的浮點(diǎn)運(yùn)算幾乎是不可能的,因此有必要對離散化算式進(jìn)行優(yōu)化。
假設(shè)有個一階濾波環(huán)節(jié),其離散化話后的算式為:
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;
將上式再做簡化,可以減少一個除法運(yùn)算,
u(k)=(333*u(k-1)+667*e(k))/1000;
因移位運(yùn)算比乘除法運(yùn)算要快,且 333/1000=341/1024, 667/1000=683/1024,故上式又可表達(dá)為
u(k)=(341*u(k-1)+683*e(k))/1024;
u(k)=(341*u(k-1)+683*e(k))>>10; //右移10位
另外,當(dāng)e(k)很小時,因為整除的關(guān)系,u(k)可能會為0,在這種情況下可以先將e(k)放大,在后續(xù)環(huán)節(jié)再對其做處理。
|