脉冲宽度调制(PWM),说起来简单------不就是调调占空比、改改频率嘛。但真到用的时候,问题就来了:频率算不准、分辨率不够、电机一转系统就可能乱。这些年我在工业现场跟PWM打了N次交道,今天就聊聊PWM。
一、PWM的三个最常见的应用场景
PWM的本质是用数字信号模拟模拟信号。通过快速开关,改变脉冲宽度(占空比),就能控制负载上的平均功率。
在工业控制中,PWM的用途可以归纳为三大类:
1. 电机调速与伺服控制
这是PWM最核心的应用。在工厂智能化改造中,我经常用PIC32MX的PWM模块产生脉冲和方向信号,控制伺服驱动器和步进电机驱动器。伺服脉冲频率往往高达几百kHz,对PWM的精度和稳定性要求极高。
2. 电源与功率控制
从开关电源到LED调光,PWM都是主力。尤其是16位PWM,分辨率更高,是电源、LED照明、色彩混合等应用的理想选择。
3. 信号生成
PWM还可以用来生成特定频率的信号,比如驱动红外LED进行遥控,或者生成SPWM波形用于逆变器控制。
二、PIC8位机PWM配置:
在PIC16F系列中,PWM功能由CCP(Capture/Compare/PWM)模块提供。以经典的PIC16F877A为例,配置步骤如下:
第一步:设定 PWM 周期(频率)
PWM周期由PR2寄存器决定。计算公式为:
PWM周期 = (PR2) + 1 × 4 × TOSC × (TMR2预分频值)
PWM频率 = 1 / PWM周期
比如:如果使用4MHz晶振(TOSC = 0.25μs),预分频设为1:1,想让PWM频率为20kHz,则:
PR2 = (20kHz × 4 × 0.25μs × 1) - 1 = (20000 × 1μs) - 1 = 199 ≈ 0xC7
这步算错了,后面的频率全都不对。
第二步:设定占空比
PWM的占空比由CCPR1L寄存器和CCP1CON的低两位共同决定,共10位分辨率。10位分辨率意味着占空比有1024个可能的值。
占空比的计算公式为:
占空比 = (CCPR1L:CCP1CON<5:4>) / 4 × (PR2 + 1)
第三步:配置引脚和启动定时器
将CCP1引脚(通常是RC2)设为输出,然后配置T2CON寄存器设置预分频并启动Timer2。
代码示例( PIC16F877A , 20kHz , 50% 占空比) :
#include <pic168xa.h>
// 配置位
#pragma config FOSC = HS // 4MHz晶振
#pragma config WDTE = OFF
#pragma config LVP = OFF
void PWM_Init(void) {
// 1. 设置PWM周期(PR2)
PR2 = 0xC7; // 20kHz @ 4MHz晶振
// 2. 设置占空比(50%)
CCPR1L = 0x01; // 高8位
CCP1CONbits.DC1B = 0b11; // 低2位,10位分辨率
// 3. 设置CCP1引脚为输出
TRISC2 = 0;
// 4. 启动Timer2,预分频1:1
T2CON = 0x04; // 使能Timer2,预分频1:1
}
void main(void) {
PWM_Init();
while(1) {
// 占空比在中断或主循环中动态修改
}
}
分辨率与频率的权衡 :PWM分辨率 = log4×(PR2+1) / log(2)位。频率越高,分辨率越低。例如PR2=0xFF时,频率约19.6kHz,分辨率10位;PR2=0x0F时,频率约200kHz,但分辨率只有6位。需要在两者之间找平衡。
三、PIC32MX的PWM:
到了PIC32MX系列,PWM的生成方式变了------通过**输出比较(**Output Compare )模块 来实现。PIC32MX的输出比较模块支持单比较和双比较模式,可以产生单脉冲或连续脉冲。
配置步骤:
- 端口映射 :将OC输出映射到指定的引脚(如RPA0配置为OC1)
- 选择模式 :设置OCM位为PWM模式
- 配置时基 :选择16位或32位定时器作为时基
- 设置周期和占空比 :通过定时器周期寄存器和OC比较寄存器控制
PIC32MX的优势在于多个输出比较通道可以独立配置不同的时基频率,这在需要同时控制多个不同速率的设备时非常实用。
四、SPWM:
在需要驱动交流电机或逆变器的场合,普通的PWM不够用,需要SPWM (正弦脉宽调制) ------PWM的占空比按正弦规律变化,输出近似正弦波。
PIC单片机含有的CCP模块,利用此模块更容易通过软件实现SPWM。常用的方法是面积等效法:在正弦波的每个区间内,用对应面积的PWM脉冲去等效。软硬件结合设计,既保证了速度又保证了精度。
五、PWM控制伺服电机:
在工厂智能化改造中,我经常用PIC32MX的PWM模块产生脉冲信号控制伺服驱动器。伺服电机本身精度高、响应快,但有一个致命的弱点------对干扰极其敏感 。
有一次,伺服一启动,旁边的传感器、光电开关、通讯模块全部误动作。排查后发现,伺服驱动器的脉冲方向接口没有隔离,高频噪声通过共用地线窜到了控制侧。
解决方案是在PIC控制板与伺服驱动器之间插入高速光耦隔离板。核心器件选用6N137 高速光耦,最高速度10M,足以满足几百kHz的伺服脉冲频率要求。光耦兼容3.3V和5V逻辑电平,PIC32MX是3.3V而伺服驱动器要求5V时,它天然地完成了电平转换。同时,隔离板使用独立的隔离电源模块,从物理上切断了地线噪声的传播路径。
这块隔离板后来成了我所有伺服项目的标配。做PWM控制,不光要把信号发出去,还要确保信号能完整无损地到达目的地。
六、实战经验与避坑
1. 频率不是越高越好
PWM频率的选择要看负载。直流电机PWM频率通常在几kHz到几十kHz,太低会听到啸叫,太高会增加开关损耗。
2. 占空比更新要 " 干净 "
在PIC8位机上动态更新占空比时,建议在PWM周期结束时(即TMR2等于PR2时)更新CCPR1L和DC1B,避免占空比在同一个周期内突变导致输出波形畸变。
3. 隔离不能省
控制伺服电机、变频器等大功率设备时,脉冲信号线一定要做隔离。普通光耦响应速度跟不上,必须用高速光耦(如6N137)。
4. 软件模拟 PWM 是最后的备选
如果用的PIC型号没有硬件PWM模块,也可以用定时器中断模拟。但软件模拟会占用大量CPU资源,只适合简单的调光或低频应用。但凡有硬件PWM可用,优先用硬件。
PWM看起来简单,但真正用好它,需要对频率、分辨率、占空比的计算烂熟于心,需要对负载的特性了如指掌,还需要对干扰的防护做到位。
后续干货不断,咱们一起在单片机的世界里,共同进步。