摘 要: 基線PIC單片機多數(shù)都有內(nèi)部振蕩器。對于時間敏感型應(yīng)用,如果丟失內(nèi)部振蕩器校準值,就必須對振蕩器進行重新校準。本文以PIC10F202為例,研究了一種基于異步串行通信原理,利用接收端的時鐘信號,對基線PIC單片機的內(nèi)部振蕩器進行重新校準的方法。該方法簡單實用,不用設(shè)計復(fù)雜的外部電路,也不需要使用信號源、示波器或頻率計。實際測試表明,校準精度滿足出廠參數(shù)要求。此外,該方法還可在單片機的允許振蕩頻率范圍內(nèi)將振蕩器頻率標定為某一特定頻率值。
關(guān)鍵詞: 基線PIC單片機;內(nèi)部振蕩器;重新校準
0 引言
大部分基線PIC單片機都具有一個4 MHz或8 MHz的內(nèi)部振蕩器,出廠時精度校準為±1%[1-6]。為保證單片機時鐘信號的精度,使用時應(yīng)將出廠時內(nèi)部時鐘振蕩器校準值(Internal Clock Oscillator Calibration Value)寫入振蕩器校準寄存器OSCCAL中。內(nèi)部時鐘振蕩器校準值存放在單片機程序存儲器的最后一個單元中,在對器件擦除、編程、調(diào)試過程中,可能造成出廠校準值丟失。這種情況下,對于時間敏感型的應(yīng)用,必須要對振蕩器進行重新校準。
在公開的文獻中有一種通過單片機內(nèi)部定時/計數(shù)器測量外部輸入的標準時鐘信號周期實現(xiàn)對單片機內(nèi)部振蕩器進行重新校準的方法[7]。這種方法需要設(shè)計一個外部振蕩電路及顯示電路,而且受基線PIC單片機較少的程序存儲器空間(如PIC10F200只有256個程序存儲單元)的限制,編寫該測試程序需要一定的技巧性,實現(xiàn)起來比較困難。另外,用4個LED實現(xiàn)的顯示電路,也存在著記錄數(shù)據(jù)麻煩、容易出錯,甚至需要輔助頻率計或示波器才能確認數(shù)據(jù)的問題。下面介紹一種基于單片機的校準方法,該方法編程簡單,不需要設(shè)計硬件電路,也不需要信號源、頻率計或示波器來對基線PIC單片機內(nèi)部振蕩器進行重新校準。這種方法基于異步串行通信原理,利用接收端的時鐘信號實現(xiàn)(注:本文作者已經(jīng)把該方法申請了發(fā)明專利,專利申請?zhí)枺?01410027051.3)。
1 內(nèi)部振蕩器校準的依據(jù)
含有內(nèi)部振蕩器的基線PIC單片機大多數(shù)都有一個振蕩器校準寄存器OSCCAL,這個寄存器的高7位是內(nèi)部振蕩器的校準位,其最低位對于不同的單片機,有的定義為1/4振蕩頻率(INTOSC/4)輸出使能位,有的沒有定義。高7位校準位的取值范圍是0000000 ~ 1111111,與振蕩器輸出頻率的關(guān)系如圖1所示[1-6]。改變這7位的值,就能改變振蕩器輸出的頻率。

2 基于串口的重新校準方法
將需要重新校準內(nèi)部振蕩器的單片機作為異步串行通信的發(fā)送端,計算機作為接收端。在設(shè)定的波特率和數(shù)據(jù)幀格式下,每改變一次寫入單片機校準寄存器OSCCAL的值,即每改變一次單片機內(nèi)部振蕩器的振蕩頻率,就將特定字符0x55、0xAA以及當前OSCCAL寄存器中的值通過串口發(fā)送出去。當寫入校準寄存器OSCCAL的值讓單片機內(nèi)部振蕩器工作頻率滿足通信波特率要求時,在接收端就能獲得所發(fā)送的特定字符0x55、0xAA和校準值。
根據(jù)異步串行通信原理,當一幀數(shù)據(jù)為10 bit時,理論上發(fā)送和接收波特率最大允許誤差是5%[8]。如果考慮到傳輸導(dǎo)線引起的信號畸變,實際上發(fā)送和接收波特率能夠允許的最大誤差要小于5%,在EIA-232標準中限定為4%[9]。因為測試時的傳輸導(dǎo)線很短,傳輸導(dǎo)線引起的誤差可以忽略。假定所用計算機的串口時鐘信號是精確的,則異步串行通信所允許的誤差,體現(xiàn)在測試過程中就是,當單片機以標稱頻率為中心的±4%頻率范圍內(nèi)的多個頻率點發(fā)出數(shù)據(jù)時,在計算機端都能正確接收。因此,只要保證在連續(xù)改變單片機振蕩頻率時,是由小到大或由大到小順次變化的,則在計算機端能夠正確接收到的多組數(shù)據(jù)中的校準值(校準值是二進制補碼,見圖1)出現(xiàn)的次序也是由小到大或由大到小順次排列的。這些由小到大或由大到小順次排列的校準值所對應(yīng)的單片機內(nèi)部振蕩器工作頻率范圍是以標稱頻率為中心,-4% ~ +4%或+4% ~ -4%。顯然,這些能夠在計算機中正確接收,順次排列的多組數(shù)據(jù)中,中間那組數(shù)據(jù)里的最后一個數(shù)值就是找到的校準值。
3 重新校準方法的軟件設(shè)計
重新校準方法的程序設(shè)計主要是指單片機的程序設(shè)計,因為多數(shù)的基線PIC單片機沒有集成硬件串口組件,所以采用單片機I/O引腳通過軟件實現(xiàn)模擬串口。計算機端的串口調(diào)試助手軟件使用任何一款現(xiàn)成的串口調(diào)試軟件即可,不需要也沒必要自行編寫。
下面的程序設(shè)計是以PIC10F202為例,其他基線PIC單片機的程序設(shè)計與此類似。
3.1 主程序設(shè)計

在主程序中為方便測試,配置字的設(shè)置是missing image file引腳為主復(fù)位,代碼保護關(guān)閉,禁止看門狗。主程序流程圖如圖2所示,GP0引腳為模擬串口的發(fā)送引腳。因為OSCCAL寄存器的高7位才是校準位,所以O(shè)SCCAL寄存器的值每次加2才使內(nèi)部振蕩器工作在下一個相鄰的頻率值。頻率值是由小到大順次改變的。
3.2 子程序的設(shè)計

串行口發(fā)送子程序流程圖如圖3所示。設(shè)計的通信波特率是9 600 b/s,則每發(fā)送一位數(shù)據(jù)的持續(xù)時間是missing image file。數(shù)據(jù)的幀格式是1 bit起始位、 8 bit數(shù)據(jù)位、1 bit停止位。
因為涉及到精確的串口發(fā)送時序,整個測試程序用匯編語言編寫,在MPLAB IDE V8.92下編譯,僅占用68個程序存儲單元和5 B數(shù)據(jù)存儲器。
4 測試數(shù)據(jù)及結(jié)果分析
4.1 測試流程
為了便于比較測試結(jié)果,測試的流程如下:首先,取一個全新的PIC10F202,通過PICkit 3讀出出廠校準值是0x16,并記錄下來;然后,將測試程序通過PICkit 3下載到這個PIC10F202中。在5.0 V工作電源下,將PIC10F202通過MAX232電平轉(zhuǎn)換模塊與計算機串口相連,在計算機中運行串口調(diào)試助手軟件,選擇相應(yīng)的端口,設(shè)置與PIC10F202相同的波特率、幀格式,并設(shè)置接收顯示為十六進制模式,觀察接收到的數(shù)據(jù),如圖4所示。在圖4中用橫線標出了顯示55、AA、XX(XX為當前頻率的校準值)的連續(xù)數(shù)據(jù)塊,校準值為0x02~0x2A,其中中間的0x16就是找到的標稱校準值。

4.2 實測數(shù)據(jù)
測試時采用一臺帶原生串口的DELL D400筆記本計算機(數(shù)據(jù)表中的計算機1)和一臺普通臺式計算機(數(shù)據(jù)表中的計算機2)。按上述測試流程將PIC10F202輸出的TTL電平轉(zhuǎn)換為RS232電平后與計算機原生串口相連。每臺計算機均隨機測試10次,獲得的測試數(shù)據(jù)如表1所示。表中14/16是指校準值是0x14或0x16,這是因為接收到的正確數(shù)據(jù)組數(shù)是偶數(shù),所以取中間的兩個校準值中的任意一個。

為驗證基于串口的基線PIC單片機內(nèi)部振蕩器的重新校準方法是否可以使用USB轉(zhuǎn)串口模塊代替原生串口,還對常用的CP2102和PL2303兩種USB轉(zhuǎn)串口模塊進行了測試。表2、表3分別是使用CP2102 USB轉(zhuǎn)串口模塊和PL2303 USB轉(zhuǎn)串口模塊隨機進行10次測試獲得的數(shù)據(jù)。
4.3 結(jié)果分析
由表1、表2、表3可知,使用原生串口,計算機1獲得的校準值與事先讀取的PIC10F202出廠校準值一致,都是0x16;計算機2獲得的10次隨機測試結(jié)果是0x14或0x16,如果取10次測試中出現(xiàn)次數(shù)多的值作為最終結(jié)果,則校準值為0x14。使用CP2102模塊,計算機1得到的校準值可取0x14或0x16;計算機2的校準值是0x14。使用PL2303模塊,計算機1獲得的校準值是0x18或0x1A,10次中出現(xiàn)次數(shù)多的是0x18;計算機2獲得的校準值也是0x18或0x1A,10次中出現(xiàn)次數(shù)多的同樣是0x18。為驗證獲得的校準值是否在允許精度范圍內(nèi),采用100 MHz示波器TDS 220,對標準校準值附近0x0C ~ 0x20范圍內(nèi)的12個校準值的振蕩器輸出頻率進行了測量,結(jié)果如表4所示,其中INTOSC/4是用示波器測得的從PIC10F202的GP2引腳輸出的1/4內(nèi)部振蕩頻率,INTOSC是計算值。

從表4可知,對于實驗所用的PIC10F202,校準值在0x10 ~ 0x18范圍內(nèi)均滿足校準精度為±1%的出廠要求。出廠校準值0x16的輸出頻率與標稱振蕩頻率的誤差為0.5%。對于計算機1和計算機2,獲得校準值的振蕩頻率與標稱振蕩頻率的誤差分別是:使用原生串口為0.5%和0%;使用CP2102 USB轉(zhuǎn)串口模塊為0%或0.5%和0%;使用PL2303 USB轉(zhuǎn)串口模塊都是1%。因此,無論是使用原生串口還是USB轉(zhuǎn)串口模塊都能實現(xiàn)對基線PIC單片機內(nèi)部振蕩器的重新校準,而且滿足校準精度±1%的要求。推薦使用計算機原生串口或CP2102模塊。由于條件所限沒有對其他USB轉(zhuǎn)串口模塊進行測試。
5 結(jié)束語
綜上所述,使用串口,利用異步串行通信接收端的時鐘信號進行基線PIC單片機內(nèi)部振蕩器的重新校準方法,滿足校準精度的要求。該方法的新穎之處在于:既不需要構(gòu)建外部電路,也不需要使用信號源、示波器或頻率計,只需編寫一個單片機內(nèi)部的重新校準測試程序,使用計算機串口調(diào)試助手軟件及附加一個電平轉(zhuǎn)換電路模塊或常見的USB轉(zhuǎn)串口模塊即可實現(xiàn)。因此,在基線PIC單片機內(nèi)部振蕩器的重新校準上具有廣泛的使用價值。另外,這種方法還可以將基線PIC單片機內(nèi)部振蕩器的頻率在允許頻率范圍內(nèi)重新標定為非出廠標稱頻率值。同時,可以推廣到其他具有內(nèi)部振蕩器單片機的類似應(yīng)用中。
參考文獻
[1] Microchip Technology Inc.PIC10F200/202/204/206 6-Pin, 8-Bit Flash Microcontrollers Data .http://ww1.microchip.com/downloads/en/DeviceDoc/40001239E.pdf.
[2] Microchip Technology Inc.PIC10F220/222 6-Pin, 8-Bit Flash Microcontrollers Data Sheet[EB/OL].[2014-02-16].http://ww1.microchip.com/downloads/en/DeviceDoc/41270E.pdf.
[3] Microchip Technology Inc.PIC12F508/509/16F505 8/14-Pin, 8-Bit Flash Microcontrollers [2014016].http://ww1.microchip.com/downloads/en/DeviceDoc/41236E.pdf.
[4] Microchip Technology Inc.PIC12F510/16F506 8/14-Pin, 8-Bit Flash Microcontroller Data Sheet[EB/OL].[2014-0216].http://ww1.microchip.com/downloads/en/DeviceDoc/41268D.pdf.
[5] Microchip Technology Inc. PIC12F519 8-Pin, 8-Bit Flash Microcontroller Data Sheet[EB/OL].[2014-02-16].http://ww1.microchip.com/downloads/en/DeviceDoc/41319B.pdf.
[6] Microchi[20140216].http://ww1.microchip.com/downloads/en/DeviceDoc/40001652B.pdf.
[7] Benabadji N.基線PIC微控制器的內(nèi)部振蕩器的重新校準[J].電子設(shè)計技術(shù),2008,15(8):100.
[8] 李朝青.PC機及單片機數(shù)據(jù)通信技術(shù)[M].北京:北京航空航天大學(xué)出版社,2001.
[9] ANSI/TIA/EIA-232-F-1997. Interface between data terminal equipment and data circuit-terminating equipment employing serial binary data interchange[S].1997.
