-
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。
6 、Esp8266之 了解 SmartConfig与Airkiss一键配网,给8266配网上云端。无需把wifi名字密码写在固件里。
9、 Esp8266进阶之路第一篇: [小实战上篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。
10、 Esp8266进阶之路第二篇: [小实战下篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。
11、 Esp8266进阶之路第三篇: 8266接入阿里智能,点亮一盏LED灯,期待天猫精灵语音控制的不约而至!
12、 Esp8266进阶之路第四篇: 图文并茂学习阿里云主机搭建8266MQTT服务器,实现移动网络远程控制一盏LED。
13、 Esp8266进阶之路第五篇: 动手做个8266毕设小案例,smartConfig + MQTT协议轻松实现远程控制一盏LED。
14、 Esp8266进阶之路第六篇: esp8266的Rtos系统学习的正确姿势 [上篇]—— 环境搭建、烧录。
一、了解PWM的原理。
说到PWM,绝对大多数人的第一反应就是 方波 ,一折又一折的,看起来蛮有意思的,哈哈。不过,的确如此。
下面我大概地讲下PWM调光的原理。
- 一般的,涉及到调光的亮度,大家都是想着用改变其通过其的驱动电流大小来改变亮度大小,的确如此,电流越小,那么其的亮度就越暗;反而,电流越大,亮度越亮。但是,不要超过最大电流,在额定电流±5%为好,小心您的灯会被烧坏。
- 电阻调光时候,不知道大家有没有发现,每当你改变电阻大小,通过灯的电流都是瞬间改变的,所以您是无法想要你特定的亮度。
- 而PWM调光是通过啥来调节灯的亮度呢?其实也是驱动电流大小。我们可以通过一个控制电压来惯性的成比例地控制LED的驱动电流来控制亮度,与上文说的方波就是一样的道理,占空比越大,亮度越暗。
所以,一句话:发射光的特性要随着驱动电流的大小改变而改变,而PWM就是有比例地控制电压来控制电流,从而稳定性地、平滑地控制驱动电流来控制灯的亮度。
二、8266硬件。
- 下面是8266的SDK文档提到的PWM( 文档下载请在左边加群,或留言咨询):
- 下面是要弄实验一盏灯的原理图:
- 实物图,某淘宝链接仅做介绍:
- 下面我弄的亮度变化的一盏灯变化过程(纯手写,字有点模糊,莫怪莫怪!):
三、电路图。
3.1、电路图。
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