PWM视频代码剖析与解释

1、不同频率LED灯闪烁
接下来我们以下面LED灯的闪烁代码为例子,改变延时长短来看LED灯的效果



通过三个对比实验我们发现随着频率的升高,我们的LED灯慢慢的开始感觉不到闪烁,由于我们人眼的视觉停留效应,一般大于50Hz的刷新率就能满足我们的要求

2、高频率LED闪烁变形过程
我们还是以这个代码,将频率固定在50Hz,然后保持周期不变即高低电平加起来的时间等于40ms,然后改变高低电平的占空比(高低电平占总周期的百分比),我们通过调节高低电平的延时的长度来调节亮度的占比
代码部分:




我们把上面的动作连贯起来,也就是说把亮度延时做成连续变化,为了在实际中效果更好,我们将延时改成延时200个us,这样连续变化效果更好
代码部分:

我们再进一步修改下,让它变成一个呼吸的效果
代码部分:


LED“流星雨”
首先我们先来分析下流星雨的逻辑:
首先我们要实现一个这样的效果,第一个最亮,然后后一个是前一个的45%的亮度

代码部分:

代码解释:
我门首先给亮度数组ledPwm[12]储存按比例分配的数值,这里我是按70%的一个比例来计算
比如说最暗是100,那么次暗的就是100*70% = 70,以此类推,然后我们就按照分配的亮度来把灯分别点亮
这部分代码是把所有LED灯先点亮
这部分代码根据LED灯的亮暗程度来分别控制灭的时间,我们先根据最大亮度值“maxPWM”来将亮度分为100份,每份的延时是1us,然后在内部的循环里面检查当前的亮度值是否到达分配的份数,如果到达了,那就熄灭,没有到达,就继续保持亮

让LED”流星雨“运动
显然这样静态的流星雨还是满足不了我们的要求,接下来我们让流星雨先动起来
我们需要它这样动

我们先试着让它动一位,我只需要把ledPwm[12]这个数组里面的值重新进行排列就可以了,这其实就是对数组操作


LED“流星雨”连续运动
从上面我们知道,我们如果有办法对数组进行连续的操作,那么就能实现“流星雨”流动的效果
所有代码参考这个哥们的:https://www.cnblogs.com/starsnow/p/4570462.html
其中下面这一点代码是arduino自带的时间计数器,可以直接读取里面的数值,用来辅助计数用的,其实你也可以不用这个,可以自己直接在里面计数也可以的
完整版代码:把所有需要改动的数值变量全部放在最前面,这是编写可复用程序常用的一种做法,可以灵活适应多个灯,同时可以调节速度,调节亮度比例


总结:
1、我们了解了PWM的实现方式
2、LED在不同的频率下,会“欺骗”我们的眼睛,这样是玩单片机中惯用的一种思路
3、通过剖析LED"流星雨",我们发现其实它就用了一些简单的处理方式实现的,没有我们想象中的那么复杂
4、LED"流星雨"里面有一点简单的算法,算法是独立于单片机的,在其他平台(51,STM32等)上面同样可以实现,同时算法也是一个程序的灵魂