原来PWM这么简单!!

基本原理

PWM的全称是脉冲宽度调制Pulse-width modulation),是通过将有效的电信号分散成离散形式从而来降低电信号所传递的平均功率的一种方式;

所以根据面积等效法则,可以通过对改变脉冲的时间宽度,来等效的获得所需要合成的相应幅值频率的波形;

具体如下图所示;

由上图可知,脉冲宽度调制使用一个脉冲宽度会被调制的方波,并且波型的平均值会有所变化。

如果我们考虑一个周期为  的脉冲波  ,低值 ,高值为  ,跟占空比(duty cycle),此波的平均值为:

当  是一个脉冲波,它的值在  是  而在 是

上式的描述可以变为:

以上公式可以在很多状况下被简化,当  及 。

从这里可以看出,波型的平均值非常明显地直接与占空比  有关。

占空比

图中存在三种占空比状态,25%50%75%占空比状态,不难发现,假设占空比为D,则满足:

其中是PWM的周期,通常和载波的周期相同;

PWM是如何实现?

PWM实现的原理是通过锯齿波/三角波(载波)所需要合成的波形(调制波)进行比较,然后确定PWM所需要输出的极性,通常是ON或者是OFF,因为一般都是作用到开关元器件上;如下图所示;

振荡器和比较器

振荡器输出的锯齿波和参考值  进行比较,然后就可以输出PWM波形了;

matlabsimulink中搭建了一下仿真,具体如下图所示;

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实现了一个呼吸灯的简单程序。

‧  END  
(0)

相关推荐

  • 基于STM32F103的直流电机调速系统

    一.引言 电动机作为当前最主要的驱动部件,应用范围已遍及国民经济的各个领域,随着微处理器.电力电子.控制等技术的发展,电机控制技术以电力半导体变流器件的应用为基础,以电动机为控制对象,以自动控制理论为 ...

  • 全国大学生电子设计竞赛(三)--SPWM与PID

    干货福利,第一时间送达! 前两天回学校拿了毕业证和学位证,有几天没有更新了所以今天继续.听说今年的电赛还是会举行所以这些肯定是有帮助了,SPWM和PID的资料在网上一搜一把大,正点原子和野火的例程里面 ...

  • 原来PWM这么简单

    玩转嵌入式 602篇原创内容 公众号 PWM有非常广泛的应用,比如直流电机的无极调速,开关电源.逆变器等等.个人认为,要充分理解或掌握模拟电路.且有所突破,很有必要吃透这三个知识点: ①PWM,②电感 ...

  • 体内湿邪艾灸这样做,方法既简单又安全!你应该知道!

    现在人意识到湿浊才是现代人最大的健康顽敌.这也是我反复强调阳气不足,湿邪不去,吃再多药品补品都如同隔山打牛的意义所在. 老百姓都知道治病要除根,那么怎么才能除病根呢?其实祛除痰湿就是在挖病根,哪怕是认 ...

  • 三个简单的练习改善你的网球击球时机,快慢结合、随球而动

    但其实,我们看到的许多技术动作上的错误是由于不良的击球时机导致的. 今天分享3个针对性练习,偶尔把注意力从技术上移开放在这上面. 你会发现当你的击球时间和节奏得到改善之后,有些技术问题也会随之解决,击 ...

  • 肝功检查有4项很关键,2个方法轻松降低指标,养肝其实很简单

    肝脏参与人体多种功能的运转,不仅可以分泌胆汁帮助人体消化,还为人体承担着排毒代谢的重要责任. 肝脏受损后,身体一般没有特别明显的疼痛感,所以肝脏疾病容易被人忽略,耽误治疗时机. 检查肝功,这4项指标很 ...

  • 甲状腺医生杨国平解读:甲状腺囊肿简单食疗有哪些?

    得了疾病不想去医院,或者是在治疗后想通过食疗加速身体的恢复,其实,甲状腺囊肿也是可以食疗的,下面就为大家介绍一下简单地食疗有哪些? 饮食调养方法一:紫菜粥取干紫菜15克,猪肉末50克,精盐5克,味精1 ...

  • 一个简单的“捺”,被米芾写尽变化!

    <兰亭序>中,王羲之的二十一个"之"字各个不同,没想到从北宋书法家米芾的书法中捺也多种多样.而关于捺的几种写法也给各位书友总结好了,我们来一起看看吧- 01 三折捺 这 ...

  • 白菜腐竹生蚝煲,鲜甜开胃的潮汕菜,做法还很简单

    夏天天气,经常胃口不开,山哥给大家推荐一道白菜腐竹生蚝煲,鲜甜开胃又易学 夏天天气,经常胃口不开,山哥给大家推荐一道白菜腐竹生蚝煲,鲜甜开胃又易学 展开

  • 早晚温差大,试试这些穿搭范本,变美超简单!

    Hi,这里是搭搭 一个专注穿衣打扮,专属你美丽的时尚达人! ▼ 主编:搭搭 / 时尚编辑:百香果 小程序:巧百搭小卖部 虽然立夏已过,但是温度还是不能和盛夏相提并论. 没有炎热夏季那般热辣滚烫,但天气 ...

  • 上班族学生党快手早餐,10分钟搞定,简单好吃

    上班族学生党快手早餐,10分钟搞定,简单好吃