魯?shù)劳?趙文龍,謝敏,阮艷鳳
(南昌航空大學(xué) 信息工程學(xué)院,南昌 330063)
魯?shù)劳?、謝敏、阮艷鳳(碩士研究生),主要研究領(lǐng)域?yàn)榭刂乒こ?趙文龍(教授),主要研究領(lǐng)域?yàn)橛嬎銠C(jī)控制、嵌入式技術(shù)、工業(yè)過程控制。
在對時間的精度要求比較高的場合,一般要求對采用單片機(jī)做控制器的系統(tǒng)進(jìn)行精確的時間計算。有人對此問題做了研究并提出了很好的解決方法[1-3],但是他們有的是針對單片機(jī)使用頻率為12 MHz晶振下匯編語言的特點(diǎn)作出的分析,有的是針對特定的使用條件或環(huán)境下的分析,不適合晶振頻率為11.059 2 MHz的情況。為此,針對單片機(jī)定時器的特點(diǎn),在此晶振頻率下,利用TKStudio對定時器T0方式2進(jìn)行分析仿真,取得了精確的定時時間,合理地解決了定時常數(shù)為小數(shù)的問題,為單片機(jī)定時提出了一種新思路。
單片機(jī)有4種定時方式。方式0、方式1、方式3有一個共同點(diǎn)是有定時器溢出中斷的響應(yīng)時間誤差,而方式2具有自動重載功能,沒有這些誤差。
產(chǎn)生中斷溢出的響應(yīng)時間誤差的原因有3個:一是中斷響應(yīng)時間;二是定時器溢出中斷信號時,CPU正在執(zhí)行某指令;三是定時器溢出中斷信號時,CPU正在執(zhí)行某中斷服務(wù)程序[4]。由于每條指令的執(zhí)行時間不同且中斷時不知道CPU會執(zhí)行哪一條指令,這就導(dǎo)致中斷溢出的響應(yīng)時間不確定。
方式2是自動重載的,可以很好地免去上面的不確定時間。方式2的定時時間為 T=12×(256-a)/fosc[5]。以頻率為11.059 2 MHz的晶振為例,定時250 μ s分析,易得a=25.6。通常情況下,使用定時器時裝的初值為常數(shù),但是此處為小數(shù),要想得到準(zhǔn)確的250 μ s,還必須要用a=25.6。下面為解決小數(shù)問題的分析:若a=25,則25-25.6=-0.6;若 a=26,則 26-25.6=0.4。那么以25.6為常數(shù)中斷40次便是10 ms,試想前16次中斷用a=25,誤差為16×(-0.6)=-9.6,后24次中斷用 a=26,誤差為24×0.4=9.6,可以看出,經(jīng)過40次的中斷便沒有誤差了,10 ms是準(zhǔn)確值。這樣,便可以用10 ms為基數(shù)產(chǎn)生出秒、分、時等。
編寫一個計時程序,對其進(jìn)行分析仿真。代碼如下:
把程序放到TKStudio中進(jìn)行仿真,在配置目標(biāo)工程中填寫11.059 2 MHz的晶振頻率進(jìn)行軟件仿真。編譯后開始調(diào)試,按程序標(biāo)記分別對各個斷點(diǎn)進(jìn)行調(diào)試。
首先在第一個斷點(diǎn)處調(diào)試,單擊啟動/停止按鈕后,程序初始化,可以看出初始化時間為639.106 μ s(如圖1所示);然后單擊運(yùn)行按鈕,運(yùn)行到斷點(diǎn)處會自動停止并顯示運(yùn)行的時間為10.037 977 ms(如圖2所示),這里包括運(yùn)行主函數(shù)其他指令的時間和執(zhí)行一次timeflag變化的時間;然后再單擊一次運(yùn)行按鈕,顯示時間為10 ms(如圖3所示),這一次為執(zhí)行一次timeflag變化的時間,即中斷40次 250 μ s的時間 ;
圖1 斷點(diǎn)1程序單擊啟動/停止調(diào)試按鈕后初始化時間
圖2 在斷點(diǎn)1處運(yùn)行第一次顯示的數(shù)據(jù)
圖3 在斷點(diǎn)1處運(yùn)行第二次顯示的數(shù)據(jù)
繼續(xù)按運(yùn)行操作,可以發(fā)現(xiàn)以后的delta_s均是10 ms。取消斷點(diǎn)1處的斷點(diǎn),在斷點(diǎn)2處設(shè)斷點(diǎn),執(zhí)行與斷點(diǎn)1處相同的操作步驟得到的結(jié)果如圖4~圖6所示,其后的執(zhí)行結(jié)果delta_s均為1 s。
圖4 斷點(diǎn)2程序單擊啟動/停止調(diào)試按鈕后初始化時間
圖5 在斷點(diǎn)2處運(yùn)行第一次顯示的數(shù)據(jù)
圖6 在斷點(diǎn)2處運(yùn)行第二次顯示的數(shù)據(jù)
同樣,在斷點(diǎn)3處設(shè)斷點(diǎn)運(yùn)行,結(jié)果如圖7~圖9所示,以后的每次delta_s均為60 s。斷點(diǎn)4處運(yùn)行結(jié)果如圖10~圖12所示,以后每次delta_s均為3 600 s。
圖7 斷點(diǎn)3程序單擊啟動/停止調(diào)試按鈕后初始化時間
圖8 在斷點(diǎn)3處運(yùn)行第一次顯示的數(shù)據(jù)
圖9 在斷點(diǎn)3處運(yùn)行第二次顯示的數(shù)據(jù)
圖10 斷點(diǎn)4程序單擊啟動/停止調(diào)試按鈕后初始化時間
圖11 在斷點(diǎn)4處運(yùn)行第一次顯示的數(shù)據(jù)
圖12 在斷點(diǎn)4處運(yùn)行第二次顯示的數(shù)據(jù)
本文對常用的頻率為11.059 2 MHz的晶振在定時器T0方式2下做了分析,仿真結(jié)果良好;同時,提出了一種解決定時常數(shù)為小數(shù)問題的辦法,能夠推廣應(yīng)用于其他情況。
[1]方飛,謝麗春.利用Keilx51實(shí)現(xiàn) T0的精確定時[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2006(1):64-66.
[2]蹇興亮.單片機(jī)定時中斷的精確定時編程方法種種[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2004(8):70-71.
[3]朱蓉,鄭建華.基于MCS-51單片機(jī)定時精確控制的研究[J].現(xiàn)代電子技術(shù),2005(17):32-34.
[4]楊洪亮.基于MCS51單片機(jī)定時誤差分析及糾正[J].福建電腦,2006(12):145-146.
[5]張友德,趙志英,涂時亮.單片微型機(jī)原理、應(yīng)用與實(shí)驗(yàn)[M].5版.上海:復(fù)旦大學(xué)出版社,2008:106-113.