1、呼吸灯实现原理
呼吸灯简介:由亮到暗逐渐变化,很有节奏感地一起一伏,感觉好像人在呼吸,当手机收到消息,屏幕上的指示灯会渐变,比较显眼,能起到一个通知提醒的作用,其实这就是一个呼吸灯。一般人眼睛对于80Hz以上刷新频率则完全没有闪烁感(因人而异)。频率太小的话看起来就会闪烁,那么我们平时见到的LED灯,当它的频率大于50Hz的时候,人眼就会产生视觉暂留效果,基本就看不到闪烁了,而是一个常亮的LED灯。频率很高时,看不到闪烁,占空比越大,LED越亮(平均电压越大);频率很低时,可看到闪烁,占空比越大,LED越亮。所以,在频率一定下,可以用不同占空比改变LED灯的亮度,使其达到一个呼吸灯的效果。
实验原理分析:采用pwm控制LED灯,可以实现灯光亮度的变化,首先需要设置PWM频率高于50hz,这样LED灯才不会闪烁,形成连续的呼吸效果,实验中我取了200hz,就是周期为5ms。在不同的占空比下,LED灯光亮度不同,利用这个特性,可以连续的**每间隔一定时间段(取值为countTime)**就改变占空比,实验中采用的是占空比以2%的间隔依次增加到98%再减少至2%,也就是由暗变亮再变暗,间隔的时间段也就是countTime值越大,呼吸越慢,反之越急促。
2、IO口模拟PWM
PWM也就是脉冲宽度调制,简单点说就是某个固定周期内高电平所占时间除以这个固定周期时间,PWM周期就是这个固定周期时间,PWM的频率为周期的倒数,是指1秒钟内,信号从高电平到低电平的次数。比如PWM周期为5ms,在这5ms内信号实现一次由高到低,pwm频率为200Hz,也就是实现了200次由高到低的变化。
// PWM周期是5ms,改变ledOffTime时间改变占空比
void breathingLight(u16 ledOffTime)
{
static u16 sumTime=5000,ledOnTime=0;
ledOnTime=sumTime-ledOffTime;
LED0=0;
delay_us(ledOnTime);
LED0=1;
delay_us(ledOffTime);
}
IO口模拟PWM实现代码如上,以代码为例讲解:固定周期时间也就是PWM周期是5ms,这里取ledOffTime为600,得到的PWM波形如下图,采用这种方式,不断给IO口高电平持续一段时间,低电平持续一段时间就可以模拟产生pwm,但采用这种方式很浪费系统资源,因为需要一直赋值高低电平并等待,且波形不稳定,从图中也可以看出每隔一定时间,PWM波会有一处明显的不同,是因为此时系统在执行其它部分,没有在规定时间回到breathingLight函数,导致高电平时间变长。实现PWM的正常方式应该是采用定时器,利用定时器的一些具有PWM功能的引脚去产生PWM,很方便,另外一篇博客有写,此处不再详细讲述。文章来源:https://www.toymoban.com/news/detail-658543.html
3、使用keil软件的逻辑分析仪查看PWM波形
1、打开Debug选项
2、打开逻辑分析仪
3、选择要输出波形的IO口,并以特定格式输入对应IO口名称,
4、设置IO口输出显示类型为Bit和颜色
5、然后F5运行并停止滚动鼠标就可以查看波形了。
IO口模拟PWM_呼吸灯实验代码.zip文章来源地址https://www.toymoban.com/news/detail-658543.html
到了这里,关于IO口模拟PWM_呼吸灯实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!