您的位置 首页 制造

关于STM32中RTC的校准办法

实现RTC校准的核心之一是库文件Stm321f0x_bkpc中的voidBKP_SetRTCCalibrationValue(uint8_tCalibrationValue)函数。谈到RTC校准

完成RTC 校准的中心之一是库文件Stm321f0x_bkp.c中的void BKP_SetRTCCalibrationValue (uint8_t CalibrationValue) 函数。谈到RTC校准的相关参阅文档包含AN2604.pdf,AN2821.pdf和AN2821.zip。这三个文档都能够从STM32官方网站下载。

依照AN2604.pdf描绘的原理,RTC 的校准值应在0-127之间。可完成的校准差错对应为0-121ppm。相当于每30天跑快的秒数为0-314s。

这儿应留意的一个要害问题是,RTC只能对跑快进行校准,不能对跑慢进行校准。假如手表晶振的标称频率是32768Hz,设其或许的差错规模是±2Hz,则实践频率会在32766Hz-32770Hz之间。假如RTC的内部分频系数设定为32768,则32768Hz是不需求校准的频率,32768Hz-32770Hz是能够校准的频率(最大校准才能大概是32772Hz)。可是32766Hz-32768Hz的跑慢频率段则无法完成校准。为此,在引荐的校准办法中,运用32766替代32768作为分频系数。这样一来,32766Hz是不需求校准的频率,32766Hz-32770Hz是能够校准的频率规模。

剩余的问题是,怎样丈量差错,并以此得出校准值。一般来说有两种办法,一是丈量TamperPin的频率值,然后核算ppm差错;二是实践运转必定的天数,与规范时钟做比照,先得到每30天跑快的秒数,然后核算ppm差错。

AN2604.pdf,AN2821.pdf里都详细描绘了榜首种办法。AN2821.zip则运用定时器T2对TamperPin的频率值进行主动丈量,完成了主动校准。主动校准的确简化了用户操作,可是它要依赖于8MHz主时钟的精度。主动校准不或许到达比8MHz主时钟精度更高的成果。所以给用户留有手动校准界面仍是万全之策。即便有主动校准,也能够手动、主动叠加效果。

另一方面,运用榜首种办法进行校准,需求精确丈量TamperPin的频率值,比方到达511.xxxHz的精度。一般示波器做不到这一点,一般的频率计也不可,高精度的频率计才能够。只要搞计量的专业人士才会有这种设备。作为搞控制系统的人,搞一个非计量精度的时钟,运用榜首种办法仍是有困难的。

榜首种办法也好,第二种办法也罢,中心都是核算ppm差错。咱们先看一下榜首种办法是怎样核算ppm差错的。由于运用了32766作为分频系数,因而32766Hz是不需求校准的基准频率。不要把32768Hz看得太重,现在它啥也不是,32766Hz可当作新的标称频率。TamperPin的频率应为32766Hz/64=511.968Hz。这也便是文档中核算差错时重复运用的基准频率。依照文档中所举的比如,若实测TamperPin的频率为511.982Hz,则差错为27.35ppm。核算进程为(511.982Hz-511.968Hz)/ 511.968Hz *10^6 = 27.35ppm。文档最终给出最接近的校准值为28。留意这儿是最终的校准值28,是由27 ppm查表得到的,而不是有些帖子中误解的将27.35ppm近似成28ppm。

其实ppm差错的核算公式为:ppm差错=差错/基准值*10的6次方。据此,选用第二种办法时,先得到了每30天跑快的秒数。这跑快的秒数便是差错,而30天便是基准值。所以ppm差错=每30天跑快的秒数/(30天*24小时*3600秒)*10的6次方。用这个公式能够容易地解说文档AN2604.pdf中说到的“0.65ppm大约是每月差错1.7秒”。由于:1.7/(30*24*3600)*10^6 = 0.65ppm。

核算出了ppm差错,还要处理查表。对文档中给出的表格也不用垂青。弄理解这个表格是怎样来的之后,能够运用简略的核算公式替代查表。AN2604.pdf中说,若校准值为1,则RTC 校按时,每2的20次方个时钟周期扣除1个时钟脉冲。这相当于0.954ppm(1/2^20*10^6 = 0.954)。而校准值最大为127,所以最大能够减慢121ppm(0.954ppm*127 = 121)。所以这个校准表便是由简略的乘除运算得来的,当然要运用浮点运算才能够得到精确成果。

以下是选用第二种办法完成的RTC 校准程序。
首要界说了两个常数,一是PPM_PER_STEP,精确到浮点数可表示的精度数0.9536743ppm。另一个是PPM_PER_SEC,即每30天快一秒对应的ppm差错,精确到浮点数可表示的精度数0. 3858025ppm。

#define PPM_PER_STEP0.9536743 //10^6/2^20.
#define PPM_PER_SEC 0.3858025 //10^6/(30d*24h*3600s).

然后界说全局变量FastSecPer30days。经过用户菜单设定并传递到RTC校准程序里。

u16 FastSecPer30days = 117; //菜单输入。117只用于演示。

完成的校准函数为:

void RTC_Calibration(void)
{
float Deviation = 0.0;
u8 CalibStep = 0;

Deviation = FastSecPer30days * PPM_PER_SEC; //得到ppm差错
Deviation /= PPM_PER_STEP; //得到校准值的浮点数
CalibStep = (u8)Deviation; // 得到校准值的整形数
if(Deviation >= (CalibStep + 0.5))
CalibStep += 1; //四舍五入
if(CalibStep > 127)
CalibStep = 127; // 校准值应在0—127之间

BKP_SetRTCCalibrationValue(CalibStep); //调用库函数

}
//函数完毕RTC_Calibration

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/zhizao/259893.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部