0x00 概述
定时器是嵌入式软件开发最长接触的事物,本篇文章主要介绍了在某些极端情况下对于硬件定时器精度的校准方式。阅读本文之前,您需要了解的一些前置技能有:
技能名称 | 技能熟练度 | 技能教程链接 |
---|---|---|
单片机外设 | 熟悉 | 暂无 |
0x01 误差来源
定时器的概念我也无需过多介绍,现在一般有软件定时器与硬件定时器。硬件定时器素来有时间精度较高、配置方案灵活、不消耗CPU资源等特点。一般的定时器计数模块都可以按照其进入时钟进行相关的运算,而现在大部分的CPU时钟都是经PLL倍频锁相得来,所以大致与其输入频率有关。一般来说,如果有一个较为准确的时钟来源,就会较为完整的生成需要的波形。但是输入晶振的精度如果出现问题,有可能产出的内部时钟就是有一定的误差,且可能定时器本身的计算电路存有固定的误差。经实际测试,这个值一般在±1%~0.1%左右徘徊。但在某些对于精度要求较高的场合下,这个1%是无法接受的极大误差,这时就需要某种校准方案将其纠回。
0x02 校准方式
这里只提供这种校准的方式构思,没有办法提供代码。故讲述可以较为抽象,有什么问题,可以与我聊天,我看到后会一一解答。
0x12 误差定位
这种误差平时操作基本不会受到影响,一般仅会在使用某些定时器的计数器功能时,在记录低频信号时会受到干扰,因为当前波形的计算方式基本上都是假设当前定时器的计数模块输入信号为完美信号(占空比50%、频率为固定频率、信号相位角为0°),但是实际上不会有这样的信号存在。现在的PLL电路可以做到很高的输出波形精度,但也是需要极高的输入精度。而有很多情况下,没办法做到那么高的输入信号,所以就会引入部分误差。解决办法主要有两种:硬件(更换有源晶振)、软件(详见下文)。
0x22 误差捕获信号
上文讲述可以抽象出如下公式:
当
前
真
实
计
数
值
=
定
时
器
计
数
值
∗
时
钟
源
误
差
比
例
当前真实计数值=定时器计数值*时钟源误差比例
当前真实计数值=定时器计数值∗时钟源误差比例
也可以转化为:
时
钟
源
误
差
比
例
=
定
时
器
计
数
值
/
当
前
真
实
值
时钟源误差比例 = 定时器计数值 / 当前真实值
时钟源误差比例=定时器计数值/当前真实值
也就获取到了误差校准的方法,就是指定一个较为稳定的波形,将其校准到与校准波形精度一致的情况。
而校准信号推荐为50%占空比、1Hz 方波信号,这种信号较好生成,低频传输效果良好,波形精度一般可以保证在0.1%左右。这样就可以很精准的定位误差比例。也就可以确认真实的计数值。
0x03 后记
这是一种较为取巧的方式,这种情况下,仅能得到一个暂时稳定的数字(误差比例),但是可能根据后期相关的使用,硬件相关的老化与损耗。性能会相应的下降。因此这个数据可能需要一定的时间就要更新一次,并且在更换了外部输入时钟源后就需要再次修改一次。较为麻烦,仅在某些特殊情况下使用,正宗的方式其实还是通过更换一个高精度、高可靠性的输入时钟源来保证采样的稳定性。
更多
本文首发自 记:从零开始讲解UDS(三)——网络层-我的博客,更多文章可进入我的博客详查。