OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12404|回复: 14

各位大虾,请问怎么修正RTC的精确度.

[复制链接]

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2012-11-27 10:54:23 | 显示全部楼层 |阅读模式
观察了RTC一段时间,发现RTC快了很多,咋办啊?请指教!多谢!
坚持学习!就能成功!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
 楼主| 发表于 2012-11-27 11:11:03 | 显示全部楼层
 最近看了一些关于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

ST官方授权代理,专营STM8/32
QQ 940436962
http://y-ec.taobao.com/

坚持学习!就能成功!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-27 17:45:52 | 显示全部楼层
STM32的RTC不是准度 的问题,而是不能起振的问题,这个比准度问题严重得多。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2012-10-14
在线时间
11 小时
发表于 2013-7-9 20:50:24 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
什么意思,看不懂,刘老师
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-9 21:32:38 | 显示全部楼层
回复【4楼】小黑:
---------------------------------
你多做几个板子就"深有体会"了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-8-8
在线时间
2 小时
发表于 2013-10-10 09:04:30 | 显示全部楼层
不能启振问题是说的32.768晶振吧?  我现在用8M晶振作为RTC的时钟源,启振问题解决了。但是不准了。该如何校准呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-10 11:07:58 | 显示全部楼层
回复【6楼】zxc2769:
---------------------------------
你的差多少?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-8-8
在线时间
2 小时
发表于 2013-10-12 09:37:21 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
一天下来差13秒还要多!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-12 09:44:17 | 显示全部楼层
回复【8楼】zxc2769:
---------------------------------
8M晶振外壳接地了么?
接地试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-8-8
在线时间
2 小时
发表于 2013-10-12 10:58:53 | 显示全部楼层
回复【9楼】正点原子:
--------------------------------好的 多谢指点!
回复 支持 反对

使用道具 举报

4

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-8-8
在线时间
2 小时
发表于 2013-10-14 09:27:48 | 显示全部楼层
回复【9楼】正点原子:
回复【8楼】zxc2769: --------------------------------- 8M晶振外壳接地了么? 接地试试。
---------------------------------
回复【10楼】zxc2769:
回复【9楼】正点原子: --------------------------------好的 多谢指点!
---------------------------------
我实验下了~! 改进效果不大!
回复 支持 反对

使用道具 举报

4

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-8-8
在线时间
2 小时
发表于 2013-10-14 09:28:13 | 显示全部楼层
看来只有过一段时间就需要校时了!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-14 14:35:29 | 显示全部楼层
你分频没计算错吧?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-8-21
在线时间
0 小时
发表于 2015-8-21 16:59:53 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
RTC不起振,先不要怪ST的芯片,我设计了400套板子,RTC只有个别3-4块有不起振的现象。调整一下就好了!和PCB布局关系很大。我PCB调整之后基本没有遇到过。
回复 支持 反对

使用道具 举报

60

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2017-3-17
在线时间
120 小时
发表于 2017-10-12 17:21:39 | 显示全部楼层
F4系列 BKP_SetRTCCalibrationValue(CalibStep); //调用库函数 用什么代替,头文件是什么
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 15:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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