首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何提高CMWX1ZZABZ-091实时时钟的精度

如何提高CMWX1ZZABZ-091实时时钟的精度
EN

Stack Overflow用户
提问于 2018-07-25 07:28:38
回答 1查看 2.1K关注 0票数 1

我使用的是B-L072Z-LRWAN 1和CMWX1ZZABZ-091 LoRa /Sigfox™模块(Murata)

内部RTC (实时时钟)是不准确的,我看到10秒每天损失一些模块。

我的问题是,为什么会这样?数据表显示LSE为1.73秒/20 the。TXCO为2 2ppm。如何使用TXCO校准RTC?

我知道温度也会影响精度,但我认为这是在一个微不足道的范围内,也就是不能解释10秒的/day。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-25 16:34:44

如何使用TXCO校准RTC?

不久前,我问自己同样的问题,我花了一段时间才找到解决方案,因为参考手册中有很多选项,主题可能会很混乱。

在我的例子中,我需要在没有HSE谐振器的板上校准RTC (它是一个只有LSE晶体的小腕表原型(32.768 kHz),该板没有HSE,并且是从不稳定的RC内部振荡器时钟)。但是对我起作用的方法也应该适用于你的情况。

我的RTC校准方法的关键是:

  1. 一种快速、稳定的参考时钟。I使用了一个STM32F4发现板(带有8 MHz的HSE晶体,APB时钟速度为25 MHz (PLL‘up),用于计时器进行以下测量)。
  2. 非常精确的1 1PPS校准输入(每秒1 Pluse )。-我使用了一个GPS模块,在其中一个引脚上输出1 GPS。

就我的情况而言,校准步骤如下:

  1. 用计数器/定时器的输入捕获方法(选择正确的计时器宽度(16 vs32位)和时钟分割(最好不进行分割以获得最大分辨率)来计数连接到1 1PPS信号源(在我的情况下为GPS模块)的引脚上的多个1 1PPS事件之间的系统时钟滴答数。然后取平均值,了解偏离假定时钟速度的偏差(在我的例子中是25 MHz )。它应该是稳定的,并且在测量过程中不会有太大变化(32秒的校准时间就足够了)。
  2. 然后计数多个1Hz校准输出滴答数(由目标单片机的LSE驱动)(使用不同引脚上的输入捕获),并取平均值。
  3. 现在,计算伦敦证交所所需的修正。并使用目标STM32上的RTC校准寄存器来调整RTC (也请参阅参考手册中的RTC平滑校准或此申请书(AN3371))。
  4. 重做步骤1和步骤2以验证校正。

在开始校准之前,请确保撤消任何RTC校正:

代码语言:javascript
复制
 if (HAL_RTCEx_SetSmoothCalib(
        &hrtc,
        RTC_SMOOTHCALIB_PERIOD_32SEC,
        RTC_SMOOTHCALIB_PLUSPULSES_RESET,
        0) != HAL_OK) {
    error_handler();
  }
  start_calibration();

为了计算更正,我使用了类似于以下内容的内容:

代码语言:javascript
复制
const float corr = calib_avg_ext_rtc / calib_avg_1pps;

log("correction:\r\n%f / %f =\r\n%.20f\r\n\r\n", 
  calib_avg_ext_rtc, calib_avg_1pps, corr);

const float c = corr - 1.0f;
if (corr > 1.0f) {
  log("RTC crystal vibrates too fast!\r\n");
  log("correction: %.20f ppm\r\n", -1.0e6f * c);
}
else if (corr < 1.0f) {
  log("RTC crystal vibrates too slow!\r\n");
  log("correction: %.20f ppm\r\n",  1.0e6f * c);
}
else {
  log("your RTC crystal is running exactly at the right speed. - STRANGE!\r\n");
}

const int16_t calib32s = (int16_t)roundf(c * 32*32768);
if (calib32s != 0) {
  log("correction value (ticks +/- 32 s interval):\r\n");
  if (corr < 1.0f) {
    log("MINUS %d\r\n", -calib32s); /* clock TOO SLOW, REMOVE cycles */
    log("\r\nuse this on the target:\r\n");
    log("HAL_RTCEx_SetSmoothCalib(&hrtc, RTC_SMOOTHCALIB_PERIOD_32SEC,\
        RTC_SMOOTHCALIB_PLUSPULSES_RESET, %d);",
      -calib32s);
  }
  else {
    log("PLUS %d\r\n", calib32s); /* clock TOO FAST, ADD cycles */
    log("\r\nuse this on the target:\r\n");
    log("HAL_RTCEx_SetSmoothCalib(&hrtc, RTC_SMOOTHCALIB_PERIOD_32SEC,\
        RTC_SMOOTHCALIB_PLUSPULSES_SET, 0x1FF - %d);",
      calib32s);
  }
}
else {
  log("calibration complete! NO FURTHER CORRECTION REQUIRED\r\n");
}

测量了所需的校正后,我已经复制粘贴的代码手动,并必须闪光的目标板,以验证校准。稍后,当设备已经部署时,有选择地进行校准会更好.

我已经在STM32L011上使用过这种方法,但是这种方法或多或少与单片机的类型无关。在我的例子中,我在MHz发现板上使用了8位HSE和一个32位计数器。但是,当出现快速、稳定的HSE时,这种方法也应该以修改的形式工作,而不需要额外的硬件(除了1 1PPS源)。-我设法得到小于1 PPM的偏差,RTC精确地保持了几天的时间(温度的变化会对精度有很大的影响,因为我必须知道)。

这些发现也在STM32论坛上进行了讨论,但是页面现在正在下降,所以我不能把你指向.

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51513166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档