STM32 中 PWM 的预分频器和周期值

Posted

技术标签:

【中文标题】STM32 中 PWM 的预分频器和周期值【英文标题】:Prescaler and period values for PWM in STM32 【发布时间】:2020-09-14 03:17:04 【问题描述】:

我正在使用 STM32F103C8Tx,我正在尝试创建一个 PID 可调 PWM。在 PID 中,我将为 PWM 提供 0 到 100 的值以设置占空比。这意味着我的计数器周期需要在 Cubemx 中为 100。因为正如我在更改荷兰语循环时了解到的那样,它会更改计数器周期。但是,我需要创建频率为 200 KHz 的 PWM,定时器的时钟为 72 MHz。为了在计数器周期内达到 100 的值,我需要一个 3.6 的预分频器。我是按照错误的方式还是我在 stm32 中弄错了这个 PWM 占空比?

注意:我使用htimx.Instance->CCRx =Duty_Cycle; 来更改代码的占空比。

【问题讨论】:

如果您使用 PWM 时钟滴答作为内部单位,而不是一些人为的“0 到 100”的东西,这可能更有意义。 PID 调节器不关心它是否计算周期、毫安或胡萝卜数,它只是原始数学。 是,但没有 PID 回路。我需要一个灵敏度至少为 100 的占空比。 (我需要将占空比设置为 %7 或 %52 等。)这意味着我的计数器周期至少需要为 100。为了便于计算,我想将其设为 100,这样我就不需要更改 PID 输出。 (PID 输出将作为占空比输入到定时器。)但我想 72 MHz 定时器时钟看起来不可能 Which means my counter period needs to be at least 100 百分之一是“整体”的 1/100。这并不意味着“整体”必须正好是 100。您不能将其设置为例如 18000 吗? 具有 72 MHz 时钟和 200 kHz 预期 PWM 频率。我可以设置的最大时钟周期是 360。使用预分频器“1”。 【参考方案1】:

要实现 0-100% 的占空比,您不必将计数器周期设置为 100。相反,您可以将其设置得更高,并且切换阈值也更高。让我们以您的示例为例,您需要 200KHz 频率,并且您的定时器时钟为 72Mhz,因此计数器周期应为 360,阈值应为htimx.Instance->CCRx = (int)(360 * dutyCycle / 100)。但是如果你用PID控制电机,你必须考虑它的死区,0-100%对应60-360,值应该是htimx.Instance->CCRx = (int)((360 - 60) * dutyCycle / 100)

如果您需要确切的值,您可以将系统频率调整为 50Mhz 甚至 100Mhz(可以,但我不鼓励这样做),或者您可以使用其他 MCU,例如 stm32f401ccu6,成本相同。

P/S:只是我的好奇,你想控制的目标是什么。我的意思是,如果是电机,我认为 200Mhz 相当高。为了控制电机,我通常使用 20Mhz(哦,我的低成本驱动器 :)),CCRx 值会更漂亮。

【讨论】:

谢谢。是的,我想这是唯一的方法。不,我不使用它驱动伺服电机。我使用两个 PWM 来驱动两个不同的 MOSFET。这会触发电池充电电路。

以上是关于STM32 中 PWM 的预分频器和周期值的主要内容,如果未能解决你的问题,请参考以下文章

stm32之PWM

STM32学习笔记-定时器PWM与输入捕获

STM32 PWM设定输出

利用STM32进行PWM脉冲输出,因输出的脉冲频率每4ms变化一次,如何能够准确的控制脉冲输出?

STM32F4 定时器 - 预分频器或周期值必须除以二才能得到我期望的结果

STM32定时器频率是不是等于PWM输出频率?