调整实时时钟(RTC)精度以补偿温度变化正式版 文档资料可直接使用,可编辑,欢迎下载 调整实时时钟(RTC)精度以补偿温度变化 |
摘要:在那些需要进行实时数据分析的应用中,实时时钟(RTC)是个十分重要的元件。5ppm以上的RTC精度对于保证数据的可靠性是十分必要的。在众多影响RTC精度的环境因素中,温度波动是造成RTC误差的主要原因。本应用笔记给出了如何运用MAXQ3100微控制器计算的微调因子,以补偿温度变化造成的RTC误差。 介绍 实时时钟(RTC)是需要实时数据的应用中的关键元件。比如,RTC用于电表中,是计算各家耗电的关键元件。RTC在气流计算机应用中有多种作用。它是测量气体产量的关键元件;它可以精确记录气流计算机中发生的各种事件的时间,以便在最终结果里对这些值进行补偿。很多实时采集数据的软件往往要求具有精确的RTC,以便进行复杂数据分析。明显的,RTC以及它的精度是那些处理实时数据的应用中的关键因素。 多数标准应用都要求RTC具有5ppm (百万分之一)以上的精度。RTC精度直接取决于其晶体时基的频率。环境的变化,包括温度、湿度、压力以及振动都会降低晶体谐振频率的精度,但在这些因素中温度起伏是最主要并且影响最大的因素。 怎样测量并调节RTC的精度,以补偿环境温度的变化呢?本应用笔记给出了如何使用headphoneMAXQ3100微控制器和它的片上温度传感器计算数字调节函数所需的微调因子,然后利用它来补偿由于温度变化造成的RTC精度的波动。 测量由于温度造成的RTC误差 MAXQ3100使用一个标称频率为32.768kHz的音叉晶振。如上所述,环境温度的变化会影响MAXQ3100晶振的谐振频率。当温度介于-40°C到+80°C之间时,使用一个频率计测量并记录下微控制器产生1Hz输出所需要的时间(图1)。数据显示晶振频率与温度的呈抛物线关系(图2)。温度偏离理想温度+23°C (室温)越多,晶振频率越慢,从而使RTC变得更慢。 图1. -40°C到+80°C温度范围内测试到的MAXQ3100 1Hz输出的数据 图2. 图1数据显示,温度偏离+23°C (室温)越多,晶振频率就越慢。(注:用下面公式计算晶振频率:频率 = (1/周期)* 32.768 )) 在对时间要求较高的应用中,RTC的误差是不能接受的。那么如何才能补偿这些温度造成的差异呢? 通过计算对温度波动实施补偿 MAXQ3100包含一个片上温度传感器和数字调节功能,可用于对RTC的振荡器进行补偿。温度传感器实时读取片上温度,而调节功能每10秒钟插入或移除脉冲,以补偿RTC使其变快或变慢。要确定插入或移除的脉冲数,需要通过如下步骤计算一个关于温度的二次方程。 1.计算每个脉冲实际增加的秒数,由于微调因子每隔10秒插入或移除脉冲: 脉冲 = (1/32768) / 10秒 = 3.052µs 2.根据产生1Hz输出所需的周期确定添加的脉冲数(表1)。 n = (周期 - 1) / 脉冲 式中,“脉冲”约等于0.000003052 表1. 根据温度和时间计算的添加脉冲数*
*数据是基于图1记录的周期算的。 3.在Excel上将收集的数据绘制成图。 4.最后,生成二次方程,生成曲线并将其显示在屏幕上。 图3. 图表示出根据温度波动所需要添加的脉冲数。 图3给出了需要添加的脉冲数与温度的对应关系(注:要想在不影响方程输出的前提下去掉一次项,只需简单的将读取的温度值减去25即可)。 interval是什么意思 得到的二次方程为: n = 0.0113x^2 + 0.0272x + 1.2768. 这个二次方程给出了温度与脉冲之间的抛物线关系。由于温度值由片上温度传感器得到,因此可根据该方程计算所需的脉冲数以补偿RTC晶振单位频率的变化。 实例 如果x = - 60 n = ? n = 0.0113x^2 + 0.0272x + 1.2768 n = 0.0113(-60^2) + 0.0272(-60) + 1.2768 n = 0.0113(-60^2) + 0.0272(-60) + 1.2768 n = (0.0113 * 3600) - 1.632 + 1.2768 n = 40.3248 为验证方程,计算如下: 1 - 周期 - ((n / 10) / 32768) < .000005 // 5ppm 例子: 1 - 1.000120504 - .000123 < .000005 1 - .0.999997442 < .000005 .0000026 < .000005 = 真arrange是什么意思 一旦确定插入/移除的脉冲数,就可以设置RTRM寄存器的值了。数字调节功能会自动添加或删除RTRM寄存器中所设定的脉冲数。 如果算出的二次方程是正确的,从该方程得到的微调因子就会根据温度补偿单位周期或频率的变化。经过补偿的和未补偿的温度曲线如图4和图5所示。 图4. 数据给出了采用微调因子进行温度补偿与未进行温度补偿的时间差异。 图5. 数据给出了采用微调因子进行温度补偿与未进行温度补偿的频率差异。 总之,MAXQ3100的片上温度传感器和数字微调功能,可以很方便的测量并补偿由于环境温度变化而引起的RTC精度的变化。经过温度补偿后,可以调整RTC的精度,使其在整个-40°C到+80°C范围内具有5ppm (百万分之一)以上的精度。 附录A. 例程 //*******************************************************************// // Function: calculate_trim_factor // Description: calculate trim factor bad on temperature input // Returns: trim factor // Destroys: N/A // Notes: N/A //*******************************************************************// int calculate_trim_factor (int temperature) { // 2nd order equation derived from experiment Temperature vs Puls per 10 c // y = 0.0113x^2 + 0.0272x + 1.2768 return ((0.0113 * (temperature * temperature)) + (0.0272 * temperature) + 1.2768) + 0.5; } //*******************************************************************// // Function: t_trim_factor // Description: subroutine to get temperature and do trim calculation // Returns: N/A // Destroys: N/A // Notes: RTRM will be assigned value returned from // calculate_trim_factor //*******************************************************************// void t_trim_factor (void) { while (1) { if ((TPCFG & START) != START) // make sure temperature conversion is not running { TPCFG |= START; // t bit to start temperature conversion while (1) { if ((TPCFG & TPIF) == TPIF) // wait for temperature conversion to complete { wait_for_rtc(); RCNT |= 0x8000; // write enable real time clock wait_for_rtc(); RTRM = calculate_trim_factor(((TEMPR & 0x1FFF) >> 4) - 25); // t trim factor wait_for_rtc(); RCNT &= ~0x8000; // turn off write access TPCFG &= ~TPIF; // ret interrupt flag break; } } break; } } } //*******************************************************************// // Function: main // Description: main sub for application // Returns: N/A // Destroys: N/A // Notes: subroutine in charge of peripheral initialization, // handling interrupts, display lcd data, and determining // when it is time to go grab on chip temperature // to determine trim factor //*******************************************************************// void main (void) { unsigned long time = 0; unsigned char flg = 0; initialize_lcd(); // initialize lcd initialize_clock(); // initialize real time clock TPCFG |= 0x40; // t temperature resolution and enable temp. interrupt thanksalot EIE0 |= EX7; // enable external interrupt (SW2) EIES0 |= IT7; clear_lcd(); // clear LCD gments while (1) { if ((EIF0 & IE7) != 0) // check external interrupt { flg += 1; // toggle lcd data display 我爱你我的祖国 if (flg == 3) flg = 0; EIF0 &= ~IE7; // ret interrupt } time = ((unsigned long) RTSH) << 16 | RTSL; 美国的饮食习惯 switch (flg) { cucumber ca 0: display_time(time); // display time on lcd break; ca 1: if ((TPCFG & START) != START) // make sure temperature conversion is not running { TPCFG |= START; // t bit to start temperature conversion while (1) { if ((TPCFG & TPIF) == TPIF) // wait for temperature conversion to complete { display_val(TEMPR); // display temperature value TPCFG &= ~TPIF; // ret interrupt flag break; } } } break; default: display_val(RTRM); // display trim factor break; } // go grab the temperature and t trim value on the top of every 5 minutes intervals if (((((time % 3600) / 60) % 5) == 0) && ((((time % 3600) % 60) % 60) == 0)) { t_trim_factor(); } } } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
本文发布于:2023-05-16 09:55:53,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/fan/90/110475.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |