This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2340R5:32kHz RC 振荡器(LFOSC)的精度

Guru**** 2318830 points
Other Parts Discussed in Thread: CC2340R5
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1519507/cc2340r5-the-accuracy-of-the-32khz-rc-oscillator-lfosc

器件型号:CC2340R5
主题中讨论的其他器件: test2.

工具/软件:

尊敬的团队:

我的客户希望将 CC2340R5用于医疗应用、并 使用32kHz RC 振荡器(LFOSC)。

它们运行以下两个测试、以了解 具有48MHz HFOSC 的32kHz RC 振荡器(LFOSC)的精度:

测试1:

第1步: 将 LGPTimer 设置为每8ms 中断一次

第2步: 在启用 LGPTimer (8ms)之前、读取 RTC 的 TIME8U 寄存器。  

第3步:  LGPTimer 等待中断 125次、125*8ms 为一秒。

步骤4. 再次读取 RTC 的 TIME8U 寄存器-->  

第5步: 将步骤4和步骤2的两个值相减、即可得到 RTC 的精度。

 在25°C、1°C 和50°C 的摄氏度下进行测试后、步骤5的值小于2 (16us)。

如果此测试执行18小时、则时间差约为1秒。

测试2.  

标记当前时间、 并使用 TIME524M 寄存器执行累积时序。

18小时后、 TIME524M 寄存器计算出的时间 与系统时间相差约5秒。

请帮助为以下项目提供意见:

1. 上述测试方法是否可行?

  如果没有、请提供一种方法来确定 32kHz RC 振荡器(LFOSC ) 。

  我们需要使用它来补偿时间误差。

如果 CC2340R5的32KHz LFOSC 的精度可能随温度而变化、  请帮助检查规格。

谢谢。  

  

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mike:

    1.您提出的测试是可行的。  请提供您在测量 RTC 寄存器后计算时间差时使用的数学方法。  确保将 TIME524乘以0.524秒、如果通过软件完成数学运算、则确认余数已 计入、并且没有变量溢出。

    2.我会给硬件团队成员一条关于 LFOSC 随温度变化的评论,这是一个合理的问题,也是强烈建议使用 XOSC 的原因。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以预期、平均变化为±600ppm/ °C

    按钮

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ryan、  

    我的客户正在开发医疗应用、并需要 使用 CC2340每分钟对生命体征进行一次采样。

    因此、生命体征记录数将为每天60x24=1440条记录。

    手机应用程序需要 每天从 CC2340收集1440条记录。

    如果 CC2340 RTC 时间不够准确、则 生命体征 的记录数将不正确。

    通过 Test1和 Test2、我们知道 RTC 和 LGPTimer 之间的确切偏差。

    对于测试2、我的客户已经将 TIME524乘以0.524秒、得到 与系统时间不同的5秒。

    我们需要知道为什么 Test1(1秒)的时间差不同于 Test2(5秒)。

    我们还需要知道哪种方式(更好)更适合计算 RTC 与 LGPTimer 之间的精确偏差。

    然后、我的客户可以尝试补偿 RTC 以接近正确的值。

    请帮助提供意见。

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果 CC2340 RTC 时间不够准确、则 生命体征记录的数量 将不正确

    如果使用外部32kHz 晶体(XOSC)作为 LF 时钟源、RTC 将更加准确。

    我们需要知道为什么 Test1 (1秒)的时间差不同于 Test2 (5秒)。

    请提供每个实现方案的代码片段以供审核。

    请参阅此 类似的 E2E 主题 、其中524.288ms 是 TIME524的真实单位。  会在很长一段时间内产生显著差异。

    我们还需要知道哪种方法(更好)更适合计算 RTC 与 LGPTimer 之间的确切偏差。
    电话应用需要 每天从 CC2340收集1440条记录

    如果有手机应用 连接、则手机可以偶尔发送自己的时间戳、CC2340R5可以重新同步并相应地调整采样率。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果使用外部32kHz 晶体(XOSC)作为 LF 时钟源、RTC 将更加准确。

    由于使用外部32.768K 振荡器会导致 MCU 在 ESD 测试期间复位、因此我们必须切换到内部振荡器并使用校准方法来执行 RTC 时序。

    [报价 userid="114053" url="~/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1519507/cc2340r5-the-accuracy-of-the-32khz-rc-oscillator-lfosc/5843674 #5843674"]

    请提供每个实现方案的代码片段以供审核。

    请参阅此 类似的 E2E 主题 、其中524.288ms 是 TIME524的真实单位。  会在很长一段时间内产生显著差异。

    [/报价]

    void Calibration_RTCTimerCallback(LGPTimerLPF3_Handle lgptHandle, LGPTimerLPF3_IntMask interruptMask)
    {
        g_tRTC.uiRTC_Calibration_Count++;
        if(g_tRTC.uiRTC_Calibration_Count >= 125)
        {
            g_tRTC.uiRTC_Calibration_8us = HWREG(RTC_BASE + RTC_O_TIME8U);
            LGPTimerLPF3_disableInterrupt (hTimer_RTC, LGPTimerLPF3_INT_TGT);
            LGPTimerLPF3_stop(hTimer_RTC);
            if(g_tRTC.uiRTC_Calibration_8us < g_tRTC.uiRTC_Calibration_8us_old)
                g_tRTC.iRTC_Calibration_8us_diff = (g_tRTC.uiRTC_Calibration_8us + 0xFFFFFFFF) + g_tRTC.uiRTC_Calibration_8us_old;
            else
                g_tRTC.iRTC_Calibration_8us_diff = g_tRTC.uiRTC_Calibration_8us - g_tRTC.uiRTC_Calibration_8us_old;
    
            g_tRTC.dRTC_Calibration_perSecond = (double)(g_tRTC.iRTC_Calibration_8us_diff - 125000) * 0.000008;
        }
    }

        /* ----Calibration RTC Timer Initial ---- */
        hTimer_RTC = NULL;
        LGPTimerLPF3_Params LGPparams_RTC;
        LGPTimerLPF3_Params_init(&LGPparams_RTC);
        LGPparams_RTC.hwiCallbackFxn = Calibration_RTCTimerCallback;
        LGPparams_RTC.prescalerDiv = 48 - 1;
        uint32_t counterTarget_RTC;
        hTimer_RTC = LGPTimerLPF3_open(CONFIG_LGPTIMER_1, &LGPparams_RTC);
        if(hTimer == NULL)
        {
    //        while(1){}
        }
        counterTarget_RTC = 8000 - 1; // 8ms with a system clock of 48MHz
        LGPTimerLPF3_setInitialCounterTarget(hTimer_RTC, counterTarget_RTC, true);
        g_tRTC.uiRTC_Calibration_Count = 0;
        g_tRTC.uiRTC_Calibration_8us_old = HWREG(RTC_BASE + RTC_O_TIME8U);
        LGPTimerLPF3_enableInterrupt(hTimer_RTC, LGPTimerLPF3_INT_TGT);
        LGPTimerLPF3_start(hTimer_RTC, LGPTimerLPF3_CTL_MODE_UP_PER);



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    由于功耗问题、CC2340无法持续连接到手机。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ryan、

    感谢您提供此代码。  我认为这适用于测试1、对吧?  这会导致18小时后与实时时间相差1秒?  您的代码实现是合理的、我正在内部进行同步以确认首选的 LFOSC 校准方法。  如果您想回顾测试2、请同时提供、尽管它似乎不太准确。  您是否在系统时间内测量了 LGPTimer 的准确度?

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ryan、

    测试1使用外部48M +-10ppm 振荡器并开启 LGPTimer 来计算内部32.768K RTC 所用振荡器的误差。 计算结果是误差约为16us/秒。

    测试2用于验证测试1。 理论上、如果误差仅为每秒16us、那么在18小时后、应该只有大约1秒的差异、但实际上大约是5秒。 我想知道差异在哪里? 或者我的设置有问题吗?

    以下是我使用测试1524M RTC 并在睡眠后执行计算(1)时执行的误差计算

                    g_tRTC.uiRTC_0_524288s_count = HWREG(RTC_BASE + RTC_O_TIME524M);
                    g_tRTC.uiRTC_0_524288s_different = g_tRTC.uiRTC_0_524288s_count - g_tRTC.uiRTC_0_524288s_count_old;
                    g_tRTC.uiRTC_0_524288s_count_old = g_tRTC.uiRTC_0_524288s_count;
                    g_tRTC.dRTC_second += ((double)g_tRTC.uiRTC_0_524288s_different * 0.524288) + ((double)g_tRTC.uiRTC_0_524288s_different * 0.524288 * g_tRTC.dRTC_Calibration_perSecond);
                    sleep(1)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您需要使用 CCS 调试器确保 g_TRTC 值不会进行四舍五入或删除最低有效位。  我也建议不要依赖睡眠功能可靠地消耗1秒时间。  以下是一个逻辑分析仪测试、其中 GPIO 每秒切换一次:

    该延迟将随着 g_TRTC 逻辑的增加而增加。  下面是改用 ClockP 超时的测试(或者您可以像 Test1一样选择 LGPTimer):

    不过、我希望将您的校准技术与实际时间进行比较能够 找到最佳的代码实现方案。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    首先、g_trTC 使用 double 类型进行计算、因此理论上不会出现舍入问题。

    第二点:这与如何准确地消耗1秒无关吗? 因为无论如何消耗1秒的时间、我都会读取 RTC 寄存器的值以进行计算。 SLEEP (1)仅用于确保 CC2340进入 SLEEP 模式、不用于对 RTC 进行计数。 LGPTimer 如果长时间打开、会耗电。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    首先、g_trTC 使用双类型进行计算、因此理论上不会出现舍入问题。

    我同意、我相信已经采取措施来确认所执行的计算、因此我只想提醒您进行额外的检查、因为 CCS 编译器和优化设置可能会对计算产生影响。

    第二点:这与如何准确地消耗1秒无关吗?

    我没有完整的测试2实现、因此如果每次校准之间的延迟不必精确、那就没关系、我要提醒一下、ClockP 周期性软件中断将比相对睡眠功能更精确。  ClockP 支持睡眠模式、这与 LGPTimer 不同。

    此致、
    Ryan