PIC单片机PWM信号生成与控制

脉冲宽度调制(PWM),说起来简单——不就是调调占空比、改改频率嘛。但真到用的时候,问题就来了:频率算不准、分辨率不够、电机一转系统就可能乱。这些年我在工业现场跟PWM打了N次交道,今天就聊聊PWM

一、PWM的三个最常见的应用场景

PWM的本质是用数字信号模拟模拟信号。通过快速开关,改变脉冲宽度(占空比),就能控制负载上的平均功率。

在工业控制中,PWM的用途可以归纳为三大类:

1. 电机调速与伺服控制

这是PWM最核心的应用。在工厂智能化改造中,我经常用PIC32MXPWM模块产生脉冲和方向信号,控制伺服驱动器和步进电机驱动器。伺服脉冲频率往往高达几百kHz,对PWM的精度和稳定性要求极高。

2. 电源与功率控制

从开关电源到LED调光,PWM都是主力。尤其是16PWM,分辨率更高,是电源、LED照明、色彩混合等应用的理想选择。

3. 信号生成

PWM还可以用来生成特定频率的信号,比如驱动红外LED进行遥控,或者生成SPWM波形用于逆变器控制。

二、PIC8位机PWM配置:

PIC16F系列中,PWM功能由CCPCapture/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

代码示例(PIC16F877A20kHz50%占空比) 

#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分辨率 = log[4×(PR2+1)] / log(2)位。频率越高,分辨率越低。例如PR2=0xFF时,频率约19.6kHz,分辨率10位;PR2=0x0F时,频率约200kHz,但分辨率只有6位。需要在两者之间找平衡。

三、PIC32MXPWM

到了PIC32MX系列,PWM的生成方式变了——通过输出比较(Output Compare)模块来实现。PIC32MX的输出比较模块支持单比较和双比较模式,可以产生单脉冲或连续脉冲。

配置步骤:

  1. 端口映射:将OC输出映射到指定的引脚(如RPA0配置为OC1
  2. 选择模式:设置OCM位为PWM模式
  3. 配置时基:选择16位或32位定时器作为时基
  4. 设置周期和占空比:通过定时器周期寄存器和OC比较寄存器控制

PIC32MX的优势在于多个输出比较通道可以独立配置不同的时基频率,这在需要同时控制多个不同速率的设备时非常实用。

四、SPWM

在需要驱动交流电机或逆变器的场合,普通的PWM不够用,需要SPWM(正弦脉宽调制) ——PWM的占空比按正弦规律变化,输出近似正弦波。

PIC单片机含有的CCP模块,利用此模块更容易通过软件实现SPWM。常用的方法是面积等效法:在正弦波的每个区间内,用对应面积的PWM脉冲去等效。软硬件结合设计,既保证了速度又保证了精度。

五、PWM控制伺服电机:

在工厂智能化改造中,我经常用PIC32MXPWM模块产生脉冲信号控制伺服驱动器。伺服电机本身精度高、响应快,但有一个致命的弱点——对干扰极其敏感

有一次,伺服一启动,旁边的传感器、光电开关、通讯模块全部误动作。排查后发现,伺服驱动器的脉冲方向接口没有隔离,高频噪声通过共用地线窜到了控制侧。

解决方案是在PIC控制板与伺服驱动器之间插入高速光耦隔离板。核心器件选用6N137高速光耦,最高速度10M,足以满足几百kHz的伺服脉冲频率要求。光耦兼容3.3V5V逻辑电平,PIC32MX3.3V而伺服驱动器要求5V时,它天然地完成了电平转换。同时,隔离板使用独立的隔离电源模块,从物理上切断了地线噪声的传播路径。

这块隔离板后来成了我所有伺服项目的标配。做PWM控制,不光要把信号发出去,还要确保信号能完整无损地到达目的地。

六、实战经验与避坑

1. 频率不是越高越好

PWM频率的选择要看负载。直流电机PWM频率通常在几kHz到几十kHz,太低会听到啸叫,太高会增加开关损耗。

2. 占空比更新要干净

PIC8位机上动态更新占空比时,建议在PWM周期结束时(即TMR2等于PR2时)更新CCPR1LDC1B,避免占空比在同一个周期内突变导致输出波形畸变。

3. 隔离不能省

控制伺服电机、变频器等大功率设备时,脉冲信号线一定要做隔离。普通光耦响应速度跟不上,必须用高速光耦(如6N137)。

4. 软件模拟PWM是最后的备选

如果用的PIC型号没有硬件PWM模块,也可以用定时器中断模拟。但软件模拟会占用大量CPU资源,只适合简单的调光或低频应用。但凡有硬件PWM可用,优先用硬件。

PWM看起来简单,但真正用好它,需要对频率、分辨率、占空比的计算烂熟于心,需要对负载的特性了如指掌,还需要对干扰的防护做到位。

后续干货不断,咱们一起在单片机的世界里,共同进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值