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)。选高了,开关损耗会急剧增加。

⚠️ 避坑指南: 我曾经在一个风机项目中,把PWM频率设成了15kHz。结果客户投诉说电机有“嗡嗡”声。排查了半天,发现是频率刚好落在人耳敏感区。后来改到25kHz,问题立刻消失。人耳听不到,电机也安静了。

我个人习惯,对于大多数直流无刷电机(BLDC),PWM频率选在16kHz~40kHz之间。具体选多少,要看你的MOSFET开关速度和死区时间。

1.2.2 占空比(Duty Cycle)

占空比就是高电平时间占整个周期的比例。用百分比表示。

公式很简单:

占空比 = (高电平时间 / 周期时间) × 100%

比如:
- 占空比50%:一半时间开,一半时间关
- 占空比100%:一直开,相当于直通
- 占空比0%:一直关,相当于断开

在电机控制中,占空比直接决定了电机的平均电压,进而控制转速。

💡 核心要点: 占空比和平均电压的关系是线性的。如果电源电压是24V,占空比50%,那么电机两端的平均电压就是12V。当然,这是理想情况,实际还要考虑MOSFET的压降和死区效应。

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 高精度位置控制
🔧 实战技巧: 我建议初学者先从10位分辨率开始。够用,而且定时器配置简单。等把基础搞明白了,再往高分辨率走。别一上来就追求16位,有时候反而会因为定时器溢出把自己搞晕。

1.3 PWM在电机控制中的作用

PWM在电机控制中,说白了就干三件事:

  1. 调速:通过改变占空比,改变电机端电压,从而改变转速
  2. 调转矩:通过控制电流,间接控制电机的输出转矩
  3. 节能:相比线性调节,PWM的效率高得多(MOSFET要么全开要么全关,损耗小)

你想想看,如果没有PWM,我们只能用可变电阻或者线性稳压器来调速。那效率低得吓人,电阻上白白消耗的能量比电机用的还多。

我记得有一次给客户做方案,对方坚持要用模拟电路调压。我给他算了一笔账:24V系统,电机额定电流5A,如果用线性调压到12V,光发热就有60W。客户当场就改主意了,说“还是上PWM吧”。

在电机控制中,PWM的应用场景包括:

  • 直流有刷电机:最简单的应用,一个PWM信号直接控制H桥
  • 直流无刷电机(BLDC):需要6路PWM,配合换相逻辑
  • 永磁同步电机(PMSM):需要SVPWM(空间矢量调制),这是PWM的高级玩法
  • 步进电机:用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);
💡 个人建议: 刚开始学的时候,别纠结于中央对齐还是边沿对齐。先用边沿对齐模式跑起来,看到波形了,再慢慢研究其他模式。我当年就是太着急,一上来就想搞SVPWM,结果连基础波形都没调出来,折腾了两天。

1.5 本章小结

这一章我们聊了PWM的基础概念。说白了,PWM就是用数字的方式去控制模拟的世界。三个参数——频率、占空比、分辨率——是后续所有高级调制策略的基石。

下一章,我会带你深入PWM的生成原理,看看定时器到底是怎么“变”出这些方波的。到时候我会分享一个我踩过的坑,关于死区时间的设置,保证让你印象深刻。

嗯,今天就先到这儿。记住:基础不牢,地动山摇。把PWM搞明白了,后面的路就好走了。