关注、星标公众号,直达精彩内容

来源:网络素材

作者:菜刀和小麦

目录

  • 基本原理

  • 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!相关推荐

  1. 一文搞懂RNN(循环神经网络)

    基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ...

  2. 一文搞懂 Python 的 import 机制

    一.前言 希望能够让读者一文搞懂 Python 的 import 机制 1.什么是 import 机制? 通常来讲,在一段 Python 代码中去执行引用另一个模块中的代码,就需要使用 Python ...

  3. python语言语句快的标记是什么_一文搞懂Python程序语句

    原标题:一文搞懂Python程序语句 程序流 Python 程序中常用的基本数据类型,包括: 内置的数值数据类型 Tuple 容器类型 String 容器类型 List 容器类型 自然的顺序是从页面或 ...

  4. 一文搞懂 Java 线程中断

    转载自   一文搞懂 Java 线程中断 在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程 ...

  5. 一文搞懂HMM(隐马尔可夫模型)-Viterbi algorithm

    ***一文搞懂HMM(隐马尔可夫模型)*** 简单来说,熵是表示物质系统状态的一种度量,用它老表征系统的无序程度.熵越大,系统越无序,意味着系统结构和运动的不确定和无规则:反之,,熵越小,系统越有序, ...

  6. 一文搞懂如何使用Node.js进行TCP网络通信

    摘要: 网络是通信互联的基础,Node.js提供了net.http.dgram等模块,分别用来实现TCP.HTTP.UDP的通信,本文主要对使用Node.js的TCP通信部份进行实践记录. 本文分享自 ...

  7. 【UE·蓝图底层篇】一文搞懂NativeClass、GeneratedClass、BlueprintClass、ParentClass

    本文将对蓝图类UBlueprint的几个UClass成员变量NativeClass.GeneratedClass.BlueprintClass.ParentClass进行比较深入的讲解,看完之后对蓝图 ...

  8. 一文搞懂AWS EC2, IGW, RT, NAT, SG 基础篇下

    B站实操视频更新 跟着拉面学习AWS--EC2, IGW, RT, NAT, SG 简介 长文多图预警,看结论可以直接拖到"总结"部分 本文承接上一篇文章介绍以下 AWS 基础概念 ...

  9. 一文搞懂CAN FD总线协议帧格式

    目录 1.为什么会出现CAN FD? 2.什么是CAN FD? 3.CAN FD和CAN总线协议帧异同 4.解析CAN FD帧结构 4.1.帧起始 4.2.仲裁段 4.3.控制段 4.4.数据段 4. ...

最新文章

  1. 想成为一个数据科学家却不知道从何下手?这份路线图带你打开数据科学大门!...
  2. 程序人生【一些经典的资料】
  3. 桑文锋的数据“长征”
  4. git/码云上关于项目的一些操作:初始化、克隆、上传修改等
  5. uCOS-II任务的挂起和恢复
  6. 小众的分布式版本管理工具Code Co-op
  7. 11、oracle数据库下的事务和触发器
  8. 如何重启虚拟机里的ssh服务器,通过SSH重启 vSphere 虚拟机
  9. BiLSTM+CRF命名实体识别:达观杯败走记(下篇)
  10. 等比缩放公式_CVPR2019 | 旷视提出MetaSR:单一模型实现超分辨率任意缩放因子
  11. idea安装svn插件
  12. 迅雷7界面引擎XLUI_Bolt_SDK的调用例子
  13. Java技术体系简介
  14. 企业间数据竞争规则研究
  15. 【something】简单的平均脸制作
  16. NoSQLBooster for MongoDB软件使用
  17. 存款利息计算器html代码,html+jQuery简单的利息计算器
  18. 黄致绮 荣获第六季完美童模全球总决赛 全国总冠军
  19. 1024: 计算字母序号
  20. scipy.special.expit

热门文章

  1. python长度单位换算用def_计算字段示范
  2. DataBricks从开源到商业化踩过的坑
  3. dash 机器人 Android,用于 Dash 和 Dot 机器人的Blockly
  4. 游戏中的三角学——Sprite Kit 和 Swift 教程(1)
  5. 102道java算法
  6. 个人建设网站流程解说,手把手教你如何在阿里云上搭建自己的网站
  7. JavaEE 面试题总结
  8. STM32单片机裸机程序-高级实现实时性处理方法
  9. 我的人工智能之旅——偏斜类问题
  10. 《论文阅读》Global-Local Bidirectional Reasoning for Unsupervised Representation Learning of 3D Point Clou