Esp8266学习之旅④ 了解PWM,更为深入地用PWM控制一盏LED的亮度变化。(附带demo)

时间:2021-08-07 20:44:39


一、了解PWM的原理。


说到PWM,绝对大多数人的第一反应就是 方波 ,一折又一折的,看起来蛮有意思的,哈哈。不过,的确如此。

下面我大概地讲下PWM调光的原理。

  • 一般的,涉及到调光的亮度,大家都是想着用改变其通过其的驱动电流大小来改变亮度大小,的确如此,电流越小,那么其的亮度就越暗;反而,电流越大,亮度越亮。但是,不要超过最大电流,在额定电流±5%为好,小心您的灯会被烧坏。
  • 电阻调光时候,不知道大家有没有发现,每当你改变电阻大小,通过灯的电流都是瞬间改变的,所以您是无法想要你特定的亮度。
  • 而PWM调光是通过啥来调节灯的亮度呢?其实也是驱动电流大小。我们可以通过一个控制电压来惯性的成比例地控制LED的驱动电流来控制亮度,与上文说的方波就是一样的道理,占空比越大,亮度越暗。

所以,一句话:发射光的特性要随着驱动电流的大小改变而改变,而PWM就是有比例地控制电压来控制电流,从而稳定性地、平滑地控制驱动电流来控制灯的亮度。


二、8266硬件。


  • 下面是8266的SDK文档提到的PWM( 文档下载请在左边加群,或留言咨询):

Esp8266学习之旅④ 了解PWM,更为深入地用PWM控制一盏LED的亮度变化。(附带demo)


  • 下面是要弄实验一盏灯的原理图:

Esp8266学习之旅④ 了解PWM,更为深入地用PWM控制一盏LED的亮度变化。(附带demo)



Esp8266学习之旅④ 了解PWM,更为深入地用PWM控制一盏LED的亮度变化。(附带demo)


  • 下面我弄的亮度变化的一盏灯变化过程(纯手写,字有点模糊,莫怪莫怪!):

Esp8266学习之旅④ 了解PWM,更为深入地用PWM控制一盏LED的亮度变化。(附带demo)


三、电路图。


3.1、电路图。


Esp8266学习之旅④ 了解PWM,更为深入地用PWM控制一盏LED的亮度变化。(附带demo)


3.2、代码。


3.2.1 代码思路。


1、初始化pwm(周期,占空比,3通道数)。

 uint32 pwm_duty_init[3]={0};

//初始化 PWM,1000周期,pwm_duty_init占空比,3通道数
uint32 io_info[][3]=
{{PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12,12}{PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13,13},{PERIPHS_IO_MUX_MTDO_U,FUNC_GPIO15,15},};

//开始初始化
pwm_init(1000,pwm_duty_init,3,io_info);

2、为了明显看到效果:我用定时器不断循环。


    //定义定时器
os_timer_t timer;

//定时器使能
os_timer_disarm(&timer);

//定时器回调函数,我把回调函数设置为 display()
os_timer_setfn(&timer,display,NULL);

//定时器开始,1000表示每1s执行一次,1就是不断循环,0表示仅仅执行一次。
os_timer_arm(&timer,1000,1);

3、回调函数的display()。


uint32 duty=0;
void ICACHE_FLASH_ATTR display(void *arg)
{
for(y=0;y<3;y++)
{
for(z=0;z<12;z++)
{
duty=z*2000;
type=y;

//设置 PWM 某个通道信号的占空比, duty 占空比的值, type当前要设置的PWM通道
pwm_set_duty(duty,type);

//设置完成后,需要调用 pwm_start,PWM 开始
pwm_start();

}
}
}

国际案列(demo):https://github.com/xuhongv/StudyInEsp8266/tree/master/5_PWM_LED