搜索
bottom↓
回复: 85

关于STM32中RTC的校准方法

  [复制链接]

出0入0汤圆

发表于 2009-12-31 02:45:57 | 显示全部楼层 |阅读模式
最近看了一些关于RTC校准的帖子,发现很多人存在疑惑。正好最近我也在STM32中实现了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_STEP  0.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

出0入137汤圆

发表于 2009-12-31 06:47:11 | 显示全部楼层
支持一把

出0入0汤圆

发表于 2009-12-31 08:00:29 | 显示全部楼层
好 ,谢谢,mark & 保存

出0入0汤圆

发表于 2009-12-31 08:47:38 | 显示全部楼层
好贴,多谢楼主分享

出0入0汤圆

发表于 2009-12-31 09:14:37 | 显示全部楼层
好贴

出0入0汤圆

发表于 2009-12-31 09:14:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-31 09:46:43 | 显示全部楼层
Mark ,好贴

出0入0汤圆

发表于 2009-12-31 11:03:02 | 显示全部楼层
嗯,总结的不错,建议给条裤子。

出0入0汤圆

发表于 2009-12-31 12:09:50 | 显示全部楼层
申请加酷啊,这么好的总结,而且是原创

出0入0汤圆

发表于 2009-12-31 14:51:56 | 显示全部楼层
有时间的时候试一下。

对楼主表示由衷的感谢。

出0入0汤圆

发表于 2009-12-31 15:27:41 | 显示全部楼层
楼主的精神值得佩服

出0入0汤圆

 楼主| 发表于 2010-1-1 01:27:17 | 显示全部楼层
多谢各位鼓励。

出0入0汤圆

发表于 2010-1-1 10:12:19 | 显示全部楼层
这个牛,收藏了

出0入0汤圆

发表于 2010-3-26 11:56:21 | 显示全部楼层

出0入0汤圆

发表于 2010-3-26 12:55:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-24 21:15:12 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-9-24 22:24:55 | 显示全部楼层
感谢楼主的分析,直接采用了

出0入0汤圆

发表于 2010-9-24 23:58:35 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-10-1 10:05:40 | 显示全部楼层
不错,了解了,回去试试。

出0入0汤圆

发表于 2010-10-8 16:58:16 | 显示全部楼层
MARK一下明天看!

出0入0汤圆

发表于 2010-10-8 18:03:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-8 21:03:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-9 07:43:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-9 07:57:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-9 08:24:37 | 显示全部楼层
mark ,

出0入0汤圆

发表于 2010-10-12 13:40:50 | 显示全部楼层
支持了

出0入0汤圆

发表于 2010-12-2 14:09:48 | 显示全部楼层
回复【楼主位】xizi
这里应注意的一个关键问题是,RTC只能对跑快进行校准,
-----------------------------------------------------------------------

我现在用内部的32KHz的时钟,结果真的跑慢了,看来不可校准了,还有没有其他办法可以让跑慢的时钟跑快一点呢?

出0入0汤圆

发表于 2010-12-2 20:09:43 | 显示全部楼层
标记一下!~~~~

出0入0汤圆

发表于 2010-12-2 20:48:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-2 22:20:39 | 显示全部楼层
回复【22楼】albert_lu  
-----------------------------------------------------------------------

出0入0汤圆

发表于 2010-12-3 15:59:13 | 显示全部楼层
MARK,学习了

出0入0汤圆

发表于 2010-12-3 16:08:27 | 显示全部楼层
挺实用的,支持原创。

出0入0汤圆

发表于 2010-12-18 11:13:48 | 显示全部楼层
非常好,顶上去。

出0入0汤圆

发表于 2010-12-21 20:34:58 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-1-2 10:44:09 | 显示全部楼层
回复【26楼】mynice  
回复【楼主位】xizi
这里应注意的一个关键问题是,rtc只能对跑快进行校准,
-----------------------------------------------------------------------
我现在用内部的32khz的时钟,结果真的跑慢了,看来不可校准了,还有没有其他办法可以让跑慢的时钟跑快一点呢?
-----------------------------------------------------------------------

"rtc只能对跑快进行校准"这一原则无法改变,但我们总是可以做到让跑慢的时钟跑快。你发现跑慢时所用分频系数应是32768,当你改为32766分频系数时,它就会跑得比原来快一些。如果仍然比标准时钟慢,那就再减小分频系数,总可以使之跑(得比标准)快,这样就可以进行校准了。当然如果分频系数弄得太小,使之跑(得比标准)快太多,可能会超过rtc的校准能力(127),也无法实现校准。

出0入0汤圆

发表于 2011-1-2 11:32:15 | 显示全部楼层
支持原创

出0入0汤圆

发表于 2011-1-3 22:57:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-22 16:48:55 | 显示全部楼层
回复【楼主位】xizi
-----------------------------------------------------------------------
支持。。顶

出0入0汤圆

发表于 2011-1-22 19:20:42 | 显示全部楼层
学习

出0入0汤圆

发表于 2011-1-22 20:53:29 | 显示全部楼层
写的非常好

出0入0汤圆

发表于 2011-2-10 09:33:31 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2011-3-9 11:25:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-3 10:24:48 | 显示全部楼层
好东西 ,必mark

出0入0汤圆

发表于 2011-8-29 20:08:51 | 显示全部楼层
正需要这个

出0入0汤圆

发表于 2011-8-30 15:16:08 | 显示全部楼层
正好学到这一块

出0入0汤圆

发表于 2011-10-9 10:55:23 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2011-11-8 14:35:42 | 显示全部楼层
学习

出0入0汤圆

发表于 2011-12-2 23:19:13 | 显示全部楼层
不错呀! 学习啦!

出0入0汤圆

发表于 2011-12-2 23:42:03 | 显示全部楼层
感谢,这个内容不错的。

出0入0汤圆

发表于 2012-3-8 09:03:26 | 显示全部楼层
学习了,有待使用

出0入0汤圆

发表于 2012-3-8 09:21:53 | 显示全部楼层
mark

出20入0汤圆

发表于 2012-3-8 09:48:58 | 显示全部楼层
说点我的见解:真要做高精度的时钟,要根据温度进行补偿的。光补偿某一温度的频率没用的。做电表的都知道DS3231和RX8025T,因为温补很重要。也有用rx8025(不带T)来做的,但是会用ntc+ad来采集温度,进行补偿。

另外可以看下晶振厂家的手册,关于温漂的描述。

出0入30汤圆

发表于 2012-3-8 10:24:36 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-3-8 11:28:42 | 显示全部楼层
跑得不准了 再让用户自己重新设一次不就得了,一般应用。

出0入0汤圆

发表于 2012-4-4 14:38:29 | 显示全部楼层
RTC 校准  记号

出0入0汤圆

发表于 2012-10-25 12:55:43 | 显示全部楼层
mark            

出0入0汤圆

发表于 2012-11-2 16:33:40 | 显示全部楼层
总结的非常好!正用到!表示感谢!

出0入0汤圆

发表于 2012-11-2 17:48:38 | 显示全部楼层
很好 记录一下

出0入0汤圆

发表于 2012-11-4 01:03:10 来自手机 | 显示全部楼层
不错啊,谢谢了      

出0入0汤圆

发表于 2012-11-4 10:35:06 来自手机 | 显示全部楼层
好呀
           

出0入0汤圆

发表于 2013-3-20 22:14:15 | 显示全部楼层
不错………………

出65入0汤圆

发表于 2013-3-20 23:11:07 来自手机 | 显示全部楼层
mynice 发表于 2010-12-2 14:09  回复【楼主位】xizi  这里应注意的一个关键问题是,RTC只能对跑快进行校准,  ---------------------------- ...

修改分频,就可以使时钟加快。

出0入0汤圆

发表于 2013-5-14 11:47:08 | 显示全部楼层
学习啦,mark

出0入0汤圆

发表于 2013-5-17 21:25:52 | 显示全部楼层
谢谢楼主分享。
学习了。

出0入0汤圆

发表于 2013-5-17 22:34:17 | 显示全部楼层
mark               

出0入0汤圆

发表于 2013-5-17 22:46:23 | 显示全部楼层
mark 技术贴

出0入0汤圆

发表于 2013-6-8 11:23:43 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2013-6-9 13:46:15 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2013-6-9 23:19:43 | 显示全部楼层
暂时做个记号

出0入0汤圆

发表于 2013-8-27 18:47:23 | 显示全部楼层
MARK    以后再仔细研究  目前用DS1307

出0入0汤圆

发表于 2013-8-27 18:53:23 | 显示全部楼层
mark           

出0入0汤圆

发表于 2013-9-12 17:09:43 | 显示全部楼层
这个比较需要。。。。

出0入0汤圆

发表于 2013-11-29 15:23:21 | 显示全部楼层
目前32.768  5p的电容 也会跑快。四天跑快二十几秒。

出0入0汤圆

发表于 2013-12-10 10:58:23 | 显示全部楼层
非常感谢,最近使用到了

出0入0汤圆

发表于 2013-12-15 21:59:07 | 显示全部楼层
MARK   虽然帖子很老了  但是很有用

出0入0汤圆

发表于 2014-1-6 14:55:02 | 显示全部楼层
mark刚好能用上

出0入0汤圆

发表于 2014-11-27 13:37:03 | 显示全部楼层
RTC不准,正在想办法。

出0入0汤圆

发表于 2015-1-3 04:27:02 来自手机 | 显示全部楼层
介绍非常详细,包括计算方法,好帖。

出0入0汤圆

发表于 2015-3-10 10:13:46 | 显示全部楼层
谢谢楼主,试试看

出0入0汤圆

发表于 2015-8-12 15:47:44 | 显示全部楼层
修改i分频比,让慢的时钟跑快,然后再来校准快的时钟;太有想法了

出0入0汤圆

发表于 2015-8-13 00:21:40 | 显示全部楼层
这可是个好东西啊

出0入0汤圆

发表于 2017-12-1 10:42:41 | 显示全部楼层
mark,正在测试,效果理想的话,再回来评论

出0入0汤圆

发表于 2019-1-18 10:19:12 | 显示全部楼层
MARk
一下,测试了测试了,之前我这边的32 误差能达到一天快6.5s左右,进行测试之后误差能到达一天正负1.2-2.5s的误差,这个还是在校准时间简单估算的一个情况下(一块板子进行误差估算,然后就以这块板子的误差为公共误差进行估算....主要是自己懒..)进行的修正,虽然不精度不高但是已经能达到项目的需求了

出0入76汤圆

发表于 2019-9-14 15:06:59 来自手机 | 显示全部楼层
感谢分享,由于项目也是使用的自带的RTC,参考一下校准方法
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 20:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表