PWM是如何实现?(PWM基本原理)

出处:小麦大叔 发布于:2023-01-04 14:16:15

    PWM的全称是脉冲宽度调制(Pulse-width modulation),是通过将有效的电信号分散成离散形式从而来降低电信号所传递的平均功率的一种方式;
    所以根据面积等效法则,可以通过对改变脉冲的时间宽度,来等效的获得所需要合成的相应幅值和频率的波形;
    具体如下图所示;

   

    由上图可知,脉冲宽度调制使用一个脉冲宽度会被调制的方波,并且波型的平均值会有所变化。
    如果我们考虑一个周期为  的脉冲波  ,低值 ,高值为  ,跟占空比(duty cycle),此波的平均值为:
    当  是一个脉冲波,它的值在  是  而在 是
    上式的描述可以变为:
    以上公式可以在很多状况下被简化,当  及 。
    从这里可以看出,波型的平均值非常明显地直接与占空比  有关。
    占空比:
    图中存在三种占空比状态,25%,50%和75%占空比状态,不难发现,假设占空比为D,则满足:
    其中是PWM的周期,通常和载波的周期相同;
    PWM是如何实现?
    PWM实现的原理是通过锯齿波/三角波(载波)所需要合成的波形(调制波)进行比较,然后确定PWM所需要输出的极性,通常是ON或者是OFF,因为一般都是作用到开关元器件上;如下图所示;

    

    振荡器和比较器
    振荡器输出的锯齿波和参考值  进行比较,然后就可以输出PWM波形了;
    在matlab的simulink中搭建了一下仿真,具体如下图所示;

    

    simulink
    终输出波形如下:

    

    50%占空比
    这里简单说明一下:
    锯齿波(图中橙色波形)为10,然后我希望输出平均为5的波形(图1中红色的水平直线);
    那么通过比较,当锯齿波小于5时;PWM输出低电平,即为OFF;
    当锯齿波大于5时,PWM输出高电平,即为ON;
    所以再换一个思路,如果我希望输出一个电压逐渐升高的波形呢,该如何设计呢?
    其实很简单,只要把需要调制的波形设置为斜坡输出的波形就可以了,具体如下图所示;

 

    占空比逐渐增大
    可以看到,终占空比逐渐从0%增大到100%;
    然后我们继续想,能不能调制出其他的波形,比如调制一个正弦波sin wave,那也就是我们常说的SPWM,其实是可以的,具体如下图所示;

    

    SPWM
    分类
    参考STM32中PWM的配置,根据载波波形的形状,假设三角波值是10,那么它的变化过程可能存在以下两种情况:
    完整周期包括两个过程,先递增,再递减:
   
    少
    ,这种也叫中央对齐PWM;
    完整周期只有递增过程:
   
    中央对齐PWM
    脉冲波的中心将会被固定在时间窗格的中心,同时脉冲波的两边可以移动,使得波的宽度被延伸或压缩,具体如下图所示;

   

    中央对齐PWM
    另一种类型的PWM脉冲波形如下图所示;

   

    程序实现
    现在的MCU大部分都自带硬件PWM发生器,即配置好相应的寄存器,就能直接产生PWM,下面的例子基于NUCLEO-F767ZI,通过cubemx配置了三路PWM输出,然后实现了呼吸灯的效果;
    int main(void)
    {
    HAL_Init();
    MX_GPIO_Init();
    MX_TIM4_Init();
    MX_TIM3_Init();
    MX_TIM12_Init();
    int32_t time_stamp = 0;
    int32_t time_stamp_old = 0;
    int32_t ccr_val = 0;
    uint8_t add_flag = 1;
    HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2);
    HAL_TIM_PWM_Start(&htim12, TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);
    while (1)
    {
    time_stamp = HAL_GetTick();
    if(time_stamp - time_stamp_old > 5){
    time_stamp_old = time_stamp;
    if(add_flag){
    ccr_val+=25;
    if(ccr_val >= 0xFFFF){
    ccr_val = 0xFFFF;
    add_flag = 0;
    }
    }else{
    ccr_val-=25;
    if(ccr_val <= 0){
    add_flag = 1;
    ccr_val = 0;
    }
    }
    TIM4->CCR2 = ccr_val;
    TIM12->CCR1 = ccr_val;
    TIM3->CCR3 = ccr_val;
    }
    }
    }
    整体效果如下:

    

    呼吸灯
    通过示波器看其中的一路PWM输出的占空比也是随时间变化;
    PWM变化情况
    总结
    本文简单介绍了PWM的原理,以及如何产生PWM,可以通过锯齿波作为载波和调制波经过比较强,产生相应的PWM输出波形,结合STM32实现了一个呼吸灯的简单程序。
关键词:PWM

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

广告
上传BOM文件: BOM文件
*公司名:
*联系人:
*手机号码:
QQ:
应用领域:

有效期:
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:

0571-85317607

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!