发 帖  
原厂入驻New

[经验] 定时器中的实时时钟(RTC)

2020-9-3 22:47:05  284 RTC 实时时钟 定时器
分享
3
实时时钟(RTC)是专用于维持一秒时基的计时器。此外,RTC通常用于在软件或硬件中跟踪时钟时间和日历日期。RTC的许多功能是非常专业的,是维持高精度和非常可靠的操作所必需的。微控制器外部有RTC设备,可与I 2 C或SPI总线接口
本文介绍了微控制器内部的RTC。


实时时钟概述

实时时钟的基本功能是产生一秒的间隔并保持连续计数

您可以在下图中看到这种表示。

1.jpg
图1. 该时序图描述了RTC的基本功能

还显示了程序功能A,该功能读取秒计数器并安排事件B在未来三秒发生。此操作称为警报。请注意,秒计数器连续运行,并且不会停止和启动。RTC的两个主要要求是准确性和连续运行。

下图显示了RTC的常见硬件功能。

2.jpg
图2. 实时时钟硬件功能

RTC通常具有自己的内部振荡器和外部晶体,并可以选择使用外部频率基准。所有时钟源均以32,768 Hz运行。外部时钟源允许使用非常精确和稳定的设备,例如TCXO(温度补偿晶体振荡器)。

使用多路复用器选择时钟源,并将其输入到预分频器,该预分频器将时钟分频为32,768(215),以产生一秒钟的时钟。

基本RTC具有秒计数器,通常为32位或更多。一些RTC具有专门的计数器来跟踪一天中的时间和日历日期。

没有时间和日期计数器的基本RTC为此目的使用软件。常见的选择是来自输出引脚的1 Hz方波。RTC将有几个可能的事件来生成处理器中断。

RTC通常具有专用的电源引脚,以允许在微控制器的其余部分掉电时进行操作。该电源引脚通常连接到电池或单独的电源。

RTC精度和频率补偿

RTC的精度取决于32,768 Hz时钟源。在设计良好的晶体振荡器中,误差的主要来源是晶体。外部TCXO可用于高度精确的定时,或者特殊的频率补偿技术可用于较便宜的晶体和内部振荡器。晶体误差的三个主要来源。

  • 初始电路和晶体容差
  • 晶体随温度漂移
  • 晶体老化


下图显示了一些与RTC准确性有关的概念。

3.jpg
图3.该 图显示了使用德州仪器(ti)提供的温度测量误差

该图上的深蓝色迹线显示了典型的初始公差以及随温度的变化。粉色轨迹仅显示温度误差。补偿温度的关键在于,晶体的行为是众所周知的,并且可以通过二次方程式进行预测。如果在制造电路板并且已知温度之后测量初始误差,则可以补偿最大的误差源。

在仔细补偿后,黄色带是准确度的合理目标。请记住,一年中1 ppm大约需要30秒。晶体老化难以弥补。幸运的是,老化通常每年只有几ppm。

如何更改RTC时间

有两种方法可以更改RTC的时序,作为系统的一部分以补偿错误。

第一张图(图4)描述了在秒计数器的每个周期内,预分频器所计数的振荡器周期数。

前两秒是通常的32,768个周期。该软件使用温度读数和初始误差来确定振荡器正在快速运行,并且32,768个周期实际上为0.99990秒。为了补偿这个小误差,该软件告诉RTC每四秒钟将预分频器的模数更改为32781,以增加一些时间。

4.jpg
图4. 由预分频器计数的振荡器周期的表示

此技术的优势在于,从第二秒到第二秒的时间间隔变化很小。但是,该技术需要一个可调节的预分频器和其他寄存器来保存特殊的预分频计数和特殊计数应用之间的秒数。我觉得这很酷。有点复杂但很酷。

如果RTC没有特殊的预分频器来调整时序怎么办?此图显示了另一种方法。

5.jpg
图5. 与图4相同的情况,但是没有预分频器

在这种情况下,框中的数字是秒计数器。显示的计数是100251,后跟100252。软件一直在连续计算调整并跟踪RTC秒计数。当误差累积到精确的一秒时,软件会增加或减少一秒以调整累积的误差。

该技术的缺点是,当进行调整时,从秒到秒的变化很大。该技术具有与任何RTC兼容的优势。

RTC中的安全性

安全性是一个有趣的要求。在某些应用程序中,时间用于为客户计费以使用服务或消耗资源。关于防止或检测RTC的黑客攻击,有广泛的实践体系。技术的范围从外壳的入侵检测到微控制器的特殊功能。

我当前使用的微控制器上的RTC具有特殊的寄存器,以允许软件永久锁定关键寄存器。一旦锁定,就无法更改它们,并且可以防止其遭到黑客入侵或代码失控。更改时间需要完全复位微控制器。

时间和日期

一些RTC具有硬件计数器,可以维护一天中的时间和日历日期。这需要分钟,小时,天,月,年的计数器,并考虑leap年。时间和日历日期也可以通过软件保存。

一个突出的例子是time.h文件中C标准库中的函数。对于微控制器,该系统可以基于RTC的秒计数器。必须编写四个小的自定义函数以完全支持time.h库。

此处感兴趣的一个函数由库中的time()函数调用,该函数以从称为“纪元”的起点开始的秒数返回时间,通常为1970年1月1日。通常,要读取的自定义函数硬件计时器名为get_time()或类似的变体。get_time()所做的所有操作都会读取秒计数器并返回该值。图书馆会做其余工作,以秒为单位将此时间转换为当前日期和日期。

32位秒计数器的问题

一个32位的第二个计数器运行很长时间,但不会永远持续下去。由于计数范围有限,可能会出现严重问题。例如,基于32位计数器(使用C标准库)和1970年1月1日的系统时间可能会在2038年1月失败,因为计数器在最大计数之后翻转。此问题称为Y2038问题。

NASA 深度撞击太空研究彗星时发生故障。最初的任务目标得以实现,航天器继续研究其他物体。但是,在2013年,通讯突然中断了。这是NASA的官方评论。

“尽管丢失的确切原因尚不清楚,但分析发现计算机时间标记存在潜在的问题,该问题可能导致无法控制Deep Impact的方向。”

- 2013年NASA新闻稿

失败的可能原因是32位计时器将时间保持在0.1秒的增量内,并且翻转过来导致任务“终止”。

当涉及时间和日期时,我的建议是在设计中使用比预期寿命更长的寿命。

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /9 下一条

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