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.

[参考译文] RTOS/MSP430G2553:MSP430G2553测量频率问题;

Guru**** 2558250 points
Other Parts Discussed in Thread: MSP430G2553, MSP430F5529

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/790594/rtos-msp430g2553-msp430g2553-measure-frequency-problem

器件型号:MSP430G2553
主题中讨论的其他器件: MSP430F5529

工具/软件:TI-RTOS

您好,我有测量频率的问题

我使用带有 P2.1 (TA1.1)的定时器捕捉模式来获得输入信号(几乎为0~266Hz 函数波);

但精度不准确。

我针对1Hz 频率测量的频率频率与我为 变量(timer_temp)值获取随机值的频率相同;它是随机的

因此、请帮助我进行调试。  

问题是时钟计时器不是0.5us;(我看到一个计时器时钟几乎等于0.50766u)

2.所有频率范围都不准确.... 假设为255Hz,代码将得到240~266Hz……


我找不到错误、请帮我解决。

这是我的项目。

e2e.ti.com/.../MSP430_5F00_CP_5F00_GetSpeed_5F00_20190408.7z

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您在应用中遇到的不准确性可能有多种原因。 240-266MHz 的范围是-5.88%-+4,313-%的偏差。 作为测量的时钟源和基准、您正在使用 DCO。 测量的精度永远不会比使用的基准更好。 DCO 的校准精度已经在+/-1%范围内。
    此外、DCO 不是一个相等的脉宽振荡器、而是通过调制得出最终频率、这取决于 DCO 和 MOD 位、即两个相邻频率之间的 DCO 频率。
    通过将使用的基准频率从16MHz 除以2MHz、您甚至可以降低分辨率并增加该调制的影响、因为该除法不会减轻 DCO 调制产生的抖动。
    在所有这些方面、我认为您的测量设置中遇到的误差与您实施的测量方法有关。

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

    因此、如果精度范围几乎为1%。
    那么,如果我测量266hz 的稳定频率,它可能会得到266+-1%?
    那么、我将得到大约263hz~268hz?

    但我找不到我的代码错误的原因。

    如果我找不到,那么我将不会调试目标

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我不确定我对 DCO 时钟的性质及其调制以及对精度的影响的看法是否足够清楚。 上述+/-1%只是 DCO 时钟脉冲特定周期内的校准精度。 使用所选 DCO 和计时器设置的给定分辨率会使+/-1%降低一部分。
    但如前所述、最大的偏差部分与 DCO 的调制有关。 请参阅用户指南 www.ti.com/.../slau144j.pdf 中的第5.2.6章 DCO 调制 器。 您可以在其中找到有关 DCO 行为的详细说明。
    分频后的 DCO 时钟与该调制相结合、可提高不精确度。
    但是、~+/-1%以及过热和 Vcc 变化(请参阅 MSP430G2553数据表中的 DCO 精度规格)的情况下、精度结果肯定会比 DCO 精度差。

    此致
    Peter
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    请告诉我们、您是否需要有关此主题的进一步支持。 非常感谢。

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

    如果我更改另一个 MCU、可能会解决此问题?

    它看起来像这样的 DCO 会导致结果上的误差。

    如果在正常情况下、DCO 时钟的误差范围可能为5%。

    因此,我认为我可以将 MCU 更改为测试。 与 tesy 的代码相同。  

    结果可能会有所不同。

    如果我使用 msp430F5529来替换 mps430g2553、您是否有建议?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您是否根据 DCO 时钟的性质和您的 SW 方法执行了可实现精度的误差计算? 我建议您这样做。 根据、您还可以评估您是否从代码中获得额外误差、或者观察到的精度限制是否与 DCO 相关。

    关于您对另一个 MSP430微分器的可选更改的问题、上述计算也将在这方面为您提供答案。
    从最高层次的角度来看、在考虑选择另一个 MSP430衍生产品时、需要考虑两个因素。 DCO 在所有 MSP430器件中都使用调制方法来提高 DCO 频率分辨率。 MSP430器件中实现的 DCO 型号之间的唯一区别如下:
    DCO 和 MOD 位的分辨率、意味着 DCO 步长在不同的 MSP430系列中有所不同、因此调制产生的误差也各不相同。 (有关指定值、请参阅相应的器件数据表)
    2.在 MSP430系列中实施的时钟系统有两个基本差异。 有些具有不带 FLL 的 DCO、其中 DCO 精度在一位数%范围内。 还有另一种变体、其中 DCO 本身不那么稳定、而是由集成的 FLL 稳定、其中产生的 DCO 精度等于 FLL 使用的基准频率精度。 这意味着、如果 FLL 使用32kHz 晶体、那么 DCO 将达到32kHz 晶体的长期精度、如果您将 REFO 用作 FLL 的参考时钟、 当然、最终的精度也只能达到 REFO 的精度水平。

    在任何情况下都可以实现最高精度、在使用晶体时钟进行测量时、当然、对于晶体、也需要考虑分辨率。 这意味着、如果您要测量分辨率为1%的频率、则测量时钟的频率至少需要高100倍、如果目标为0.1%、则至少需要高1000倍。

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

    但我的代码使用2MHz 来测量频率;

    分析物仅为0~266hz。我的来源大于7518放大;

    正如您所说的,精度应为0.1%;

    因此我的结果应该是266hz,但结果不是它的范围大约为258~270hz,

    当我使用 提供266Hz 和5.0交流电压以进行测量的固态交流电源时。

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

    这是我绘制 的流程图图片。

    我的流程图上是否有明显的错误?

    我找不到错误的位置???:

    注释:抱歉,时间小于1秒,图表需要修复。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    根据您的流程图、您好像要使用第一次捕获事件清除计时器值?
    是这样吗? 您的打算是什么? 无论如何、这不是一个好的做法、因为这会引入额外的误差。
    基本上、在查看用于测量脉冲的纯计时器操作时、应如下所示:

    1:启用/配置用于捕捉中断的定时器(例如下降沿)
    2.存储第一个捕获事件(第一个下降沿)的定时器值
    存储第2个捕获事件(第2个下降沿)的值
    4.在第2次和第1次捕获事件之间建立差异(理想情况下、266Hz 和完美2MHz 应符合规定的7518、DCO 校准精度最低为7443 - 7593。 如果与 DCO 校准后的值存在温度偏差、则会出现额外的误差、并且与 DCO 调制有关、也会出现一些误差(您是否计算了该部分?)

    另一个问题是频率信号的性质。 它是数字的、表示方波、具有陡峭的边缘、还是测量模拟信号、例如正弦波或类似信号?

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

    1:启用/配置用于捕捉中断的定时器(例如下降沿)

    正边是我被使用的。
    2.存储第一个捕获事件(第一个下降沿)的定时器值

    是的,但为什么不能清除定时器的值?

    存储第2个捕获事件(第2个下降沿)的值

    是的、但为什么不能使用2D-1nd (零)?

    4.在第2次和第1次捕获事件之间建立差异(理想情况下、266Hz 和完美2MHz 应符合规定的7518、DCO 校准精度最低为7443 - 7593。 如果与 DCO 校准后的值存在温度偏差、则会出现额外的误差、并且与 DCO 调制有关、也会出现一些误差(您是否计算了该部分?)

    我测量始终重复频率的方波(范围为0~266HZ)

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

    您好!

    清除计时器的要点如下:

    由于16位 CPU 架构和16位计时器长度、因此不需要该值、除非您通过 FFFFh 进行了多次转换、否则该差值与定时器的任何起始值之间的差值甚至是正确的。 这就是存在溢出标志的原因、指示这种情况。

    2、精度方面更重要。 当清除定时器时、唯一的机会是通过中断。 中断意味着、实际捕获事件和执行清除计时器之间存在一定的延迟。 根据正在执行的指令、是否有其他中断处于活动状态并提供服务、即使使用 RTOS、也可能有更高的延迟。 如果按预期使用捕获、则应避免这些错误。

    "是的、但为什么不能使用第2–1 (0)?"

    如上所述、基于 CPU 的计时器清除会引入难以控制的错误。

    第4点。

    抱歉、您尚未回答有关器件温度的问题。 请记住、DCO 也会随温度漂移。 实际上、我还需要纠正自己。 DCO 校准精度、请参阅器件数据表、温度为30°C +/-3%

    此致

    Peter

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

    但是、如果我存储第1个和第2个值、如果发生超额流量、这可能会在时间校准方面变得复杂;
    这可能是许多情况;
    比如
    如果
    1.TACCR1 (第1次)>TACCR1 (第2次)-->过流?
    =>非 over_flow => t = TACCR1 (2nd)-TACCR1 (1st);
    => over_flow => t = TACCR1 (2nd)-TACCR1 (1st)+over_flow_times*65536;
    => over_flow => t = TACCR1 (2nd)-TACCR1 (1st)+????
    如果 over_flow_value 有一个范围;如何确定它的位置?
    如 over_flow_time > 40 -> over times=0;
    2.TACCR1 (第1次) 该值为本机值;发生在 over_flow 上
    =>时间= 6556-TACCR1 (第一个)+TACCR1 (第二个);
    =>需要解码1;
    --------------------------------------
    这种第一个1 =>构建3情况。 优先级为 fst;
    我将考虑情形1来设计情形2
    =>这可能是许多公式,那么我如何设计呢?

    --------------

    温度可能为25°C~40°C;

    如果 tol 可能为3%。

    这个项目可能有一个大的巨浪;

    266*1.03=>273.98

    266*0.97=>258.02

    如果 TOL 是肯定的,我的结果就是这样的数据  

    正如我所说的,我测量的266HZ 几乎达到258~270HZ....

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

    您好!

    抱歉、您仍然不理解我关于定时器的16位格式和 CPU 的16位架构的说法、这从本质上解决了单次溢出的问题。

    尝试根据示例对其进行解释:

    请记住、16位值的范围是0h - FFFFh

    请在此处查看具有16位 CPU 的16位计时器的行为。

    如您所见、只要测得的脉冲长度不超过一个 FFFFh 定时器周期的长度、在计算差值时、从 FFFFh 到0h 的翻转不会产生误差、266Hz 肯定不会产生误差。

    此致

    Peter

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、但我认为这种方法差异可能会降低一个计数的平静度。 这似乎不是此代码的主要问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正如我试图解释的那样、第一个捕捉事件后由 CPU 清零定时器引起的错误会引入一个不可预知的错误。 我建议包含建议的程序、并使用该方法检查行为。 如果这还不够、我们可以采取下一步。

    此致
    Peter
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您是否能够向前迈出一步? 推荐测试的结果是什么?
    请告诉我、您是否需要有关此方面的进一步支持? 非常感谢。

    此致
    Peter
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    未解决
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、如果我更改的代码

    获取 fst 值和 snd 值
    那么 value = snd-fst value->我可以理解、但它仅在单独向下32.768ms 时才会出现
    如果信号信号信号较大、那么32.768就会溢出、为什么您说它自己会解析呢?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、您想解释一下。

    测量值为(0000H~FFFFh)->(0~65536)=>1值=0.5us
    (0~65536)=>(0~32.767ms)捕获为低电平错误。
    这意味着(INF ~30)的值,这意味着 FEQ 大于30Hz,信号几乎可以吗?
    但结果不等于理论。
    如果我要测量以下单次采样、即32.767ms (30Hz)、则捕获可能会溢出
    那么、如何在代码中修复呢?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    非常感谢您提供的更新。 我只是逐步解决多个问题。
    第一点是解释通过清除计时器寄存器来避免错误的原理。 我希望我能够澄清这一点、现在您能够以预期的精度测量266Hz 的频率。
    那么、下一个要点当然是将可能的频率输入范围扩展到您所需的范围。 现在、正如您正确提到的、在特定的输入频率下、您会遇到多个溢出、或者更好的说、此时测量间隔超过 FFFFh、这意味着计时器的长度、您需要额外的 SW 功能来解决这一问题。 我会为此目的使用捕捉溢出中断。 因此、在 ISR 中、您将计算溢出数、并相应地将计时器周期数添加到计算中。
    此外、还应包含另一种算法/功能来解决这一问题。 但这取决于您是否希望在代码中包含这种复杂性、另一方面取决于您想要测量频率的速度、以及是否可以针对"一"频率运行多个测量。 我所讨论的是调整计时器频率、该频率来自时钟速度、这样可以避免在0Hz 开始时可能无法实现的过流、然后在看到低分辨率时逐步提高计时器时钟速度。

    此致
    Peter
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我建议现在结束这项工作,因为解决这一问题有一个很好的建议基础,在这一问题上,实际执行和测试当然需要一些时间。
    如果存在其他问题、我们仍然可以重新打开它、或者根据新方面的性质创建新线程。

    此致
    Peter