貴州師范大學(xué) 李國龍
目前國內(nèi)用來定時的方法主要有以下幾種方法:
(1)RC電路的充、放電。這種電路定時精度較低、成品體積較大、調(diào)試比較麻煩。
(2)定時芯片。這種電路精度較高,靈活性差,通用性差。
(3)單片機(jī)做定時。這種電路實(shí)用性強(qiáng)、靈活性好、調(diào)試方便、定時范圍寬。但是算法設(shè)計是否科學(xué)將直接影響定時精度的高低,本文以產(chǎn)品成本和定時精度為考慮要素,折中選擇價格低廉具有制動重載功能和內(nèi)部振蕩器的ATTINY 13為例,通過改進(jìn)定時算法來提高定時精度。旨在實(shí)現(xiàn)低成本高精度的需求。
(1)振蕩器本身誤差
由圖2-1和圖2-2得知影響內(nèi)部RC振蕩器精度主要由ATTINY 13的工作電壓和工作溫度,而ATTNY13出廠時是在5v、25oC條件下校正的。為了能提高產(chǎn)品在任意溫度下的定時精度,就要知道產(chǎn)品工作電壓,和工作溫度然后對RC振蕩器校正,但是即便進(jìn)行校正后精度也不能太高,太高會導(dǎo)致校正失敗一般可以將精度校正到±1%.如果要使用更高精度定時,則推薦用無源晶振加非門做振蕩器,或者用有源晶振,這樣一來產(chǎn)品成本會有所提高。
(2)定時算法帶來誤差
傳統(tǒng)的定時算法大致會經(jīng)過如圖2-3所示。定時器溢出后,主程序可能正在執(zhí)行某條指令,執(zhí)行完這條指令需要的時間為T1,經(jīng)T1時間后可以響應(yīng)中斷,但在這個過程中可能會有比定時中斷更高級的中斷申請,如果有則執(zhí)行高級中斷,經(jīng)過T2后高級中斷結(jié)束進(jìn)入定時中斷,經(jīng)T3后定時器/計數(shù)器加載初值成功,開始啟動下一次定時。經(jīng)過以上分析得知T1和T2是隨機(jī)誤差,其值是不可預(yù)知,而T3是進(jìn)入定時中斷后裝載定時初值耗費(fèi)的時間,它的值是固定的。定時誤差為T1+T2+T3,如果能有效減小T1、T2就能達(dá)到減小誤差提高精度的目的。

(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中選擇目標(biāo)單片機(jī)所需的文件,不需要的文件用“;”屏蔽掉。
5)選擇接口,和選擇目標(biāo)單片機(jī)所需文件方法一樣。
作為綜述類的研究,本文僅對國內(nèi)旅游者行為研究的發(fā)展脈絡(luò)及研究成果進(jìn)行了述評,未來應(yīng)對國內(nèi)外旅游者行為研究的走向和側(cè)重點(diǎn)進(jìn)行對比分析,發(fā)現(xiàn)國內(nèi)外旅游者行為研究的共性與個性,以探求旅游者行為研究的新動向與新領(lǐng)域。
6)校正時鐘頻率使用頻率計或者晶體振蕩器作為校正源。校正源的時鐘信號出現(xiàn)在STK5OO/AVRISP的MOSI引腳,或者JTAG ICE的TDI引腳。在接口文件的“.EQU CALIB_CLOCK_FREQ=XXXX”語句中來修改XXXX作為所需標(biāo)稱頻率值。
7)指定用戶系統(tǒng)期望的頻率和精度。精度太高會可能校正失敗,需要參考數(shù)據(jù)手冊查看能達(dá)到的精度。
8)編譯工程生成hex二進(jìn)制文件。
目前國內(nèi)生產(chǎn)的晶體振蕩器精度已經(jīng)具有較高精度,受溫度影響也非常小,一般都不需校正都能實(shí)現(xiàn)高精度的定時,但是相應(yīng)的成本會有所提高,在精度要求非常高的產(chǎn)品中可以考慮使用外接晶振方式。
(2)延時算法設(shè)計
1)自動重載補(bǔ)償
利用定時器O自動重載功能補(bǔ)償T1和T2其算法流程如圖3-1所示。定時/記數(shù)寄存器(TCNRO)初始化設(shè)定為256-t×fosc/n(t為特定定時時間,n為分頻數(shù),fosc為RC振蕩頻率)。當(dāng)進(jìn)入第一次中斷后就需要補(bǔ)償T1,T2,T3將TCNRO的初值設(shè)定為256-t×fosc/n+定時器重載值(該值等于(T1+T2)×fosc/n用于補(bǔ)償T1和T2的消耗)+設(shè)定初值所耗費(fèi)的時鐘個數(shù)(用于補(bǔ)償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)生時一定要保證運(yùn)行完成高級中斷的時間小于單次規(guī)定的定時時間,否則會出現(xiàn)較大誤差。
就參考代碼而言如需要定時的時間大于5OmS,比如說1S定時,可以在進(jìn)入中斷函數(shù)2O次后響應(yīng)一次任務(wù)代碼。


2)采用ATTINY 13的CTC模式重載立即定時
此模式下是將定時記數(shù)的最大值存放在定時比較寄存器(OCROA)當(dāng)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)生是一定要保證運(yùn)行完成高級中斷的時間小于OCROA規(guī)定的定時時間,否則會出現(xiàn)較大誤差。
就參考代碼而言如需要定時的時間大于5OmS,比如說1S定時,可以在進(jìn)入中斷函數(shù)2O次后響應(yīng)一次任務(wù)代碼。
TCNTO=OXOO; //計數(shù)器從O開始記數(shù),自動重載值也為O

3)進(jìn)一步調(diào)節(jié)
在以上算法的基礎(chǔ)上,為了進(jìn)一步提高精確度,可以在進(jìn)行這一步調(diào)節(jié)。在某一段時間tx內(nèi)如果定時誤差為±ter則沒當(dāng)定時器定時為tx±ter時進(jìn)行一次校正,在自動重載算法下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精度達(dá)到O.O74%.當(dāng)然還可對此定時精度做進(jìn)一步調(diào)節(jié)提高定時精度。這種算法可用在動作延時、釋放延時、限時定時、重復(fù)循環(huán)定時延時繼電器中可以提高延時繼電器動作精度,減少繼電器成品體積,降低產(chǎn)品投入成本。當(dāng)然也可以將此算法應(yīng)用到其他需要較高定時精度的用途。定時時間的調(diào)節(jié)只需要修改燒錄的程序,調(diào)節(jié)方便、靈活性好、實(shí)用性高。
[1]于正林,蘇成志.AVR單片機(jī)原理及應(yīng)用[M].國防工業(yè)出版社.
[2]沈文,Eagle Lee詹衛(wèi)前.AVR單片機(jī)C語言入門指導(dǎo)[M].清華大學(xué)出版社.
[3]Attiny 13用戶手冊[S].