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脉冲输出,因输出的脉冲频率每4ms变化一次,如何能够准确的控制脉冲输出?