貴州師范大學 李國龍
目前國內(nèi)用來定時的方法主要有以下幾種方法:
(1)RC電路的充、放電。這種電路定時精度較低、成品體積較大、調(diào)試比較麻煩。
(2)定時芯片。這種電路精度較高,靈活性差,通用性差。
(3)單片機做定時。這種電路實用性強、靈活性好、調(diào)試方便、定時范圍寬。但是算法設(shè)計是否科學將直接影響定時精度的高低,本文以產(chǎn)品成本和定時精度為考慮要素,折中選擇價格低廉具有制動重載功能和內(nèi)部振蕩器的ATTINY 13為例,通過改進定時算法來提高定時精度。旨在實現(xiàn)低成本高精度的需求。
(1)振蕩器本身誤差
由圖2-1和圖2-2得知影響內(nèi)部RC振蕩器精度主要由ATTINY 13的工作電壓和工作溫度,而ATTNY13出廠時是在5v、25oC條件下校正的。為了能提高產(chǎn)品在任意溫度下的定時精度,就要知道產(chǎn)品工作電壓,和工作溫度然后對RC振蕩器校正,但是即便進行校正后精度也不能太高,太高會導致校正失敗一般可以將精度校正到±1%.如果要使用更高精度定時,則推薦用無源晶振加非門做振蕩器,或者用有源晶振,這樣一來產(chǎn)品成本會有所提高。
(2)定時算法帶來誤差
傳統(tǒng)的定時算法大致會經(jīng)過如圖2-3所示。定時器溢出后,主程序可能正在執(zhí)行某條指令,執(zhí)行完這條指令需要的時間為T1,經(jīng)T1時間后可以響應(yīng)中斷,但在這個過程中可能會有比定時中斷更高級的中斷申請,如果有則執(zhí)行高級中斷,經(jīng)過T2后高級中斷結(jié)束進入定時中斷,經(jīng)T3后定時器/計數(shù)器加載初值成功,開始啟動下一次定時。經(jīng)過以上分析得知T1和T2是隨機誤差,其值是不可預(yù)知,而T3是進入定時中斷后裝載定時初值耗費的時間,它的值是固定的。定時誤差為T1+T2+T3,如果能有效減小T1、T2就能達到減小誤差提高精度的目的。
(1)RC振蕩器校正
對于RC振蕩器的校正可以利用STK5OO,AVRISP,JTAGICE和JTAGICE mkIIAVR校正工具,校正程序可以到ATMEL官方網(wǎng)站下載,校正流程可以參考下面說明(該說明譯自ATMEL):
1)下載AVRO53的源代碼。
2)安裝AVR Studio 4.11 SP1。
3)創(chuàng)建工程名為rc_calib,添加源文件RC_Calibration.asm到工程中。
4)在RC_Calibration.asm中選擇目標單片機所需的文件,不需要的文件用“;”屏蔽掉。
5)選擇接口,和選擇目標單片機所需文件方法一樣。
作為綜述類的研究,本文僅對國內(nèi)旅游者行為研究的發(fā)展脈絡(luò)及研究成果進行了述評,未來應(yīng)對國內(nèi)外旅游者行為研究的走向和側(cè)重點進行對比分析,發(fā)現(xiàn)國內(nèi)外旅游者行為研究的共性與個性,以探求旅游者行為研究的新動向與新領(lǐng)域。
6)校正時鐘頻率使用頻率計或者晶體振蕩器作為校正源。校正源的時鐘信號出現(xiàn)在STK5OO/AVRISP的MOSI引腳,或者JTAG ICE的TDI引腳。在接口文件的“.EQU CALIB_CLOCK_FREQ=XXXX”語句中來修改XXXX作為所需標稱頻率值。
7)指定用戶系統(tǒng)期望的頻率和精度。精度太高會可能校正失敗,需要參考數(shù)據(jù)手冊查看能達到的精度。
8)編譯工程生成hex二進制文件。
目前國內(nèi)生產(chǎn)的晶體振蕩器精度已經(jīng)具有較高精度,受溫度影響也非常小,一般都不需校正都能實現(xiàn)高精度的定時,但是相應(yīng)的成本會有所提高,在精度要求非常高的產(chǎn)品中可以考慮使用外接晶振方式。
(2)延時算法設(shè)計
1)自動重載補償
利用定時器O自動重載功能補償T1和T2其算法流程如圖3-1所示。定時/記數(shù)寄存器(TCNRO)初始化設(shè)定為256-t×fosc/n(t為特定定時時間,n為分頻數(shù),fosc為RC振蕩頻率)。當進入第一次中斷后就需要補償T1,T2,T3將TCNRO的初值設(shè)定為256-t×fosc/n+定時器重載值(該值等于(T1+T2)×fosc/n用于補償T1和T2的消耗)+設(shè)定初值所耗費的時鐘個數(shù)(用于補償T3的消耗)。重載記數(shù)值為定時器重載到設(shè)定初值這段時間內(nèi)的記數(shù)值。
以下是ATTINY 13定時器部分參考程序代碼,內(nèi)部RC振蕩頻率為4.8M,定時時間為O.O5S。值得一提的是:在此模式下的定時算法的定時精度跟TCNTO設(shè)定的值有關(guān)系,在振蕩頻率一定時TCNTO的值越小能定時時間越長精度越高。由于定時器記數(shù)器O為8位定時器,在振蕩頻率為4.8M采用1O24分頻的時候最大定時時間為54.4mS考慮定時計算方便和定時精度,參考程序折中選擇5OmS作為定時時間。還需注意的是:在有高級中斷產(chǎn)生時一定要保證運行完成高級中斷的時間小于單次規(guī)定的定時時間,否則會出現(xiàn)較大誤差。
就參考代碼而言如需要定時的時間大于5OmS,比如說1S定時,可以在進入中斷函數(shù)2O次后響應(yīng)一次任務(wù)代碼。
2)采用ATTINY 13的CTC模式重載立即定時
此模式下是將定時記數(shù)的最大值存放在定時比較寄存器(OCROA)當TCNTO的值與比較寄存器(OCROA)值相等時,如果相應(yīng)的中斷允許下就會產(chǎn)生中斷,TCNTO會立即清零、立即開始記數(shù)。在這種模式下產(chǎn)生的中斷不會產(chǎn)生T1、T2、T3誤差,定時精度基本上只取決與振蕩器。OCROA設(shè)置的值=t×fosc/n.
以下是ATTINY 13定時器部分參考程序,內(nèi)部RC振蕩器振蕩頻率為4.8M,定時時間為O.O5S。在此模式下定時值得注意的是:在有高級中斷產(chǎn)生是一定要保證運行完成高級中斷的時間小于OCROA規(guī)定的定時時間,否則會出現(xiàn)較大誤差。
就參考代碼而言如需要定時的時間大于5OmS,比如說1S定時,可以在進入中斷函數(shù)2O次后響應(yīng)一次任務(wù)代碼。
TCNTO=OXOO; //計數(shù)器從O開始記數(shù),自動重載值也為O
3)進一步調(diào)節(jié)
在以上算法的基礎(chǔ)上,為了進一步提高精確度,可以在進行這一步調(diào)節(jié)。在某一段時間tx內(nèi)如果定時誤差為±ter則沒當定時器定時為tx±ter時進行一次校正,在自動重載算法下TCNTO設(shè)置規(guī)則TCNTO=256-t×fosc/n±(tr×fosc),在CTC模式下將OCROA 的設(shè)定規(guī)則OCROA= t×fosc/n ±(tr×fosc)。
筆者通過上述算法采用avr芯片自帶的RC振蕩器做1S定時,9O分鐘時間內(nèi)定時器定時54O4S誤差4S精度達到O.O74%.當然還可對此定時精度做進一步調(diào)節(jié)提高定時精度。這種算法可用在動作延時、釋放延時、限時定時、重復(fù)循環(huán)定時延時繼電器中可以提高延時繼電器動作精度,減少繼電器成品體積,降低產(chǎn)品投入成本。當然也可以將此算法應(yīng)用到其他需要較高定時精度的用途。定時時間的調(diào)節(jié)只需要修改燒錄的程序,調(diào)節(jié)方便、靈活性好、實用性高。
[1]于正林,蘇成志.AVR單片機原理及應(yīng)用[M].國防工業(yè)出版社.
[2]沈文,Eagle Lee詹衛(wèi)前.AVR單片機C語言入門指導[M].清華大學出版社.
[3]Attiny 13用戶手冊[S].