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