视频放大后不清晰,可将鼠标放在视频上,右上角出现“去bilibili观看”进行点击,转到B站观看清晰版本

一、简介

PWM,脉冲宽度调制,是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

二、重要概念

1、PWM的频率:

是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);也就是说一秒钟PWM有多少个周期
单位:Hz
表示方式: 50Hz

2、PWM的周期:

T = 1/f        周期 = 1/频率
50Hz = 20ms   一个周期

如果频率为50Hz ,也就是说一个周期是20ms,那么一秒钟就有50次PWM周期

3、占空比:

是一个脉冲周期内,高电平的时间与整个周期时间的比例
单位:% (0%-100%)
表示方式:20%

在上图中,频率F的值为1/(T1+T2),占空比D的值为T1/(T1+T2)。

三、PWM原理

单片机的IO口输出的是数字信号,IO口只能输出高电平和低电平。假设高电平为5V,低电平为0V,那么我们要输出不同的模拟电压,就要用到PWM,通过改变IO口输出的方波的占空比从而获得使用数字信号模拟成的模拟电压信号。

电压是以一种连接1或断开0的重复脉冲序列被加载到模拟负载上去的(例如LED灯,直流电机等),连接即是直流供电输出,断开即是直流供电断开。通过对连接和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值(即0~5V之间任意大小)的模拟电压。比方说,占空比为50%,那就是高电平时间一半,低电平时间一半,在一定的频率下,就可以得到模拟的2.5V输出电压,那么75%的占空比,得到的电压就是3.75V。

PWM的调节作用来源于对“占周期”的宽度控制,“占周期”变宽,输出的能量就会提高,通过阻容变换电路所得到的平均电压值也会上升,“占周期”变窄,输出的能量就会降低,通过阻容变换电路所得到的平均电压值也会下降。也就是,在一定的频率下,通过不同的占空比,即可得到不同的输出模拟电压。PWM就是通过这种原理实现D/A转换的。

总结:

PWM就是在合适的信号频率下,通过一个周期里改变占空比的方式来改变输出的有效电压。

四、PWM输出呼吸灯

人眼对于每11毫秒闪烁一次约83赫兹基本感觉不到闪烁,每13毫秒闪烁一次约66赫兹感觉到轻微频闪。那么我们平时见到的LED灯,当它的频率大于50Hz的时候,人眼就会产生视觉暂留效果,基本就看不到闪烁了,而是一个常亮的LED灯。

比如,你在1秒内,高电平0.5秒,低电平0.5秒,(频率1Hz)如此反复,那么你看到的LED灯就会闪烁。但是如果是10毫秒内,高电平5毫秒,低电平5毫秒,(频率100Hz) 这时候LED灯的亮灭速度赶不上开关速度(LED灯还没完全亮就又熄灭了),由于视觉暂留作用,人眼感觉不到LED灯在闪烁,而是感觉灯的亮度少了,因为高电平时间(占空比)为50%,亮度也就为之前的50% 。

频率很高时,看不到闪烁,占空比越大,LED越亮;

频率很低时,可看到闪烁,占空比越大,LED越亮。

所以,在频率一定时,可以用不同占空比改变LED灯的亮度。使其达到一个呼吸灯的效果。

代码如下:

/**********************************

变量定义

**********************************/

uint pwm_value;                 //pwm值

 

/**********************************

函数定义

**********************************/

/****

*******定时器0初使化函数

*****/

void Timer0_Init(void)

{

   TMOD &= 0xF0;                 //清除 T0 的工作模式

   TMOD |= 0x01;                 //配置 T0 的GATE=0; C/T=0; M1=0; M0=1;(模式1(16位))

   TH0 = (65536-921)/256;        //配置 T0 高8位计数初始值

   TL0 = (65536-921)%256;        //配置 T0 低8位计数初始值

   TR0 = 1;                     //启动 T0

   ET0 = 1;                     //启动 T0 中断

   EA = 1;                      //打开总中断

}

 

/****

*******T1计时中断函数

*****/

void Timer0_Handler(void) interrupt 1

{

   static uint pwm_count;

   TH0 = (65535-921)/256;           //重新赋初值

   TL0 = (65535-921)%256;

   pwm_count++;

   if(pwm_count >= 10)              //定义一段周期

   {

      pwm_count = 0;

   }

   if(pwm_count < pwm_value)        //改变占空比

   {

      LED = 0;

   }

   else

   {

      LED = 1;

   }

}

五、PWM调亮流程设计

首先初始化引脚,然后初始化定时器,在定时器中断函数中定义一个周期,调节周期内高电平的占空比,从而调整灯的亮度。

发表评论

后才能评论

本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。

最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。 若排除这种情况,可在对应资源底部留言,或联络我们。

对于会员专享、整站源码、程序插件、网站模板、网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。

如果您已经成功付款但是网站没有弹出成功提示,请联系站长提供付款信息为您处理

源码素材属于虚拟商品,具有可复制性,可传播性,一旦授予,不接受任何形式的退款、换货要求。请您在购买获取之前确认好 是您所需要的资源