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

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

相关推荐
海宇数据7 分钟前
零信任架构实战:基于海宇对外投资历史查询服务构建自动化异动企业筛查网关
运维·人工智能·架构·自动化
崇山峻岭之间10 分钟前
HC32F460PETB的PH2的TIM4_2_CLK
单片机
Brilliantwxx10 分钟前
【STM32】 I2C协议和设备主从( 图解 + 面试题 )
stm32·单片机·嵌入式硬件·架构
威嵌神州14 分钟前
星载计算机产品方案:商业卫星国产化平台
嵌入式硬件
老当益壮梁奶奶22 分钟前
51单片机中断系统详解
c语言·单片机·嵌入式硬件·学习·51单片机
Brilliantwxx24 分钟前
【STM32】 I2C 外设内部硬件结构和状态位
开发语言·stm32·单片机·嵌入式硬件
天空'之城9 小时前
单片机基础核心知识点汇总(三十五)
单片机·嵌入式硬件
secondyoung9 小时前
I2C通信协议详解
arm开发·驱动开发·stm32·单片机·嵌入式硬件·mcu·51单片机
anew___9 小时前
蜂鸣器播放音乐——让 Arduino 唱出旋律
c++·stm32·单片机·嵌入式硬件·c
jianqiang.xue11 小时前
ESP-IDF保姆级入门40|量产烧录与产线测试全解:批量烧录方案/校准流程/功能测试/不良分拣/产线追溯,掌握工业级量产交付全流程
单片机·物联网·esp32