華大單片機(jī)有些型號(hào)帶有RTC功能模塊,提供秒、分、時(shí)、日、周、月、年的信息,每月的天數(shù)和閏年的天數(shù)可自動(dòng)調(diào)整。RTC時(shí)鐘模塊的時(shí)鐘源可以選用內(nèi)部低速時(shí)鐘、外部低速時(shí)鐘和外部高速時(shí)鐘。內(nèi)部低速時(shí)鐘全環(huán)境范圍(VCC = 1.8 ~ 5.5V,T AMB = -40 ~ 85°C)下精確度為正負(fù)5%,這種精度不能滿足計(jì)時(shí)時(shí)間要求嚴(yán)格的使用。用戶想要得到高精度的計(jì)時(shí)就必須使用外接晶振。使用外接晶振后并不是*可以*,只是降低了誤差,如果還想得到更高的精度還需要對(duì)RTC進(jìn)行補(bǔ)償。
補(bǔ)償原理說明與計(jì)算:
由于計(jì)數(shù)器采用 32.768KHz 的時(shí)鐘計(jì)數(shù),如果需要對(duì)每秒精度進(jìn)行補(bǔ)償時(shí),只能按照 32.768KHz 的整數(shù)周期補(bǔ)償,則每秒補(bǔ)償?shù)淖钚挝粸椋?/32768)*10 6 =30.5ppm,無法滿足高精度的要求。那么要在 32.768KHz 的計(jì)數(shù)時(shí)鐘下實(shí)現(xiàn)精度較高的時(shí)鐘補(bǔ)償時(shí),需要在算法上做調(diào)整,將補(bǔ)償周期擴(kuò)大 32 倍。則在只能補(bǔ)償?shù)淖钚挝粸?30.5ppm 的情況下,平均每秒的補(bǔ)償單位變?yōu)闉?30.5ppm/32=0.96ppm。滿足了精度較高的時(shí)鐘補(bǔ)償要求。而且補(bǔ)償發(fā)生在每 32 秒內(nèi)比較均勻的范圍內(nèi)。所以,該寄存器中引入了 5 位小數(shù)的設(shè)定。
設(shè)定值計(jì)算如下:
如果補(bǔ)償目標(biāo)值為 +20.6ppm,計(jì)算相應(yīng)的寄存器值如下:
如果補(bǔ)償目標(biāo)值為-20.6ppm,計(jì)算相應(yīng)的寄存器值如下:
補(bǔ)償代碼如下:
int16_t RTC_err; //一天內(nèi)誤差多少秒
float RTC_Value = 0;
RTC_Value=RTC_err/(24*60*60) *(1000000); //將誤差轉(zhuǎn)換為PPM
RTC_Value=RTC_Value*32768/1000000;
RTC_COM = Change_FloattoBin(RTC_Value); //取2的補(bǔ)碼
M0P_RTC->COMPEN_f.CR = RTC_COM;
uint16_t Change_FloattoBin(float data) //取2的補(bǔ)碼部分
{
float data1 = data;
uint16_t temp_data=0;
uint16_t temp_data1=0;
uint8_t i,data_inter;
if(data<0)
{
data=-data;
}
data_inter = (uint8_t)data;
data-=data_inter;
for(i=0;i<6;i++)
{
data = data*2;
if(data>=1)
{
data-=1;
temp_data|=1<<(5-i);
}
}
temp_data|=(data_inter<<6);
if(data1<0)
{
temp_data=~temp_data+1;
}
else
{
temp_data1=temp_data;
}
temp_data1=temp_data;
temp_data1>>=1;
temp_data1+=0x20;
temp_data1&=0x1ff;
return temp_data1;//取低9位補(bǔ)償值
}