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.

[参考译文] MSP430FR2676:使用32768Hz 时钟的10ms 计时器中断

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/935854/msp430fr2676-10-ms-timer-interrupt-using-32768-hz-clock

器件型号:MSP430FR2676

您好!

我正在处理一个功耗极低但需要相当精确的10ms 计时器中断的项目。 微控制器的大部分时间将处于低功耗模式3、但该系统计时器仍会每10ms 触发一次、并递增一个变量以跟踪相对时间。

我使用的计时器 A 具有外部32.768KHz 时钟源除以1。

我正在使用的比较值是328、它实际上会生成10.009765625ms 的中断、而不是10.0ms。 由于计时器的分辨率、精度上的这一微小差异导致从实际运行时间堆叠"漂移"。

是否有更好的方法可以在不 牺牲低电流消耗的情况下实现10.0ms 系统中断或系统运行时跟踪器、而我可以使用32.768kHz 时钟实现这一功能?

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

    听起来不像您真正需要10ms 的中断。 如果 ISR 不是递增变量、它可能会导致在高功率模式下花费大量时间。

    我可以考虑几种提高精度的方法。

    运行较慢的中断、并在需要时间值时读取当前计时器计数并将其与计数器结合使用。 (请注意、中断不会造成问题。)

    或者让 ISR 向更长的计数器添加定点值。 小数位可让您针对时钟误差进行调整。

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

    在向上计数模式下、您应该设置 CCR0=(Period-1)、在本例中为328-1、因为它也计数0。 [参考 UG (SLAU445I)图13-3]。 实际上、您正在计数(328+1)/32768=10.04ms。

    除了 David 的建议之外、您也可以这样做

    3) 3)使用不同的时基、如15.625ms。 这对代码来说很容易、但对人类来说可能很困难。

    4) 4)每隔这么多个周期添加(或减去)一个"跃点"。 您必须进行算术运算、但代码可能非常简单。 如果您想离开后端、可以在每个周期上调高/调低 CCR0值、从而产生计算出的抖动/抖动效应、以平均1秒。 (这就是 USCI 和 F2 BCS 时钟调制器的工作方式。)

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

    "是否有更好的方法在不 牺牲使用32.768kHz 时钟所能实现的低电流消耗的情况下实现10.0ms 系统中断或系统运行时跟踪器?"

    如果你牺牲一些东西,就不要这样做。

    以下是使用比较模块执行此操作的一种方法:

    1.将定时器设置为自由运行;

    2.设置一个比较模块、使其从现在起触发 ISR 328个节拍。

    在 ISR 中:

    1.从现在开始提前328次计时器计时。

    2.将软件计数器加32800;

    3.如果计数器大于32768,则从它子跟踪32768并执行某项操作。

    从长远来看、"某件事情"将在10ms 间隔内精确完成;但是、从周期到周期、您将遇到抖动。

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

    本质上、这里发生的情况是、来自各个周期的误差、即328个周期与327.68个周期的误差、是累加的、一旦发生了足够多的此类误差、您就会正确无误。 因此、时间是长期准确的、但短期不准确。

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

    余若薇:

    我想详细说明詹姆斯和戴维所说的话。

    请记住这一点。 32、768 Hz 是在10ms 内执行一系列指令的极低频率。 如果您需要精度、请将外部振荡器用于计时触发器、但如果需要、请考虑使用内部振荡器以更高的频率驱动主时钟、以执行指令。 当我是指一条指令时、我是指一条已被编译并加载到存储器中的指令。 您必须考虑在10ms 内执行单条指令所需的时钟周期数。

    还要记住这一点。 更高的频率会消耗更多的能量。

    该微控制器用户指南中名为"MSP430指令执行"的部分告诉我们执行单个指令需要多少个周期。 它的范围介于3到6个周期之间、具体取决于指令类型。 这不包括 CPU 中断系统加载中断服务例程所需的6个周期。

    要对周期进行计数、请将程序加载(调试模式)到微控制器中、然后从 View 菜单中选择 Disassembly 以查看代码窗口、然后从 Run 菜单中选择 Clock 以查看时钟(时钟将出现在主窗口的右下角)。 当您单步执行程序时、您可以计算执行指令所需的周期数。 了解所需的周期数后、我们就可以获得执行例程所需的时间。

    对于需要6个周期才能执行的指令、并且使用32768Hz 的时钟频率、处理器将能够在10毫秒内执行5.4条指令:

     (1条指令)/(6个周期)*(32768个周期)/(1秒)*(.001秒)/1 = 5.4条指令

    对于需要3个周期来执行的指令、并且使用32768Hz 的时钟频率、处理器将能够在10毫秒内执行10.9指令:

    (1条指令)/(3个周期)*(32768个周期)/(1秒)*(.001秒)/1 = 10.9条指令

    当我们降低时钟频率时、我们会减少每10ms 执行的指令数。

    祝您一切顺利。

    Thomas

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

    请注意、我已编辑了我的上一个帖子以删除一些错误。