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.

[参考译文] MSP430FR5969:高效的占空比计算?

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/586932/msp430fr5969-efficient-duty-cycle-calculation

器件型号:MSP430FR5969

计算 PWM 解码的占空比需要进行可恶的除法。  

DutyCycle =((unsigned long) ON_PERIOD* 100/周期); 

这将完全有效(只要 DutyCycle 无论如何都是 USHORT)、但需要大约500个周期来解决。 在进行一些 google 运算后、整数除法算法几乎不会短缺、因此德州仪器在 SLAA024中提供了32/16除法汇编器代码、并且同一个长除法算法在许多其他地方也是如此。 大约需要230个周期。 还有一些近似除法似乎更加巧妙、但我不确定它们与 MSP430的配合效果如何。  

现在、由于标称值和分母都不是常量、因此我们无法使用大多数快速除法方法。 我们*确实*知道结果介于1到99之间,这应该是有用的。  

除了重新发明车轮之外、是否有一种快速算法来完成这个十年前有人已经努力完成的特定工作?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    周期是常数吗? 即、您是否提前知道它? 如果是这样、您可以创建查找表。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想、只是做一些不太聪明的事情、比如将分母乘以16、32、48、64和80、然后进行比较、再进行循环递减+比较、如果您得到<结果、则会提供合理的性能。

    通过直接访问 MPY、您可以执行24/8乘法、从而获得更易于管理的32位数字。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我确实指出分母不是恒定的。 它是为 PWM 供电的器件将使用的任何东西。 我们可以定义限制、但仅此而已。 例如、在120Hz 至480Hz 之间。 理论上、屏幕刷新率为倍数、但您甚至不知道这一点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我指出、常数意味着提前知道。 您可以根据占空比重新计算查找表、也可以使用多个查找表并使用插值。

    或者具有所有可能的100/周期值的查找表。

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

    您如何确定准时? 如果您使用计时器、请调整计时器值、以便结果直接为占空比。 换言之、每个周期100个节拍。

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

    这实际上是一个很好的主意。 正如我在 OP 中所说的、我相信有人已经找到了一种很好的方法来实现这一点、而无需重新发明车轮或使用令人厌恶的数学方法。 PWM 周期应保持恒定(但事先不知道)、但无论如何、我可以像每秒一次一样对其重新采样。 我已经有用于性能指标的250ns 高速计时器、因此轻松测量 PWM 周期。  

    理想情况下、由于我的最大电流输出为320mA、因此可能应将其调整为320。 但我想、查找表是正确的答案、因为 LED 电流响应不是线性的、如果不查看代码、我就会觉得计算电流值需要进行另一项除法。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "所有可能的值"将是给定的范围、其中可能有2Hz 步长、以将误差保持在1-2%以内。 不是很实用。 您可以尝试将查找表最小化、以允许使用2x 4x 值、但仍然可以...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗯、理论上是个好主意、但你不能随意设置计时器节拍。 在1MHz SMCLK 下、最大计时器节拍为64µs μ s 为6.4ms 或156.25Hz 的100倍。 下一步是除以56、即5.6ms 和178.57Hz。 恐怕这是太粗调了。 SMCLK 也用于其他用途、因此不是真正的选择、实际上它设置为4MHz 以允许4MHz SPI 操作。

    我想我只需要使用32x32 MPY 来生成中间值以进行循环比较... 需要一些组装! 好的、只要不需要动态背光、我就不需要在任何时候对 PWM 的每一帧进行采样。

    解决该问题的另一种方法是在对 PWM 频率进行采样后对查找表进行预计算。 一个糟糕的100分频、然后继续将结果添加到自己、以生成查找表。 可能需要使用两个查找表、以便您可以除以(移位) 128、然后使用另一个具有128步长输出电流值的表。  

    还有一个想法是只做一次 divids*16,然后你可以做加法来生成循环比较方法的中间值(32、48、64、80)。