關(guān)于STM32中RTC的校準(zhǔn)方法
按照AN2604.pdf描述的原理,RTC 的校準(zhǔn)值應(yīng)在0-127之間??蓪?shí)現(xiàn)的校準(zhǔn)誤差對(duì)應(yīng)為0-121ppm。相當(dāng)于每30天跑快的秒數(shù)為0-314s。
這里應(yīng)注意的一個(gè)關(guān)鍵問(wèn)題是,RTC只能對(duì)跑快進(jìn)行校準(zhǔn),不能對(duì)跑慢進(jìn)行校準(zhǔn)。如果手表晶振的標(biāo)稱頻率是32768Hz,設(shè)其可能的誤差范圍是±2Hz,則實(shí)際頻率會(huì)在32766Hz-32770Hz之間。如果RTC的內(nèi)部分頻系數(shù)設(shè)定為32768,則32768Hz是不需要校準(zhǔn)的頻率,32768Hz-32770Hz是可以校準(zhǔn)的頻率(最大校準(zhǔn)能力大概是32772Hz)。但是32766Hz-32768Hz的跑慢頻率段則無(wú)法實(shí)現(xiàn)校準(zhǔn)。為此,在推薦的校準(zhǔn)方法中,使用32766代替32768作為分頻系數(shù)。這樣一來(lái),32766Hz是不需要校準(zhǔn)的頻率,32766Hz-32770Hz是可以校準(zhǔn)的頻率范圍。
剩下的問(wèn)題是,如何測(cè)量誤差,并以此得出校準(zhǔn)值。一般來(lái)說(shuō)有兩種方法,一是測(cè)量TamperPin的頻率值,然后計(jì)算ppm誤差;二是實(shí)際運(yùn)行一定的天數(shù),與標(biāo)準(zhǔn)時(shí)鐘做對(duì)比,先得到每30天跑快的秒數(shù),然后計(jì)算ppm誤差。
AN2604.pdf,AN2821.pdf里都詳細(xì)描述了第一種方法。AN2821.zip則使用定時(shí)器T2對(duì)TamperPin的頻率值進(jìn)行自動(dòng)測(cè)量,實(shí)現(xiàn)了自動(dòng)校準(zhǔn)。自動(dòng)校準(zhǔn)確實(shí)簡(jiǎn)化了用戶操作,但是它要依賴于8MHz主時(shí)鐘的精度。自動(dòng)校準(zhǔn)不可能達(dá)到比8MHz主時(shí)鐘精度更高的結(jié)果。所以給用戶留有手動(dòng)校準(zhǔn)界面仍是萬(wàn)全之策。即使有自動(dòng)校準(zhǔn),也可以手動(dòng)、自動(dòng)疊加作用。
另一方面,使用第一種方法進(jìn)行校準(zhǔn),需要準(zhǔn)確測(cè)量TamperPin的頻率值,比如達(dá)到511.xxxHz的精度。普通示波器做不到這一點(diǎn),一般的頻率計(jì)也不行,高精度的頻率計(jì)才可以。只有搞計(jì)量的專業(yè)人士才會(huì)有這種設(shè)備。作為搞控制系統(tǒng)的人,搞一個(gè)非計(jì)量精度的時(shí)鐘,使用第一種方法還是有困難的。
第一種方法也好,第二種方法也罷,核心都是計(jì)算ppm誤差。我們先看一下第一種方法是如何計(jì)算ppm誤差的。由于使用了32766作為分頻系數(shù),因此32766Hz是不需要校準(zhǔn)的基準(zhǔn)頻率。不要把32768Hz看得太重,現(xiàn)在它啥也不是,32766Hz可看成新的標(biāo)稱頻率。TamperPin的頻率應(yīng)為32766Hz/64=511.968Hz。這也就是文檔中計(jì)算誤差時(shí)反復(fù)使用的基準(zhǔn)頻率。按照文檔中所舉的例子,若實(shí)測(cè)TamperPin的頻率為511.982Hz,則誤差為27.35ppm。計(jì)算過(guò)程為(511.982Hz-511.968Hz)/ 511.968Hz *10^6 = 27.35ppm。文檔最后給出最接近的校準(zhǔn)值為28。注意這里是最后的校準(zhǔn)值28,是由27 ppm查表得到的,而不是有些帖子中誤解的將27.35ppm近似成28ppm。
其實(shí)ppm誤差的計(jì)算公式為:ppm誤差=偏差/基準(zhǔn)值*10的6次方。據(jù)此,采用第二種方法時(shí),先得到了每30天跑快的秒數(shù)。這跑快的秒數(shù)就是偏差,而30天就是基準(zhǔn)值。所以ppm誤差=每30天跑快的秒數(shù)/(30天*24小時(shí)*3600秒)*10的6次方。用這個(gè)公式可以容易地解釋文檔AN2604.pdf中提到的“0.65ppm大約是每月誤差1.7秒”。因?yàn)椋?.7/(30*24*3600)*10^6 = 0.65ppm。
計(jì)算出了ppm誤差,還要解決查表。對(duì)文檔中給出的表格也不必看重。弄明白這個(gè)表格是怎么來(lái)的之后,可以使用簡(jiǎn)單的計(jì)算公式代替查表。AN2604.pdf中說(shuō),若校準(zhǔn)值為1,則RTC 校準(zhǔn)時(shí),每2的20次方個(gè)時(shí)鐘周期扣除1個(gè)時(shí)鐘脈沖。這相當(dāng)于0.954ppm(1/2^20*10^6 = 0.954)。而校準(zhǔn)值最大為127,所以最大可以減慢121ppm(0.954ppm*127 = 121)。所以這個(gè)校準(zhǔn)表就是由簡(jiǎn)單的乘除運(yùn)算得來(lái)的,當(dāng)然要使用浮點(diǎn)運(yùn)算才可以得到準(zhǔn)確結(jié)果。
以下是采用第二種方法實(shí)現(xiàn)的RTC 校準(zhǔn)程序。
首先定義了兩個(gè)常數(shù),一是PPM_PER_STEP,準(zhǔn)確到浮點(diǎn)數(shù)可表示的精度數(shù)0.9536743ppm。另一個(gè)是PPM_PER_SEC,即每30天快一秒對(duì)應(yīng)的ppm誤差,準(zhǔn)確到浮點(diǎn)數(shù)可表示的精度數(shù)0. 3858025ppm。
#define PPM_PER_STEP
#define PPM_PER_SEC
然后定義全局變量FastSecPer30days。通過(guò)用戶菜單設(shè)定并傳遞到RTC校準(zhǔn)程序里。
u16 FastSecPer30days = 117; //菜單輸入。117只用于演示。
實(shí)現(xiàn)的校準(zhǔn)函數(shù)為:
void RTC_Calibration(void)
{
}
//函數(shù)結(jié)束RTC_Calibration
評(píng)論