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.

[参考译文] TMS320F28379D:补偿外部振荡器中的错误、以实现更精确的 CPU 定时器。

Guru**** 2529560 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/604718/tms320f28379d-compensating-for-error-in-external-oscillator-for-more-precise-cpu-timer

器件型号:TMS320F28379D

我使用两个容差更小的不同器件间接测量了两个 LAUNCHXL (79D 和77S)上的外部10MHz 振荡器。 两个振荡器都略高于其规格、但只要它们在整个时间内相对一致、这是可以的。 我所好奇的是对这一点进行补偿、这样我仍然可以有一个非常精确的 CPU 计时器来驱动一切-因为 LaunchPad 直接连接到我用于测量振荡器频率的器件。

这是基本问题。 其中一个 LAUNCHXL 的运行 频率为199,993,099.01Hz (SYSCLK)、因此如果我需要1Hz 计时器、它将是(199993099-1)的 PRD、这将在一年内产生1ms 的误差(显然参考时钟甚至不是这样精确、 但这是一个示例)。 但是、由于我需要一个10、000Hz 的计时器、所需的 div 将为19、999.31、四舍五入到(19999-1)-这将以更快的速度累加误差:每64.5秒损失1ms。 不可怕,但我想进一步降低,因为它将一次运行1-2小时。

我想的是使用第二个计时器(Timer1)定期复位第一个计时器(timer0)。 因此、如果我使用减速计时器来添加或减去/重置 timer0的值-可能是一个固定但预先计算的值、或者使用64位 IPC 计数器来精确跟踪它。

我只是想知道这是否可行。 如果 Timer1 ISR 只是在 timer0的寄存器上操作的准中断、这是否可以确定性地完成?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想这里有一个称为直接数字合成器的概念。
    您有一个可保持高精度跟踪的累加器。
    例如
    概念上
    计时器中断时的频率

    ACC = ACC + 19、999.31
    如果 ACC >= 20000

    NEW_div = 20000-1;//设置时钟计数间隔直至下一个中断
    ACC = ACC -20000;

    其他

    next _div = 19999 -1;//设置时钟计数间隔直到下一个中断
    ACC = ACC = 19999;


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

    感谢 可编程解决方案。 这听起来是可行的。 我真的很喜欢动态调整 PRD 而不是重置计时器的想法-因为我的测试显示 ISR 启动和复位之间存在不确定的周期滞后(通常只有+/-0-5个周期、 但它确实可能会上升一些时间)。 这意味着计时器本身永远不会被混乱、而只是在下一个周期中加载的值。 (在 ISR 启动后应该为数千个周期)。 现在、19999/20000 (或任何其他)周期的确切比率已知、因此我不必跟踪 IPC 计数器等内容、也不必使用第二个计时器。