高準確度時(shí)鐘程序算法
摘要:通過(guò)對引起實(shí)時(shí)時(shí)鐘計時(shí)誤差因數的分析,給出了一種提高實(shí)時(shí)時(shí)鐘長(cháng)期計時(shí)準確度的實(shí)用而有效的軟件方法。該方法具有成本低、易實(shí)現、通用性強、徹底校正等優(yōu)點(diǎn)。
本文引用地址:http://dyxdggzs.com/article/255588.htm關(guān)鍵詞:實(shí)時(shí)時(shí)鐘 準確度 定時(shí)器 軟件校正
電子計時(shí)器通常以石英晶振為時(shí)鐘源。時(shí)鐘源的頻率通常為幾十kHz乃至幾十MHz,而學(xué)用時(shí)鐘的最小計單位一般在0.01s~1s。高頻的時(shí)鐘源脈沖通過(guò)分頻器后產(chǎn)生基本定時(shí)脈沖。電子計時(shí)器的計時(shí)部分就是對基本定時(shí)脈沖進(jìn)行累加,產(chǎn)生秒、分、時(shí)等時(shí)間信息乃至日、月、年等日期信息。
1 引起計時(shí)誤差的因數
一個(gè)常規電子計時(shí)器的計時(shí)準確度,取決于晶振標稱(chēng)頻率(fs)與實(shí)際頻率(fo)的頻率偏差和晶振頻率的時(shí)漂、溫漂等離散參數。普通晶振的實(shí)際頻率與標稱(chēng)頻率有較大的偏差,可達萬(wàn)分之五(萬(wàn)分之5),折算到一天計時(shí)誤差就是43.2s。一般室內氣溫變化在每天10℃左右,對應晶振頻率溫漂10 -5,若以一段較長(cháng)的時(shí)間取溫漂的平均值則更小。因此電子計時(shí)器的誤差主要取決于晶振實(shí)際頻率與標稱(chēng)頻率的偏差。
2 減少計時(shí)誤差的方法
2.1 純硬件方法
對于純硬件計時(shí)電路,因分頻系數N固定不變,要提高計時(shí)準確度只能調整fo,使得已盡可能接近于fs。常規減少計時(shí)誤差的方法是:微調元件L、C、R的參數,調節硬件頻率,使得時(shí)鐘源的頻率誤差減小。但此方法操作復雜,沒(méi)有一定的電子技術(shù)知識和專(zhuān)用儀器很難校準,而且會(huì )降低晶振頻率穩定度。
2.2 純軟件方法
由微控制器控制的實(shí)時(shí)時(shí)鐘,可以采用軟件的方法消除晶振實(shí)際頻率與標稱(chēng)頻率間誤差引起的計時(shí)誤差。
令晶振標頻率為fs,而實(shí)際頻率為fo,則fs=k×fo。
若fs=fo則k=1,否則k≠1。
TNS=Ns×(1/fs)=Ns×(1/k)×(1/fo),Ns是在標稱(chēng)頻率fs下定時(shí)TNS的分頻系數。
由微控制器控制的實(shí)時(shí)時(shí)鐘,可以用軟件模擬,將1/k歸入總的計時(shí)程序中,從而消除fs和fo間偏差引來(lái)的計時(shí)誤差。對于專(zhuān)用硬件時(shí)鐘電路如:DS1320、PCF8583等,可以采用每小時(shí)或每10分鐘讀出時(shí)間,然后乘上1/k再寫(xiě)回芯片的方法校正。對于采用可編程分頻定時(shí)器,由軟件模擬時(shí)鐘功能的軟件實(shí)時(shí)時(shí)鐘,則有更好的提高計時(shí)準確度的方法。因為定時(shí)器的分頻系數是可以動(dòng)態(tài)改變的,如89C52內置的16位計數器,分頻系數可以在1~2 16內任意選取。令N=(1/k)Ns作為分頻系數寫(xiě)入計數器,這樣每個(gè)基本計時(shí)周期TN=TNS,從而實(shí)現軟件校正定時(shí)周期。
在(1/k)×Ns剛好為整數時(shí),可以使得計時(shí)誤差為0。大部分的情況(1/k)×Ns并不是整數,若將四舍五入后的值作為Ns,就會(huì )帶來(lái)的量化誤差,最大可達(1/2N),這是一個(gè)不容忽視的問(wèn)題。以12MHz的89C52T2定時(shí)器定時(shí)10ms為例,每天最大量化誤差累加是:24×3600÷(2×10000)=4.32s。若在片內RAM中定義1個(gè)字節發(fā)尾數,令它的滿(mǎn)碼值為1/N,則最大量化誤差就從原來(lái)的1/2N下降到1/(2×N×256)。對應于上述的10ms定時(shí)程序,其最大量化誤差的累加值由原來(lái)的4.32秒/天減少到0.016875秒/天,這是很大的改進(jìn)。根據精度要求,可以在片內RAM中定義2個(gè)字節,令它的滿(mǎn)碼值為1/N,這樣最大量化誤差就可降為1/(2×N×65536)。
減少量化誤差的具體算法是:對于使用89C52的T2決定器,若標稱(chēng)為12MHz的晶振實(shí)際長(cháng)期平均振蕩頻率fo=12.0006MHz,量化精度取1字節,取TNS=10ms,則分頻系數為:
N0=fo/(12×TNS)=12.0006/(12×10 6×10 -2)=10000.5
令N=INT(N0)=10000
NT=INT[(N0-N)×256+0.5]=128
每次定時(shí)中斷服務(wù)程序均執行(1)式,取得第I次定時(shí)計數值,然后實(shí)時(shí)時(shí)鐘增加10ms,完成時(shí)鐘功能。值得注意的是,Ni是實(shí)際的計數值,至于實(shí)際寫(xiě)入特定定時(shí)器的數值,則須根據具體定時(shí)器的遞減、遞加計時(shí)性質(zhì)分別寫(xiě)入Ni或Ni的補碼,同時(shí)定時(shí)器在溢出到新的定時(shí)值裝入并開(kāi)始新定時(shí)周期這段時(shí)間,將TLOAD考慮在內。例如89C52 T2工作于自動(dòng)重裝定時(shí)初值、遞加定時(shí)方式時(shí),實(shí)際寫(xiě)入定時(shí)器T2的捕獲/自動(dòng)重裝載寄存器(Rcap 2H,Rcap2L)的值是Ni的補碼,即65536-Ni;而對于89C52 T0和T1定時(shí)器則實(shí)際寫(xiě)入的定時(shí)初值是:Ni的補碼+TLOAD對應的機器周期數。
3 測量晶振實(shí)際長(cháng)期振蕩頻率
沒(méi)有專(zhuān)用儀器,怎樣測得晶振實(shí)際長(cháng)期振蕩頻率?有一個(gè)很簡(jiǎn)單的方法。以標稱(chēng)頻率下的定時(shí)計數值Ns作為實(shí)際計數值,在電臺報時(shí)時(shí)將時(shí)間設置正確,然后讓它運行一段較長(cháng)的時(shí)間,再與電臺的報時(shí)比較求出誤差的秒數,即可算出實(shí)際頻率。例如晶振標稱(chēng)頻率是12Mz,時(shí)鐘運行了10天,快了432s,則
fo=[(10×24×3600+432)/(10×24×3600)]×12
=1.0005×12
=12.0006MHz
若將上述算法編成程序,讓用戶(hù)直接輸入N和NT的值;或輸入運行了多少天、時(shí)、分、秒,快或慢了多少秒,讓系統自動(dòng)算出N和NT,將會(huì )為從根本上校準時(shí)鐘帶來(lái)極大方便。任何人都可以輕松地提高時(shí)鐘準確度而無(wú)需專(zhuān)業(yè)知識和專(zhuān)用儀器。
現在微控制器已廣泛應用于人們日常生活的各個(gè)方面,電子時(shí)鐘也隨著(zhù)它融入到各種電器和設備中,如專(zhuān)門(mén)時(shí)鐘功能的石英表和各種附帶電子計時(shí)器的電器如手機、普通液晶顯示電話(huà)、VCD機、DVD機、電視及高檔音響、空調遙控器、電力系統微機自動(dòng)化設備等。高檔專(zhuān)用計時(shí)器如高檔石英表,因為計時(shí)是它的主功能,須保證計時(shí)準確度而對計時(shí)時(shí)鐘源準確度要求嚴格,每天誤差在1s以下。以上提到的其它電器,其時(shí)鐘只是的一個(gè)附帶功能,出廠(chǎng)時(shí)一般不嚴格校正,甚至根本不做任何校正。所以誤差通常在1秒/天以上,有些達10秒/天以上,每天都需校正,否則運行幾天就會(huì )因誤差太大而變得不可信,令用戶(hù)不勝煩惱。
在電力系統中,無(wú)人值班變電部須安裝無(wú)功自動(dòng)控制設備。它根據一天中的不同時(shí)間段和電網(wǎng)無(wú)功情況自動(dòng)投退電容器組,使得電網(wǎng)的功率因數盡可能接近于1,以利于經(jīng)濟運行。但有些設備仙部時(shí)鐘每天誤差>5分種。若將本文算法編入計時(shí)程序中,讓用戶(hù)自己校正定時(shí)參數,將大大提高各種附帶時(shí)鐘的計時(shí)準確度。
將基于軟件提高實(shí)時(shí)時(shí)鐘準確度的算法應用于普通石英晶振,利用89C52 T2定時(shí)器的軟實(shí)時(shí)時(shí)鐘,未作校正每天11s;進(jìn)行軟件計時(shí)校正后,每10天的計時(shí)誤差1s。本文提出的基于軟件提高時(shí)鐘準確度的算法,具有極高的實(shí)用價(jià)值。
評論