目录

  • 基本原理

  • 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-

整理文章为传播相关技术,版权归原作者所有 |

| 如有侵权,请联系删除 |

往期好文合集

什么是PWM“死区”?

电子设计竞赛(三)-SPWM与PID

PCB工程师的7个好习惯

最 后

若觉得文章不错,转发分享,也是我们继续更新的动力。

5T资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、单片机、等等

在公众号内回复「更多资源」,即可免费获取,期待你的关注~

天哪!原来PWM这么简单相关推荐

  1. 原来PWM这么简单!通过锯齿波作为载波和调制波经过比较,产生相应的PWM输出波形

    目录 基本原理 PWM是如何实现? 分类 程序实现 总结 基本原理 PWM的全称是脉冲宽度调制(Pulse-width modulation),是通过将有效的电信号分散成离散形式从而来降低电信号所传递 ...

  2. 这样理解PWM,想不懂都难!

    关注.星标公众号,直达精彩内容 PWM有非常广泛的应用,比如直流电机的无极调速,开关电源.逆变器等等.个人认为,要充分理解或掌握模拟电路.且有所突破,很有必要吃透这三个知识点: PWM 电感 纹波 P ...

  3. pwm一个时间单位_通过PWM进行数模转换的滤波电路分析计算

    数字处理芯片将数字转成模拟量可以通过处理器的D/A模块以及PWM模块实现. PWM是一种周期固定,而高低电平占空比可调的方波信号. PWM通过简单的RC滤波网络可以得到与信号占空比成线性关系的直接电压 ...

  4. STM32F411RE Nucleo笔记-按键控制PWM占空比

    STM32F411RE Nucleo笔记-按键控制PWM占空比 此次用到STM32F411RENucleo开发板,用到Keil MDK5.12和STM32CubeMx软件. 首先用STM32CubeM ...

  5. 电机调速设计并用matlab仿真,终稿毕业论文设计_基于PWM控制的直流电动机调速系统设计及MATLAB仿真.doc最终版(备份存档)...

    <毕业论文_基于PWM控制的直流电动机调速系统设计及MATLAB仿真.doc>由会员分享,可免费在线阅读全文,更多与<(终稿)毕业论文设计_基于PWM控制的直流电动机调速系统设计及M ...

  6. PIC单片机之PWM PWM原理

    1,什么是PWM      什么是PWM,专业点说脉宽调制,通俗点说 就是不断的输出高低电平. 比如 单片机 40ms的时间 输出高电平然后60ms的时间 输出低电平接着一直不断周期性的交替输出高低电 ...

  7. 无刷直流电机的PWM调制方式介绍

    无刷直流电机的PWM调制方式介绍 (2014-01-03 15:35:28) 转载▼ 标签: 无刷直流电机 pwm调制方式 bldc驱动方案 原文:http://blog.sina.com.cn/s/ ...

  8. 介绍PWM、PPM、S-BUS这三者的区别

    置顶公众号,不错过每一条消息! 公司同事之前购买了一个遥控器,当时主要是想用来遥控运动电机.我最近好奇,也去看了一下相关资料,并折腾了一下. 那个接收器就是用到了一个叫S-BUS的通信口(这里肯定有许 ...

  9. #小车记4--树莓派 GPIO PWM 实现初步控制

    树莓派 GPIO PWM 实现初步控制 写在前面的废话 1.L298N与树莓派的连线 2.Python 编程控制 (1).GPIO (2).PWM 写在前面的废话 有兴趣的读者,可以去看看本人主页里的 ...

最新文章

  1. 通过Java字节码发现有趣的内幕之String篇(上)(转)
  2. backbone.js全栈开发
  3. ZOJ Monthly, November 2012
  4. CSS UI状态伪类选择器
  5. 按图索骥:SQL中数据倾斜问题的处理思路与方法
  6. 手机号,银行卡号等自动分组显示的输入框
  7. Vue学习笔记(五)—— 状态管理Vuex
  8. Java基础学习总结(87)——坚持写Java等技术类博客的好处
  9. 2-9 prev + next选择器 “远亲不如近邻” 返回且只返回唯一-个元素。 而通过prev + next选择器就可以查找与“prev”元素紧邻的下一个“next”元素...
  10. 【codevs5037】线段树练习4加强版
  11. POST数据加密问题
  12. Android应用开发进阶
  13. WIN7不能访问共享文件夹
  14. 架构思维成长系列教程(八)- 电商供应链系统架构设计
  15. 史上最全源码安装ROS-BUG解决集合:在树莓派4B上安装Raspbian Bluster + ROS-kinetic + 配置navigation
  16. JAVA将图片背景色设置为透明
  17. php yar 安装失败_php 安装yar扩展
  18. JavaBean技术的应用——购物车
  19. 推荐十本C#编程的最佳书籍
  20. 百度员工抱怨:1月离职,没有年终奖。。。

热门文章

  1. wordpress插件在服务器上的存储位置
  2. SAP CRM和Hybris Commerce里关于价格折扣的一些配置
  3. task search in offline - three filters implementation
  4. UI Blue crystall class sap_bluecrystal is added here to html node
  5. APF filter到底支持多复杂的条件
  6. 通过调试获得SAP Fiori gateway系统的系统ID
  7. 如何通过Fiori后台调试的方式找到gateway系统的ID
  8. One order save debug screenshot
  9. 错误信息Make an entry in Field Text Area
  10. Adobe form batch output print mode - multiple