摘 要: 基線PIC單片機多數都有內部振蕩器。對于時間敏感型應用,如果丟失內部振蕩器校準值,就必須對振蕩器進行重新校準。本文以PIC10F202為例,研究了一種基于異步串行通信原理,利用接收端的時鐘信號,對基線PIC單片機的內部振蕩器進行重新校準的方法。該方法簡單實用,不用設計復雜的外部電路,也不需要使用信號源、示波器或頻率計。實際測試表明,校準精度滿足出廠參數要求。此外,該方法還可在單片機的允許振蕩頻率范圍內將振蕩器頻率標定為某一特定頻率值。
關鍵詞: 基線PIC單片機;內部振蕩器;重新校準
0 引言
大部分基線PIC單片機都具有一個4 MHz或8 MHz的內部振蕩器,出廠時精度校準為±1%[1-6]。為保證單片機時鐘信號的精度,使用時應將出廠時內部時鐘振蕩器校準值(Internal Clock Oscillator Calibration Value)寫入振蕩器校準寄存器OSCCAL中。內部時鐘振蕩器校準值存放在單片機程序存儲器的最后一個單元中,在對器件擦除、編程、調試過程中,可能造成出廠校準值丟失。這種情況下,對于時間敏感型的應用,必須要對振蕩器進行重新校準。
在公開的文獻中有一種通過單片機內部定時/計數器測量外部輸入的標準時鐘信號周期實現對單片機內部振蕩器進行重新校準的方法[7]。這種方法需要設計一個外部振蕩電路及顯示電路,而且受基線PIC單片機較少的程序存儲器空間(如PIC10F200只有256個程序存儲單元)的限制,編寫該測試程序需要一定的技巧性,實現起來比較困難。另外,用4個LED實現的顯示電路,也存在著記錄數據麻煩、容易出錯,甚至需要輔助頻率計或示波器才能確認數據的問題。下面介紹一種基于單片機的校準方法,該方法編程簡單,不需要設計硬件電路,也不需要信號源、頻率計或示波器來對基線PIC單片機內部振蕩器進行重新校準。這種方法基于異步串行通信原理,利用接收端的時鐘信號實現(注:本文作者已經把該方法申請了發明專利,專利申請號:201410027051.3)。
1 內部振蕩器校準的依據
含有內部振蕩器的基線PIC單片機大多數都有一個振蕩器校準寄存器OSCCAL,這個寄存器的高7位是內部振蕩器的校準位,其最低位對于不同的單片機,有的定義為1/4振蕩頻率(INTOSC/4)輸出使能位,有的沒有定義。高7位校準位的取值范圍是0000000 ~ 1111111,與振蕩器輸出頻率的關系如圖1所示[1-6]。改變這7位的值,就能改變振蕩器輸出的頻率。
2 基于串口的重新校準方法
將需要重新校準內部振蕩器的單片機作為異步串行通信的發送端,計算機作為接收端。在設定的波特率和數據幀格式下,每改變一次寫入單片機校準寄存器OSCCAL的值,即每改變一次單片機內部振蕩器的振蕩頻率,就將特定字符0x55、0xAA以及當前OSCCAL寄存器中的值通過串口發送出去。當寫入校準寄存器OSCCAL的值讓單片機內部振蕩器工作頻率滿足通信波特率要求時,在接收端就能獲得所發送的特定字符0x55、0xAA和校準值。
根據異步串行通信原理,當一幀數據為10 bit時,理論上發送和接收波特率最大允許誤差是5%[8]。如果考慮到傳輸導線引起的信號畸變,實際上發送和接收波特率能夠允許的最大誤差要小于5%,在EIA-232標準中限定為4%[9]。因為測試時的傳輸導線很短,傳輸導線引起的誤差可以忽略。假定所用計算機的串口時鐘信號是精確的,則異步串行通信所允許的誤差,體現在測試過程中就是,當單片機以標稱頻率為中心的±4%頻率范圍內的多個頻率點發出數據時,在計算機端都能正確接收。因此,只要保證在連續改變單片機振蕩頻率時,是由小到大或由大到小順次變化的,則在計算機端能夠正確接收到的多組數據中的校準值(校準值是二進制補碼,見圖1)出現的次序也是由小到大或由大到小順次排列的。這些由小到大或由大到小順次排列的校準值所對應的單片機內部振蕩器工作頻率范圍是以標稱頻率為中心,-4% ~ +4%或+4% ~ -4%。顯然,這些能夠在計算機中正確接收,順次排列的多組數據中,中間那組數據里的最后一個數值就是找到的校準值。
3 重新校準方法的軟件設計
重新校準方法的程序設計主要是指單片機的程序設計,因為多數的基線PIC單片機沒有集成硬件串口組件,所以采用單片機I/O引腳通過軟件實現模擬串口。計算機端的串口調試助手軟件使用任何一款現成的串口調試軟件即可,不需要也沒必要自行編寫。
下面的程序設計是以PIC10F202為例,其他基線PIC單片機的程序設計與此類似。
3.1 主程序設計
在主程序中為方便測試,配置字的設置是missing image file引腳為主復位,代碼保護關閉,禁止看門狗。主程序流程圖如圖2所示,GP0引腳為模擬串口的發送引腳。因為OSCCAL寄存器的高7位才是校準位,所以OSCCAL寄存器的值每次加2才使內部振蕩器工作在下一個相鄰的頻率值。頻率值是由小到大順次改變的。
3.2 子程序的設計
串行口發送子程序流程圖如圖3所示。設計的通信波特率是9 600 b/s,則每發送一位數據的持續時間是missing image file。數據的幀格式是1 bit起始位、 8 bit數據位、1 bit停止位。
因為涉及到精確的串口發送時序,整個測試程序用匯編語言編寫,在MPLAB IDE V8.92下編譯,僅占用68個程序存儲單元和5 B數據存儲器。
4 測試數據及結果分析
4.1 測試流程
為了便于比較測試結果,測試的流程如下:首先,取一個全新的PIC10F202,通過PICkit 3讀出出廠校準值是0x16,并記錄下來;然后,將測試程序通過PICkit 3下載到這個PIC10F202中。在5.0 V工作電源下,將PIC10F202通過MAX232電平轉換模塊與計算機串口相連,在計算機中運行串口調試助手軟件,選擇相應的端口,設置與PIC10F202相同的波特率、幀格式,并設置接收顯示為十六進制模式,觀察接收到的數據,如圖4所示。在圖4中用橫線標出了顯示55、AA、XX(XX為當前頻率的校準值)的連續數據塊,校準值為0x02~0x2A,其中中間的0x16就是找到的標稱校準值。
4.2 實測數據
測試時采用一臺帶原生串口的DELL D400筆記本計算機(數據表中的計算機1)和一臺普通臺式計算機(數據表中的計算機2)。按上述測試流程將PIC10F202輸出的TTL電平轉換為RS232電平后與計算機原生串口相連。每臺計算機均隨機測試10次,獲得的測試數據如表1所示。表中14/16是指校準值是0x14或0x16,這是因為接收到的正確數據組數是偶數,所以取中間的兩個校準值中的任意一個。
為驗證基于串口的基線PIC單片機內部振蕩器的重新校準方法是否可以使用USB轉串口模塊代替原生串口,還對常用的CP2102和PL2303兩種USB轉串口模塊進行了測試。表2、表3分別是使用CP2102 USB轉串口模塊和PL2303 USB轉串口模塊隨機進行10次測試獲得的數據。
4.3 結果分析
由表1、表2、表3可知,使用原生串口,計算機1獲得的校準值與事先讀取的PIC10F202出廠校準值一致,都是0x16;計算機2獲得的10次隨機測試結果是0x14或0x16,如果取10次測試中出現次數多的值作為最終結果,則校準值為0x14。使用CP2102模塊,計算機1得到的校準值可取0x14或0x16;計算機2的校準值是0x14。使用PL2303模塊,計算機1獲得的校準值是0x18或0x1A,10次中出現次數多的是0x18;計算機2獲得的校準值也是0x18或0x1A,10次中出現次數多的同樣是0x18。為驗證獲得的校準值是否在允許精度范圍內,采用100 MHz示波器TDS 220,對標準校準值附近0x0C ~ 0x20范圍內的12個校準值的振蕩器輸出頻率進行了測量,結果如表4所示,其中INTOSC/4是用示波器測得的從PIC10F202的GP2引腳輸出的1/4內部振蕩頻率,INTOSC是計算值。
從表4可知,對于實驗所用的PIC10F202,校準值在0x10 ~ 0x18范圍內均滿足校準精度為±1%的出廠要求。出廠校準值0x16的輸出頻率與標稱振蕩頻率的誤差為0.5%。對于計算機1和計算機2,獲得校準值的振蕩頻率與標稱振蕩頻率的誤差分別是:使用原生串口為0.5%和0%;使用CP2102 USB轉串口模塊為0%或0.5%和0%;使用PL2303 USB轉串口模塊都是1%。因此,無論是使用原生串口還是USB轉串口模塊都能實現對基線PIC單片機內部振蕩器的重新校準,而且滿足校準精度±1%的要求。推薦使用計算機原生串口或CP2102模塊。由于條件所限沒有對其他USB轉串口模塊進行測試。
5 結束語
綜上所述,使用串口,利用異步串行通信接收端的時鐘信號進行基線PIC單片機內部振蕩器的重新校準方法,滿足校準精度的要求。該方法的新穎之處在于:既不需要構建外部電路,也不需要使用信號源、示波器或頻率計,只需編寫一個單片機內部的重新校準測試程序,使用計算機串口調試助手軟件及附加一個電平轉換電路模塊或常見的USB轉串口模塊即可實現。因此,在基線PIC單片機內部振蕩器的重新校準上具有廣泛的使用價值。另外,這種方法還可以將基線PIC單片機內部振蕩器的頻率在允許頻率范圍內重新標定為非出廠標稱頻率值。同時,可以推廣到其他具有內部振蕩器單片機的類似應用中。
參考文獻
[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微控制器的內部振蕩器的重新校準[J].電子設計技術,2008,15(8):100.
[8] 李朝青.PC機及單片機數據通信技術[M].北京:北京航空航天大學出版社,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.