當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]0 引言 實(shí)時(shí)控制系統(tǒng)程序設(shè)計(jì)中,常涉及到小數(shù)運(yùn)算問題.計(jì)算機(jī)系統(tǒng)中用二進(jìn)制表示小數(shù)的方法有定點(diǎn)數(shù)表示法和浮點(diǎn)數(shù)表示法.采用浮點(diǎn)數(shù)表示法表示的小數(shù)范圍大、精度高,但程序代碼長,運(yùn)算速度慢.定點(diǎn)數(shù)表示的小數(shù)

0 引言
實(shí)時(shí)控制系統(tǒng)程序設(shè)計(jì)中,常涉及到小數(shù)運(yùn)算問題.計(jì)算機(jī)系統(tǒng)中用二進(jìn)制表示小數(shù)的方法有定點(diǎn)數(shù)表示法和浮點(diǎn)數(shù)表示法.采用浮點(diǎn)數(shù)表示法表示的小數(shù)范圍大、精度高,但程序代碼長,運(yùn)算速度慢.定點(diǎn)數(shù)表示的小數(shù)范圍小、精度低,但程序代碼短,運(yùn)算速度快.
使用C語言設(shè)計(jì)程序具有程序可讀性強(qiáng),編程方便等優(yōu)點(diǎn),但按常規(guī)方法設(shè)計(jì)程序時(shí),實(shí)時(shí)性不如采用匯編語言設(shè)計(jì)的程序,這在涉及到小數(shù)運(yùn)算時(shí)表現(xiàn)更為突出.這樣就限制了C語言的應(yīng)用.如果采用合適的計(jì)算方法,使用C語言編程可以獲得與匯編語言編程同樣的實(shí)時(shí)性.
實(shí)時(shí)控制系統(tǒng)中的前向通道采集的原始數(shù)據(jù)大多是定點(diǎn)整數(shù),例如前向模擬通道的A/D轉(zhuǎn)換器的轉(zhuǎn)換結(jié)果,定時(shí)/計(jì)數(shù)器的計(jì)數(shù)結(jié)果等,都是定點(diǎn)整數(shù).而系統(tǒng)的后向通道能接受的輸入量也都為整數(shù),即由量化產(chǎn)生的有限字長誤差不可避免,精確到小數(shù)位的控制量因執(zhí)行機(jī)構(gòu)無法接受而不得不舍去.因而,雖然采用定點(diǎn)數(shù)表示小數(shù)的方法精度低,但在大多數(shù)情況下,仍能滿足實(shí)時(shí)控制系統(tǒng)的控制精度要求.
MCS-51單片機(jī)的內(nèi)部程序存儲(chǔ)器僅有4K,運(yùn)算速度較慢.對(duì)于實(shí)時(shí)性、代碼長度限制要求較高的控制系統(tǒng),采用MCS-51單片機(jī)控制時(shí),不宜大量采用浮點(diǎn)運(yùn)算.本文介紹Keil C51下的16位定點(diǎn)小數(shù)的乘法程序.

1 定點(diǎn)小數(shù)運(yùn)算算法
1.1 控制算法的特點(diǎn).
計(jì)算機(jī)實(shí)時(shí)控制系統(tǒng)中,控制算法通??捎孟旅娴牟罘址匠瘫硎荆?br/>


式中y[n]為第n個(gè)采樣周期的輸出,通常為二進(jìn)制整數(shù);x [n]為第n個(gè)采樣周期的輸入,通常也為二進(jìn)制整數(shù);ai、bi為實(shí)系數(shù).在保證計(jì)算精度的條件下,計(jì)算上述差分方程時(shí),將系數(shù)ai、bi轉(zhuǎn)換成整數(shù)或定點(diǎn)小數(shù),會(huì)大幅度提高運(yùn)算速度和大幅度減少代碼長度.這對(duì)于在程序存儲(chǔ)器容量或運(yùn)算速度有限的嵌入式控制器中實(shí)現(xiàn)快速控制算法計(jì)算有重要意義.

1.2 定點(diǎn)小數(shù)
小數(shù)可分為整數(shù)部分為0的純小數(shù)和帶整數(shù)的小數(shù).純小數(shù)可直接用定點(diǎn)小數(shù)表示,當(dāng)使用16位定點(diǎn)小數(shù)時(shí),分辯率可達(dá)2-16,可以獲的足夠的運(yùn)算精度.

1.3 定點(diǎn)算法
設(shè)x為十進(jìn)制純小數(shù),M為16位二進(jìn)制整數(shù).若程序需計(jì)算y=(x·M)取整,則可先將x轉(zhuǎn)換成16位二進(jìn)制定點(diǎn)小數(shù).
X =(x·65536)取整(2)
由于X的小數(shù)點(diǎn)在X的最高位前,2個(gè)16位二進(jìn)制數(shù)相乘結(jié)果為32位二進(jìn)制數(shù),小數(shù)點(diǎn)在高16位和低16位間,乘法運(yùn)算后的高16位為計(jì)算結(jié)果的整數(shù)部分,低16位為計(jì)算結(jié)果的小數(shù)部分.即
(x·M)取整=(X·M)取高16位 (3)
這樣處理后可以大幅度提高運(yùn)算速度,且大幅度減少代碼長度.
匯編語言程序設(shè)計(jì)中的取整操作容易實(shí)現(xiàn),在C語言中實(shí)現(xiàn)取整操作可以使用聯(lián)合體,方法如下.
先定義2個(gè)聯(lián)合體.
union{
unsigned char a_byte[4];
long a_long;
}r;
union{
unigned char b_byte[2];
int b_int;
}p;
第一個(gè)是長整數(shù)變量與4字節(jié)變量的聯(lián)合體,長整型變量用于保存計(jì)算結(jié)果,第二個(gè)是整型變量與2個(gè)字節(jié)型變量的聯(lián)合體,用于取整運(yùn)算.在Keil C51中,長整數(shù)占4個(gè)字節(jié),在RAM中按從高到低的順序存放,r.a_byte[0]、r.a_byte[1]存放計(jì)算結(jié)果的整數(shù)部分,r.a_byte[2]、r.a_byte[3]存放計(jì)算結(jié)果的小數(shù)部分.
通過下列程序,實(shí)現(xiàn)取整運(yùn)算.
p.b_byte[0]=r.a_byte[0];
p.b_byte[1]=r.a_byte[1];
這樣p.b_int為計(jì)算結(jié)果的整數(shù)部分.以上程序在編譯后僅為2條數(shù)據(jù)傳送指令,需要4個(gè)機(jī)器周期的執(zhí)行時(shí)間.與采用除法運(yùn)算或移位運(yùn)算實(shí)現(xiàn)取整運(yùn)算相比,具有更快的執(zhí)行速度.

2 程序
設(shè)程序需要計(jì)算0.12345乘16位二進(jìn)制數(shù)后取整,采用浮點(diǎn)數(shù)時(shí)的程序如下所示.
main()
{
int b;
b=20000;
a=0.12345*b;
}
本程序的運(yùn)行結(jié)果a=2527,程序編譯后長度513字節(jié),做浮點(diǎn)運(yùn)算時(shí)需要602個(gè)機(jī)器周期.
main()
{
int a,b;
union{
char c[4];
long d;
}u1;
union{
char e[2];
int f;
}u2;
b=20000;
u1.d=(long)8090*b;
u2.e[0]=u1.c[0];
u2.e[1]=u1.c[2];
}
本程序的運(yùn)行結(jié)果u2.f=2527,程序編譯后長度129字節(jié),做整數(shù)運(yùn)算時(shí)僅需134個(gè)機(jī)器周期.

3 結(jié)束語
采用本文中所述方法,使用c語言設(shè)計(jì)MCS-51單片機(jī)控制算法程序,可獲得與采用匯編語言設(shè)計(jì)的控制算法程序同樣的效果.充分發(fā)揮了
c語言設(shè)計(jì)程序的優(yōu)點(diǎn),筆者在設(shè)計(jì)的某控制系統(tǒng)時(shí),采用這種方法在獲得了很好的效果.


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉