×
嵌入式 > 技术百科 > 详情

MC9S08MG64实时时钟的校准和补偿(二)

发布时间:2020-06-19 发布时间:
|
3 实时时钟的温度补偿

上面讨论了在一个固定的温度下如何做时钟的补偿及其原理,现在我们讨论在温度变化的情况下如何做时钟的自动补偿。如前所述,晶体的频率偏差可以用抛物线方程来描述,如果我们确定出抛物线,那么就可以通过温度(温度的测量可以用集成温度传感器或NTC电阻来完成)来确定出频率偏差从而对其进行补偿。比较常用的一种方法就是测出一些点然后用最小二乘法拟合。简要描述如下:

由一些已知点拟合抛物线方程:

已知点:(X1,Y1), (X2,Y2), (X3,Y3) … (Xn,Yn)。

确定抛物线方程y=ax2 + bx + c 的系数。

最小二乘法:

至少需要三个点来确定此抛物线。

晶振典型温漂曲线形式如下:

y = a(x-t)2 + k = ax2 - 2atx + at2 + k

对于同一个型号的晶体,假定抛物线二次系数不变,可由公式(2)(3)求得b c,然后得出t, k。从而实现两点校正。由于抛物线越远离顶点变化率越大,所以在抛物线的两端进行校正可以得到更好的补偿精度。

t = -b/2a

k = c - b2/4a

如果晶体的一致性比较好,系数a和t偏差不大,可以只对系数k进行标定。即单点校正。

4 使用FTM 模块产生秒脉冲

在一些应用中,实时时钟输出的秒脉冲需要用光耦隔离。过窄的时钟脉冲难以通过低速光耦。在这一节中,将讨论一种使用FTM 模块来校正实时时钟iRTC输出的秒脉冲的方法。校正后的秒脉冲将具有:

更高的精度(每个秒脉冲)

50% 的占空比

4.1 以RTCCLKOUT做时钟源产生秒脉冲

在上述讨论的实时时钟(iRTC)的校准方法中,RTCCLKOUT时钟在长的时间内精度得到了保证。在图2-1中可以看到,由于补偿间隔是M(M》1)秒,补偿间隔内的第一秒长度和其它秒长度是不一样的,因为第一秒包含了补偿时间。如果我们能把此补偿时间平均分配到补偿间隔内的每一秒钟,使每一秒的长度相等(每一秒都得到补偿),那么我们将得到均匀的高精度秒脉冲输出。

单片机中的程序计算补偿间隔内每一秒的补偿时间并对每一秒进行补偿。如果补偿间隔是M,补偿值是N,那么每一秒钟的补偿值就是N/(32768 ×M)秒。N/(32768×M)可能是一个很小的值,因此我们需要一个高精度的时钟来得到高分辨率(精度)。

在此方案中我们使用总线时钟(bus clock),该总线时钟由外部的32768Hz 晶体(XOSC1)组成的振荡器产生参考频率,然后经由片内倍频电路锁频环(FLL)倍频获得。锁频环(FLL) 和实时时钟(iRTC)共用同一外部振荡源。锁频环(FLL)的倍频系数设置为512,所以总线频率最大为16.78MHz(512×32768)。每一秒的补偿时间为(512×N)/M 总线时钟周期,它消除掉了温度和晶体老化的影响。

从图2-1(补偿后的实时时钟秒脉冲输出)中我们可以看出,当前补偿周期的最后一个时钟沿就是下一个补偿周期的第一个时钟沿。用第一个时钟沿做对齐,实时时钟的补偿精度得到继承(上升沿和下降沿都可以用来做对齐;由软件来设定)。

MC9S08GW64 的FTM模块的每个通道可以单独工作在输入捕捉或者输出比较模式。我们可以使用一个FTM模块的两个通道,其中的一个通道来捕捉iRTC输出的窄脉冲,另一个通道输出50%占空比的秒脉冲。

当 FTM模块的通道1捕捉IRTCCLKOUT的上升沿(或下降沿)时使用总线时钟,在FTMCH1中断触发后保存FTM计数器的捕获值到FTMCH1V。在FTMCH1中断程序中,FTMCH0被设置为输出比较模式,输出比较值设置为FTMCH1V加一个偏移Ф。Ф为一个常量加每一个脉冲周期的调整值。表3列出了IRTCCLKOUT和FTM输出边沿的上升时刻,以及两者的脉冲宽度。

表3 IRTCCLKOUT 和FTM 输出时序

TAVG = V ÷ M(晶体振荡周期)

= 512 × V ÷ M(总线时钟周期)

从表3可以看出,RTCCLKOUT先右移了σ。每一个秒脉冲用平均的补偿值进行补偿。

图4-1和图4-2对这种补偿方法做了详细地说明。图4-1演示了加入一些振荡周期的情形。

在图4-1中:

图4-2 说明了减少一些振荡周期的情形。

图4-2:

偏移量 σ(延迟)有两个作用:

对实时时钟iRTC 输出进行移相;每个秒脉冲的补偿都基于这个值

有足够的时间处理FTMCH1中断

每一个秒脉冲的补偿时间都被加上σ,在例程中σ 被设置为0x8000,在总线时钟为32768 ×512Hz时这相当于1.9ms。σ值的大小取决于补偿间隔(compensation period)和补偿值(compensation value)。

0 《 σ - (M-1)(512 × V/M) 《 0xFFFF

-128 《 V 《 127

一般来讲,当温度变化时晶体的误差总是负的,所以σ 可以设置为一个比较小的值,比如0x2000,0x1000,补偿的范围得以增大。

FTMCH0设置为输出比较模式(匹配时设置输出为高),当FTM 计数器的值和FTMCH0V 寄存器的值匹配时FTMCH0引脚被置高,FTMCH0中断被触发。FTM 设置为128分频,0.5秒后FTMCH0输出变低。当输出变低时FTM的分频比设置为1。

4.2 硬件配置和例程

MCU的串口SCI0用来和PC通讯,在PC端可以使用超级终端。IIC用来读取集成温度传感器LM75B的数值。ADC模块读取NTC和电阻的分压。RTCCLKOUT (Pin20) 连接至FTMCH1 (pin 38)。1Hz秒脉冲FTMCH0 pin (Pin37)通过光耦隔离后输出,可以在校表台上测量。例程是用CodeWarrior 6.3 IDE开发的。

电路板上电后会进入自动补偿模式,根据环境温度的变化对实时时钟进行补偿。在超级终端中按任意键退出自动补偿模式,然后输入命令help可以显示所有可用的命令:

comp 显示当前的补偿间隔和补偿值,并输入新值。

temp 显示温度。

date 显示日期并输入新日期。

time 显示时间并输入新时间。

auto 重新进入自动补偿模式。

在FTMCH1的中断服务程序中,做FTMCH0输出比较时间的调整。如果当前补偿周期结束,它会检查有没有新的补偿间隔和补偿值。如果有则把新值载入补偿寄存器,并重新计算补偿调整值。

在补偿周期结束前,IRTC_STATUS 寄存器中的C_DON (IRTC_STATUS_L_C_DON) 会被置位。它被用来对齐补偿周期。

实时时钟iRTC的补偿机制可以在长时间内(》补偿间隔)输出高精度的秒脉冲,FTM则用来保证在补偿间隔之内每个秒脉冲周期相等。

说明

当开发GW64工程时,推荐在iRTC的初始化中禁止掉iRTC中断,或者定义iRTC中断服务程序。因为即使当下载一个新程序时,iRTC模块仍然保留着上一次的配置(iRTC可以由VBAT供电,MCU掉电时,iRTC的配置仍然保留)。在初始化时必须禁止掉iRTC中断,或者定义其中断服务程序。否则可能发生不可预期的错误。

5 补偿流程

使用上述软件,我们可以不用关心补偿算法的细节,按照下面的简单步骤来完成晶体振荡电路在全温度范围内的自动补偿:

(1) 把补偿间隔和补偿值设置为0(Interval = 0, Value = 0),在全工作温度范围内调整温度并记录频率偏差值。测量点越多越好。

(2) 利用测量点拟合抛物线(a(x - t)2 + k),得出抛物线参数a, t, k。

(3) 把参数写入程序中。

对于同一批次的晶体,如果晶体的一致性比较好,可以用上面的步骤确定出参数a,和t。在批量生产时,在任意一个温度点测量晶体的误差,即可反推出k。其他温度点的误差即可通过抛物线公式计算得出,根据误差查表得到需要的补偿间隔和补偿值。把补偿间隔和补偿值写入补偿寄存器即可得到精确的秒脉冲输出。参数a, t和k 都要保存在非易失性存储器中以防掉电丢失。

6 总结

本文介绍了实时时钟iRTC的补偿机制和如何输出均匀秒脉冲的问题,探讨了如何在全温度范围内对iRTC进行补偿。iRTC可以在长时间内保持高精度,FTM模块用来输出每个周期都很均匀的秒脉冲。在全温度范围内的补偿精度依赖于晶体的一致性,建议采用高精度,一致性好的晶体。温度测量器件基于成本考虑建议采用NTC电阻,根据测量值用查找表来确定温度,NTC电阻应尽量靠近晶体。MG64有一个内部温度传感器,通过标定也可以达到比较高的测温精度,使用它可以进一步降低系统的硬件成本。




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
分拣机器人的工作原理是什么