本篇介绍Beetle ESP32-C3在Arduino IDE中进行PWM开发的过程,实现呼吸灯功能——实际是DFROBOT官网示例代码仅修改为IO7做输出。
1、PWM(Pulse Width Modulation):脉冲宽度调制
调整PWM包括:周期调整和正脉冲调整。PWM就好比是“蹬自行车”——正脉冲时蹬车,负脉冲时不蹬让其滑行。PWM利用这个原理可以进行“直流电机调速”、“照明亮度调整(即呼吸灯)”等操作。
图2-1 PWM原理
Arduino core for the ESP32并没有一般Arduino中用来输出PWM的analogWrite(pin, value)方法,Arduino-ESP32框架提供了一个LEDC(即LED control)库,是设计用来控制LED实现呼吸灯之类,当然也可以用作通用PWM输出。
图2-2 ESP32各系列PWM通道数
乐鑫官方文档LEDC库链接:https://docs.espressif.com/projects/arduino-esp32/en/latest/api/ledc.html 。
文档页开始给出的表格(图2-2为其截图),说明了ESP32各个系列MCU包含的PWM通道数,其中ESP32的LEDC总共有16个路通道(0 ~ 15),分为高低速两组,高速通道(0 ~ 7)由80MHz时钟驱动,低速通道(8 ~ 15)由1MHz时钟驱动。而ESP32-C3不亏为ESP32“阉割版”,提供了6个通道——话说通道多了也没有那么多IO。
2、呼吸灯——IO7控制LED
话说本人选择用了IO7基于两个原因,一是板载的LED做呼吸灯亮度不明显,二是IO7在面包板上好连接(在核心板边上)省得接杜邦线了。
图2-3 呼吸灯案例的面包板连接
下面是案例代码,注释加入了自己的两个理解(标注by Author):
- const int ledPin = 7;
-
-
- const int freq = 5000;
- const int ledChannel = 0;
- const int resolution = 8;
-
- void setup(){
-
- ledcSetup(ledChannel, freq, resolution);
-
-
- ledcAttachPin(ledPin, ledChannel);
- }
-
- void loop(){
-
- for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
-
- ledcWrite(ledChannel, dutyCycle);
- delay(15);
- }
-
-
- for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
-
- ledcWrite(ledChannel, dutyCycle);
- delay(15);
- }
- }