c - STM32 中 PWM 的预分频器和周期值
问题描述
我正在使用 STM32F103C8Tx,我正在尝试创建一个 PID 可调 PWM。在 PID 中,我将为 PWM 提供 0 到 100 的值以设置占空比。这意味着我的计数器周期需要在 Cubemx 中为 100。因为正如我在更改荷兰语周期时了解到的那样,它会更改计数器周期。但是,我需要创建频率为 200 KHz 的 PWM,定时器的时钟为 72 MHz。为了在计数器周期内达到 100 的值,我需要一个 3.6 的预分频器。我是按照错误的方式还是我在 stm32 中弄错了这个 PWM 占空比?
注意:我使用 htimx.Instance->CCRx =Duty_Cycle;
它是为了从代码中更改占空比。
解决方案
要实现 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 值会更漂亮。
推荐阅读
- windows - 启动 Windows docker 容器时执行 .bat 脚本
- php - 我无法从数据库中获取信息,从而无法在下拉列表中的一行上端到端显示
- javascript - 使表单更新在 vue 中更简洁
- matplotlib - 为子图设置一个公共颜色条
- css - 为什么 CSS 动画不会淡出?
- amazon-web-services - 为什么 AWS EMR 需要 2 个不同的安全组用于主节点和核心/任务节点?
- html - 如何使用 SWI Prolog 的 http/html_write 库将 HTML 写入文件
- kubernetes - Kubernetes:当创建一个新的 mutating webhook 时,如何将这个 Mutation 应用到集群中的现有资源?
- ruby-on-rails - Rails - has_many through、STI 和范围
- python-3.x - 是否可以不必为函数的每次迭代复制代码