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.
您好 TI 团队,
IAM 使用 TimerA 生成100ms 中断,我创建了一个计时器来显示时钟,我们以4位7段显示时间,但我们在1小时2小时内获得了1秒的时间偏移, 执行开始后2至4小时内的2秒时间漂移。
我认为这种时间偏移是由于 中断触发和 IKE CPU CLKS 而产生的,但在我的情况下,我不能想象得到这种时间偏移,我需要尽可能减少这种偏移。
就像我应该得到与当地时间一样的准确时间,并且不会有任何时间漂移。或者,24小时的时间应该小于1秒。
请查看我为计时器配置的寄存器值以获得100ms 中断,
TA0CCTL0 |= CCIE;//已启用 TACCR0中断
TA0CCR0 = 3285-1;//32768/10
TA0CTL = tassel_1 | MC_1;// ACLK,UP 模式
供我参考,我已经用了3个变量来计算秒,分钟,小时,这取决于100毫秒,每个变量增量来创建本地时间
我假设 ACLK 来自32KHz 晶体。 第一步是确保晶体符合您的精度要求。 您的错误似乎超过了最坏的(100ppm)晶体。
计时器将按计划生成中断。 除非您禁用中断很长时间,否则这将增加计数器的增量。 希望您将 MCLK 设置为高速,这样 CPU 就可以及时完成工作。
我不太确定你从哪里得到3285 (我希望是32776或3277)。
尽管如此,在2^15-Hz 时钟中获得10 (实际上是5)的系数有点痛苦。 您所要做的是,由于32768/10的分数,该错误是完全可以预测的。
一个解决方案是在您的整个期间内分发该错误。 一种公式:(2*3276=6552个刻度)+(8*3277=26216个刻度)=32768个刻度。 在代码术语中:从 CCR0=3276-1开始;当您的0.1秒计数器计数为2时,将 CCR0=3277-1;当计数器计数为10 (换行至0)时,重置 CCR0=32776-1。
这样,您的0.1秒计数器会抖动(.03%),但您的1秒计数器是正确的。
实际上,以前我曾尝试过 CCR0=3276-1,但当时我的时间漂移更多。
为了将 ACLK 作为来源,我们是否需要提供任何引脚选择指令,例如,ACLK 是 P2.2的辅助功能,所以我们需要提供如下指令
P2SEL0=BIT2;
P2SEL1 = BIT2;
P2DIR=BIT2;
当然,您可以这样输出 ACLK 到一个引脚。 但它来自哪里?
我怀疑您使用的是内部振荡器。 虽然很好,但不如水晶那么准确。
我们是否需要使用外置晶体 MSP430FR2433 EVK?我们是否没有内置晶体?如果我们有方法将其配置为 ACLK
如果您使用的是 FR2433 Launchpad,则会有一个晶体,但您必须做一点焊接。
一旦晶体物理连接,您就需要一些软件来启用它。 请参见示例 msp430fr243x_CS_04.c (第79-94行):
https://dev.ti.com/tirex/explore/node?node=AGi0Jkf6165naoMtm7ibJg__IOGqZri__LATEST
如果我们做了焊接,我们就不能将这些焊件用作正常的 GPIO 吗?
我不想使用外置晶体,那么使用内置晶体的解决方案是什么
您现在可能正在使用 REFO (32kHz)振荡器,该振荡器的额定值仅为+/-3.5%(>2分钟/小时)。 真正的问题是,如果没有“已知良好”的参考,您就无法进行调整(校准)以进行补偿。
如果您在实验室中使用此板(或多或少的恒定温度/电压),您可以选择将 ACLK 输出到 P2.2 (更正顺序为“P2SEL1 |= BIT2;P2DIR |= BIT2;”),并使用示波器测量 ACLK 并调整 CCR0值。
感谢 Bruce 的明确解释。
因此,根据你的解释,我可以得出这样的结论:REFO 是一个内部振荡器。
如果您连接晶体(焊接桥 R2/R3)并(a)拆除 R4/R5,则不能再使用管座引脚(b)不能拆除 R4/R5,我怀疑您不能使用管座引脚,因为晶体电路会干扰(但请咨询 EE 了解这一情况)。