Author:teacherXue
一、PWM调控原理
有很多的设备,对于电压变化并不敏感,不能使用模拟量老控制,这时不太适用电压控制其功率输出。比较典型的就是我们熟悉的LED。但是,我们可以使用脉宽调制 (PWM) 输出“假”中级电压的方式,来控制LED的亮度。用极其简单的方式来解释就是非常快速的切换开关(高低电平)状态,通过开的时间占比来达到功率控制。人的眼睛将无法跟上 LED 开关的速度,看到的是不同亮度的灯珠。
二、模拟写入()
analogWrite(pin, value);
analogWrite将会向指定支持PWM调制的数字端口写入模拟量,取值应该在 0 到PWM范围,默认情况下为 255。当值为 0 时,该引脚上的 PWM 被禁用。值255 对应于 100% 占空比。
可以通过调用以下命令更改 PWM范围:
analogWriteRange(new_range);
默认情况下,ESP8266PWM 频率为 1kHz。您可以通过以下方式更改 PWM 频率,频率越高则闪烁感越低,所谓的护眼灯就是频率很高的调制。有效值为 100Hz 至 40000Hz。
analogWriteFreq(new_frequency);
三、NodeMCU 使用PWM调光LED实验
本实验,我们将构建一个使 LED随时间顺滑的改变明暗的呼吸灯简单示例,以便了解如何在项目中使用 PWM。接线请参考第三章内容。
创建灯控项目
1)在 VS Code 上,单击 PlartfomIO主页图标。点击+ New Project创建Lamp_ctl_v2.0项目并确定。
2)修改platformio.ini配置文件增加串口通讯波特率monitor_speed = 115200
3)编辑main.cpp主文件,其中LED引脚定义为14,查阅引脚对应表,D5引脚对应的是GPIO14。
在loop方法中通过两个循环,通过PWM调制让LED的亮度分别逐步增加和逐步熄灭,以实现呼吸效果。检查无误后烧录代码。
#include <Arduino.h>
#define LED 14 // D5引脚对应的是GPIO14
void setup()
{
// put your setup code here, to run once:
Serial.begin(115200); // 设置串口通信波特率
pinMode(LED, OUTPUT);
}
void loop()
{
// put your main code here, to run repeatedly:
for (int dutyCycle = 0; dutyCycle < 255; dutyCycle++)
{
// 用PWM增加LED亮度
analogWrite(LED, dutyCycle);
delay(1); // 阻塞程序运行1毫秒,让其变化不至于太快,增大可以让变化趋缓,但过大会产生卡顿和闪烁。
}
for (int dutyCycle = 255; dutyCycle > 0; dutyCycle--)
{
// 用PWM降低LED亮度
analogWrite(LED, dutyCycle);
delay(5); // 阻塞程序运行1毫秒,让其变化不至于太快,增大可以让变化趋缓,但过大会产生卡顿和闪烁。
}
delay(200); //灭灯后暂停200毫秒
}