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

脉冲宽度调制(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的输出比较模块支持单比较和双比较模式,可以产生单脉冲或连续脉冲。

配置步骤:

  1. 端口映射 :将OC输出映射到指定的引脚(如RPA0配置为OC1)
  2. 选择模式 :设置OCM位为PWM模式
  3. 配置时基 :选择16位或32位定时器作为时基
  4. 设置周期和占空比 :通过定时器周期寄存器和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看起来简单,但真正用好它,需要对频率、分辨率、占空比的计算烂熟于心,需要对负载的特性了如指掌,还需要对干扰的防护做到位。

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

相关推荐
交友如交1 小时前
对于Prompt的思考:从“手写”到提示词采样、A/B Test 与自动化评测
人工智能·自动化·prompt
Amy187021118232 小时前
告别“爬楼抄表”时代:电梯计量自动化改造,让每一度电都“开口说话”
运维·自动化
曦尧2 小时前
开源后台编程 Agent 系统 background-agents:架构拆解与落地判断
ai·自动化
A小调的码农3 小时前
OPENOCD+MSYS+VSCODE:从“灯不亮“到“终于亮了“
ide·vscode·stm32·单片机·编辑器
keke.shengfengpolang3 小时前
自动化考什么证书对就业有帮助?
运维·自动化
乐橙开放平台3 小时前
巡店系统笔记:乐橙 listDeviceDetailsByPage 台账 + bindDeviceLive 辅码流最小闭环
网络·笔记·物联网·自动化·音视频·智能家居
程序员吕洞宾3 小时前
开源多维表格SmartTable V1.6.1:工作流画布,让自动化工作流配置更直观、更方便
java·开源·自动化
嵌入式-老费4 小时前
esp32开发与应用(用好ttl转485模块)
stm32·单片机·嵌入式硬件
xo198820114 小时前
鸿蒙 AI 自动化开发:让 AI 学会自己编译、自己调试
人工智能·自动化·harmonyos
HackTwoHub5 小时前
AI大模型攻击思路,涵盖提示词劫持、知识库投毒、多语种混淆 + 身份伪装、诱导 AI 输出涉密后台核心配置
人工智能·安全·web安全·网络安全·自动化·系统安全·安全架构