1、PWM基础概念:什么是PWM、PWM的波形参数、PWM在电机控制中的作用
1.1 什么是PWM?从一盏灯说起
PWM,全称是脉冲宽度调制(Pulse Width Modulation)。
说白了,就是用数字信号去模拟模拟信号。你想想看,单片机或者DSP只能输出高电平(比如3.3V)和低电平(0V),但电机需要的是可变的电压,怎么办?
PWM就是答案。它通过快速开关,让负载“感觉”到的是一个平均电压。
我记得刚入行那会儿,带我的老工程师跟我说过一句话:“PWM就像你用手快速扇风,虽然手只在两个位置之间来回摆动,但风是连续的。”这个比喻我一直记到现在。
我在项目中遇到过一位刚毕业的同事,他死活不理解为什么一个方波能让电机转起来。我让他回去做个实验:用一个小灯泡接在PWM输出上,占空比从0%慢慢调到100%。他第二天兴奋地跑来说:“我懂了!灯泡不是一亮一灭,而是亮度在变化!”
嗯,这就是PWM的本质——用开关的“时间比例”来传递能量。
1.2 PWM的三个核心波形参数
搞电机控制,这三个参数你必须烂熟于心。我每次面试新人,第一个问题就是问这个。
1.2.1 频率(Frequency)
频率决定了PWM信号每秒钟开关多少次。单位是Hz。
举个例子:
- 1kHz的PWM,意味着每1毫秒完成一个周期
- 20kHz的PWM,每50微秒一个周期
频率的选择很讲究。选低了,电机会发出刺耳的啸叫声(人耳能听到20Hz~20kHz)。选高了,开关损耗会急剧增加。
我个人习惯,对于大多数直流无刷电机(BLDC),PWM频率选在16kHz~40kHz之间。具体选多少,要看你的MOSFET开关速度和死区时间。
1.2.2 占空比(Duty Cycle)
占空比就是高电平时间占整个周期的比例。用百分比表示。
公式很简单:
占空比 = (高电平时间 / 周期时间) × 100%
比如:
- 占空比50%:一半时间开,一半时间关
- 占空比100%:一直开,相当于直通
- 占空比0%:一直关,相当于断开
在电机控制中,占空比直接决定了电机的平均电压,进而控制转速。
1.2.3 分辨率(Resolution)
分辨率决定了你能把占空比细分到多精细。通常用“位(bit)”来表示。
举个例子:
- 8位分辨率:占空比可以分成256级(0~255)
- 10位分辨率:1024级(0~1023)
- 16位分辨率:65536级(0~65535)
分辨率越高,电机运行越平滑,但计算量也越大。
| 分辨率 | 级数 | 适用场景 |
|---|---|---|
| 8位 | 256 | 简单风机、水泵 |
| 10位 | 1024 | 通用电机控制 |
| 12位 | 4096 | 伺服电机、精密控制 |
| 16位 | 65536 | 高精度位置控制 |
1.3 PWM在电机控制中的作用
PWM在电机控制中,说白了就干三件事:
- 调速:通过改变占空比,改变电机端电压,从而改变转速
- 调转矩:通过控制电流,间接控制电机的输出转矩
- 节能:相比线性调节,PWM的效率高得多(MOSFET要么全开要么全关,损耗小)
你想想看,如果没有PWM,我们只能用可变电阻或者线性稳压器来调速。那效率低得吓人,电阻上白白消耗的能量比电机用的还多。
我记得有一次给客户做方案,对方坚持要用模拟电路调压。我给他算了一笔账:24V系统,电机额定电流5A,如果用线性调压到12V,光发热就有60W。客户当场就改主意了,说“还是上PWM吧”。
在电机控制中,PWM的应用场景包括:
- 直流有刷电机:最简单的应用,一个PWM信号直接控制H桥
- 直流无刷电机(BLDC):需要6路PWM,配合换相逻辑
- 永磁同步电机(PMSM):需要SVPWM(空间矢量调制),这是PWM的高级玩法
- 步进电机:用PWM控制电流斩波,实现微步进
1.4 一个简单的PWM配置示例
以STM32为例,配置一个20kHz、10位分辨率的PWM:
// 定时器时钟频率:72MHz
// 目标PWM频率:20kHz
// 目标分辨率:10位(即ARR = 1023)
// 计算预分频系数
// PWM频率 = 定时器时钟 / ((ARR+1) * (PSC+1))
// 20000 = 72000000 / (1024 * (PSC+1))
// PSC+1 = 72000000 / (20000 * 1024) ≈ 3.515
// 取整:PSC = 3
TIM_HandleTypeDef htim1;
htim1.Instance = TIM1;
htim1.Init.Prescaler = 3; // 预分频
htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1; // 中央对齐模式
htim1.Init.Period = 1023; // 自动重装载值
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&htim1);
// 配置通道1
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 512; // 初始占空比50%
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
// 启动PWM
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
1.5 本章小结
这一章我们聊了PWM的基础概念。说白了,PWM就是用数字的方式去控制模拟的世界。三个参数——频率、占空比、分辨率——是后续所有高级调制策略的基石。
下一章,我会带你深入PWM的生成原理,看看定时器到底是怎么“变”出这些方波的。到时候我会分享一个我踩过的坑,关于死区时间的设置,保证让你印象深刻。
嗯,今天就先到这儿。记住:基础不牢,地动山摇。把PWM搞明白了,后面的路就好走了。