MC9S08MG64是飛思卡爾半導體針對國網單相電表推出的一款半SoC芯片,它集成了片上液晶驅動器和實時時鐘模塊,以及多種通訊接口。用于智能電表設計時,配合外部電能計量芯片,即可完成性價比良好的單相電表設計。此單片機內部集成的實時時鐘模塊(iRTC) 具有時間保持和日歷功能。對由晶體本身的頻偏及溫度漂移引起的誤差,可以利用實時時鐘本身的補償功能進行修正。本文討論如何對實時時鐘進行校準和補償,以達到國網要求的標準(誤差小于5ppm)。
晶體的特性
1.1 負載電容的影響
一般說來晶體的振蕩頻率是很穩定的,但我們也知道晶體的振蕩頻率受負載電容和溫度變化的影響。如下圖所示的例子為一個負載電容為12.5pF的晶體,當負載電容變化時其振蕩頻率偏差的隨動特性
振蕩電路匹配電容的離散性和溫度漂移,電路板的分布電容都會對振蕩頻率造成影響。對于MC9S08MG64,使用32.768kHz晶體時其振蕩器可以有兩種配置。當使用低功耗模式(RANG = 0, HGO = 0)時,負載電容、反饋電阻、和串行電阻已經集成在單片機內部了,外面只需加晶體即可。這種配置的功耗比較低,且可以抵消上述誤差因素的影響。當使用高增益模式(RANG = 0,HGO = 1)時,外部要加負載電容、反饋和串行電阻。這種配置的抗干擾能力比較強,但外部元器件對振蕩頻率的精確性存在影響。對于負載電容引起的頻率漂移,我們可以通過選用溫漂系數小的電容(如COG電容)來減小其影響。
1.2 溫漂
上圖是音叉型的晶體振蕩頻率隨溫度變化的曲線,它可以用拋物線方程描述為:
Fdev = B (T - TQ)2 + K
其中:
由以上分析可見,對于一個晶體振蕩電路,影響其振蕩頻率誤差的因素有:
負載電容
晶體在轉折溫度點的頻率偏差K
溫漂Fdev
因此,要使iRTC精確計時,必須消除以上因素帶來的誤差。負載電容可以通過振蕩電路元器件的選擇來保證。而后兩項則必須通過軟件的辦法來校準和補償。
2 實時時鐘的補償原理
實時時鐘使用外部的32768Hz 振蕩時鐘經由32768分頻產生秒脈沖。寄存器IRTC_COMPEN用來對補償進行配置;這包括補償的時間間隔(compensation interval) 和補償值(compensation value) 。補償電路根據配置在固定的時間間隔內(compensation interval)增加或減少振蕩周期。
補償間隔和補償值寄存器
補償間隔(compensation interval)是無符號整數,取值范圍是1-255 秒;補償值(compensation value)的取值范圍是-128 to 127。增加或減少一個振蕩周期將會產生±30.5ppm(1/32768)的頻率偏移,所以此補償電路具有0.119ppm(interval = 255,value = 1)到3906ppm(interval = 1, value = -128)的補償能力。如果補償間隔(compensation interval)或補償值(compensation value)之一設置為0將禁止補償功能。
實時時鐘模塊在補償周期的第一秒進行補償。根據補償寄存器設置對第一秒鐘增加或減少相應的振蕩周期(compensation value),其它的秒脈沖輸出保持不變。從而導致秒脈沖之間的時長不同,但從長時間來看時間精度因得到補償而大為提高。
MG64的實時時鐘模塊(iRTC)可以配置為在引腳RTCCLKOUT輸出補償后的秒脈沖。圖2-1說明了引腳RTCCLKOUT 輸出秒脈沖的情況。秒脈沖的高電平時長為一個時鐘振蕩周期(1/32768 秒)。
在沒有啟動補償的情況下,每個秒脈沖的周期都是T(包含32768個時鐘振蕩)。如果啟動補償并設置補償間隔為M,補償值為V,那么在每個補償周期(M秒內),第一個秒脈沖周期會增加或減少V個時鐘振蕩,變為32768 ±V個時鐘振蕩。第一個秒脈沖的長度與其它秒脈沖長度不同。
在圖2-1中,補償間隔為M,補償值為V。
T= 32768 個振蕩周期
Tcomp+/- =(32768 ± |V|)個振蕩周期
由補償值決定,第一秒鐘(Tcomp)被減少或增加|V| 個振蕩周期。其它的秒脈沖時長仍然是32768 個振蕩周期。
補償間隔和補償值的選擇可以根據晶體的誤差和需要的補償精度來決定。
表1中的例子說明如何根據補償誤差最小化來選擇補償間隔和補償值。
表2列出了當晶體的誤差為-2ppm ,不同補償間隔的補償值及補償后的誤差。根據公式2為不同的補償間隔計算補償值;根據公式3可以計算出各補償間隔和補償值組合補償之后的誤差。最佳補償間隔(61)和補償值(-4)是根據補償后誤差最小而選取的。
公式1用來計算引入誤差后的晶體振蕩周期,它可以由晶體的誤差定義CrystalError = Δf/f推導得出。晶體誤差一般用ppm表示,注意量綱的換算。
在實際的應用中,我們可以根據需要的補償精度來選擇補償間隔和補償值。最大補償間隔可以根據實際情況確定。例如如果每分鐘都要高精度輸出,那么補償間隔可以設置為60。
下圖為根據上述方法選取一些溫度點做補償的實驗結果。Fdev為補償之前的頻率偏差, Fcalib為補償之后的頻率偏差。從實驗數據可見,使用正確的補償間隔和補償值,MC9S08MG64的iRTC的精度完全可以控制在2ppm以內。
3 實時時鐘的溫度補償
上面討論了在一個固定的溫度下如何做時鐘的補償及其原理,現在我們討論在溫度變化的情況下如何做時鐘的自動補償。如前所述,晶體的頻率偏差可以用拋物線方程來描述,如果我們確定出拋物線,那么就可以通過溫度(溫度的測量可以用集成溫度傳感器或NTC電阻來完成)來確定出頻率偏差從而對其進行補償。比較常用的一種方法就是測出一些點然后用最小二乘法擬合。簡要描述如下:
由一些已知點擬合拋物線方程:
已知點:(X1,Y1), (X2,Y2), (X3,Y3) … (Xn,Yn)。
確定拋物線方程y=ax2 + bx + c 的系數。
最小二乘法:
至少需要三個點來確定此拋物線。
晶振典型溫漂曲線形式如下:
y = a(x-t)2 + k = ax2 - 2atx + at2 + k
對于同一個型號的晶體,假定拋物線二次系數不變,可由公式(2)(3)求得b c,然后得出t, k。從而實現兩點校正。由于拋物線越遠離頂點變化率越大,所以在拋物線的兩端進行校正可以得到更好的補償精度。
t = -b/2a
k = c - b2/4a
如果晶體的一致性比較好,系數a和t偏差不大,可以只對系數k進行標定。即單點校正。
4 使用FTM 模塊產生秒脈沖
在一些應用中,實時時鐘輸出的秒脈沖需要用光耦隔離。過窄的時鐘脈沖難以通過低速光耦。在這一節中,將討論一種使用FTM 模塊來校正實時時鐘iRTC輸出的秒脈沖的方法。校正后的秒脈沖將具有:
更高的精度(每個秒脈沖)
50% 的占空比
4.1 以RTCCLKOUT做時鐘源產生秒脈沖
在上述討論的實時時鐘(iRTC)的校準方法中,RTCCLKOUT時鐘在長的時間內精度得到了保證。在圖2-1中可以看到,由于補償間隔是M(M》1)秒,補償間隔內的第一秒長度和其它秒長度是不一樣的,因為第一秒包含了補償時間。如果我們能把此補償時間平均分配到補償間隔內的每一秒鐘,使每一秒的長度相等(每一秒都得到補償),那么我們將得到均勻的高精度秒脈沖輸出。
單片機中的程序計算補償間隔內每一秒的補償時間并對每一秒進行補償。如果補償間隔是M,補償值是N,那么每一秒鐘的補償值就是N/(32768 ×M)秒。N/(32768×M)可能是一個很小的值,因此我們需要一個高精度的時鐘來得到高分辨率(精度)。
在此方案中我們使用總線時鐘(bus clock),該總線時鐘由外部的32768Hz 晶體(XOSC1)組成的振蕩器產生參考頻率,然后經由片內倍頻電路鎖頻環(FLL)倍頻獲得。鎖頻環(FLL) 和實時時鐘(iRTC)共用同一外部振蕩源。鎖頻環(FLL)的倍頻系數設置為512,所以總線頻率最大為16.78MHz(512×32768)。每一秒的補償時間為(512×N)/M 總線時鐘周期,它消除掉了溫度和晶體老化的影響。
從圖2-1(補償后的實時時鐘秒脈沖輸出)中我們可以看出,當前補償周期的最后一個時鐘沿就是下一個補償周期的第一個時鐘沿。用第一個時鐘沿做對齊,實時時鐘的補償精度得到繼承(上升沿和下降沿都可以用來做對齊;由軟件來設定)。
MC9S08GW64 的FTM模塊的每個通道可以單獨工作在輸入捕捉或者輸出比較模式。我們可以使用一個FTM模塊的兩個通道,其中的一個通道來捕捉iRTC輸出的窄脈沖,另一個通道輸出50%占空比的秒脈沖。
當 FTM模塊的通道1捕捉IRTCCLKOUT的上升沿(或下降沿)時使用總線時鐘,在FTMCH1中斷觸發后保存FTM計數器的捕獲值到FTMCH1V。在FTMCH1中斷程序中,FTMCH0被設置為輸出比較模式,輸出比較值設置為FTMCH1V加一個偏移Ф。Ф為一個常量加每一個脈沖周期的調整值。表3列出了IRTCCLKOUT和FTM輸出邊沿的上升時刻,以及兩者的脈沖寬度。
表3 IRTCCLKOUT 和FTM 輸出時序
TAVG = V ÷ M(晶體振蕩周期)
= 512 × V ÷ M(總線時鐘周期)
從表3可以看出,RTCCLKOUT先右移了σ。每一個秒脈沖用平均的補償值進行補償。
圖4-1和圖4-2對這種補償方法做了詳細地說明。圖4-1演示了加入一些振蕩周期的情形。
在圖4-1中:
圖4-2 說明了減少一些振蕩周期的情形。
圖4-2:
偏移量 σ(延遲)有兩個作用:
對實時時鐘iRTC 輸出進行移相;每個秒脈沖的補償都基于這個值
有足夠的時間處理FTMCH1中斷
每一個秒脈沖的補償時間都被加上σ,在例程中σ 被設置為0x8000,在總線時鐘為32768 ×512Hz時這相當于1.9ms。σ值的大小取決于補償間隔(compensation period)和補償值(compensation value)。
0 《 σ - (M-1)(512 × V/M) 《 0xFFFF
-128 《 V 《 127
一般來講,當溫度變化時晶體的誤差總是負的,所以σ 可以設置為一個比較小的值,比如0x2000,0x1000,補償的范圍得以增大。
FTMCH0設置為輸出比較模式(匹配時設置輸出為高),當FTM 計數器的值和FTMCH0V 寄存器的值匹配時FTMCH0引腳被置高,FTMCH0中斷被觸發。FTM 設置為128分頻,0.5秒后FTMCH0輸出變低。當輸出變低時FTM的分頻比設置為1。
4.2 硬件配置和例程
MCU的串口SCI0用來和PC通訊,在PC端可以使用超級終端。IIC用來讀取集成溫度傳感器LM75B的數值。ADC模塊讀取NTC和電阻的分壓。RTCCLKOUT (Pin20) 連接至FTMCH1 (pin 38)。1Hz秒脈沖FTMCH0 pin (Pin37)通過光耦隔離后輸出,可以在校表臺上測量。例程是用CodeWarrior 6.3 IDE開發的。
電路板上電后會進入自動補償模式,根據環境溫度的變化對實時時鐘進行補償。在超級終端中按任意鍵退出自動補償模式,然后輸入命令help可以顯示所有可用的命令:
comp 顯示當前的補償間隔和補償值,并輸入新值。
temp 顯示溫度。
date 顯示日期并輸入新日期。
time 顯示時間并輸入新時間。
auto 重新進入自動補償模式。
在FTMCH1的中斷服務程序中,做FTMCH0輸出比較時間的調整。如果當前補償周期結束,它會檢查有沒有新的補償間隔和補償值。如果有則把新值載入補償寄存器,并重新計算補償調整值。
在補償周期結束前,IRTC_STATUS 寄存器中的C_DON (IRTC_STATUS_L_C_DON) 會被置位。它被用來對齊補償周期。
實時時鐘iRTC的補償機制可以在長時間內(》補償間隔)輸出高精度的秒脈沖,FTM則用來保證在補償間隔之內每個秒脈沖周期相等。
說明
當開發GW64工程時,推薦在iRTC的初始化中禁止掉iRTC中斷,或者定義iRTC中斷服務程序。因為即使當下載一個新程序時,iRTC模塊仍然保留著上一次的配置(iRTC可以由VBAT供電,MCU掉電時,iRTC的配置仍然保留)。在初始化時必須禁止掉iRTC中斷,或者定義其中斷服務程序。否則可能發生不可預期的錯誤。
5 補償流程
使用上述軟件,我們可以不用關心補償算法的細節,按照下面的簡單步驟來完成晶體振蕩電路在全溫度范圍內的自動補償:
(1) 把補償間隔和補償值設置為0(Interval = 0, Value = 0),在全工作溫度范圍內調整溫度并記錄頻率偏差值。測量點越多越好。
(2) 利用測量點擬合拋物線(a(x - t)2 + k),得出拋物線參數a, t, k。
(3) 把參數寫入程序中。
對于同一批次的晶體,如果晶體的一致性比較好,可以用上面的步驟確定出參數a,和t。在批量生產時,在任意一個溫度點測量晶體的誤差,即可反推出k。其他溫度點的誤差即可通過拋物線公式計算得出,根據誤差查表得到需要的補償間隔和補償值。把補償間隔和補償值寫入補償寄存器即可得到精確的秒脈沖輸出。參數a, t和k 都要保存在非易失性存儲器中以防掉電丟失。
6 總結
本文介紹了實時時鐘iRTC的補償機制和如何輸出均勻秒脈沖的問題,探討了如何在全溫度范圍內對iRTC進行補償。iRTC可以在長時間內保持高精度,FTM模塊用來輸出每個周期都很均勻的秒脈沖。在全溫度范圍內的補償精度依賴于晶體的一致性,建議采用高精度,一致性好的晶體。溫度測量器件基于成本考慮建議采用NTC電阻,根據測量值用查找表來確定溫度,NTC電阻應盡量靠近晶體。MG64有一個內部溫度傳感器,通過標定也可以達到比較高的測溫精度,使用它可以進一步降低系統的硬件成本。
評論
查看更多