完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
基本原理
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 输出,然后实现了呼吸灯的效果; intmain( void) { HAL_Init; MX_GPIO_Init; MX_TIM4_Init; MX_TIM3_Init; MX_TIM12_Init; int32_ttime_stamp = 0; int32_ttime_stamp_old = 0; int32_tccr_val = 0; uint8_tadd_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; } } } 整体效果如下: 《img al》 呼吸灯 通过示波器看其中的一路 PWM 输出的占空比也是随时间变化; PWM变化情况 总结 本文简单介绍了PWM的原理,以及如何产生PWM,可以通过锯齿波作为载波和调制波经过比较强,产生相应的PWM输出波形,最后结合STM32实现了一个呼吸灯的简单程序。返回搜狐,查看更多 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1618 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1545 浏览 1 评论
979 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1597 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
645浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
516浏览 3评论
532浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
505浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 16:08 , Processed in 0.835960 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号