【ESP32】Arduino开发 | LED PWM控制器+呼吸灯例程
有关ESP32的LED PWM控制器的介绍放在了ESP-IDF的对应开发文章中,跳转栏目目录可以找到。
1. API
1.1 初始化
uint32_t ledcSetup(uint8_t channel, uint32_t freq, uint8_t resolution_bits);
- channel:输出通道;
- freq:输出频率;
- resolution_bits:占空比分辨率。
1.2 绑定管脚
void ledcAttachPin(uint8_t pin, uint8_t channel);
- pin:管脚号;
- channel:输出通道。
1.3 设置占空比
void ledcWrite(uint8_t channel, uint32_t duty);
- channel:输出通道;
- duty:占空比。
1.4 读取占空比
uint32_t ledcRead(uint8_t channel);
- channel:输出通道。
返回当前占空比。
2. 例程
这个例程实现一个呼吸灯应用,LED由灭到亮,再由亮到灭,一直循环。
#include <Arduino.h>
#define LEDC_FADE_TIME 3000
#define LEDC_DUTY_RES 13
#define LEDC_DUTY_MAX ((1 << LEDC_DUTY_RES) - 1)
static uint32_t step;
void setup()
{
Serial.begin(115200);
/* 初始化LEDC */
ledcSetup(0, 5000, LEDC_DUTY_RES); // 定时器0,5kHz,13位分辨率
ledcAttachPin(2, 0); // IO2,通道0
step = LEDC_DUTY_MAX / LEDC_FADE_TIME;
}
void loop()
{
/* 亮度递增 */
uint32_t duty = 0;
while ((duty = ledcRead(0)) < LEDC_DUTY_MAX) {
delay(1);
ledcWrite(0, duty + step);
}
/* 亮度递减 */
duty = LEDC_DUTY_MAX;
while ((duty = ledcRead(0)) > 0) {
delay(1);
ledcWrite(0, duty - step);
}
}
最新版本的Arduino貌似删除了自动占空比更新相关的API,所以这里就不像IDF那样可以用库函数,需要自己编写相关的逻辑。
在setup函数内先初始化LEDC外设,使用定时器0,输出通道0,绑定管脚2,输出频率5kHz,13位占空比分辨率。
我这里设置的渐变周期是3秒,然后每1毫秒更新一次占空比,因此用周期 / ((1 << 占空比分辨率) - 1)可以得出每毫秒需要更新的占空比步长。变亮就是不断加duty,变暗就是不断减duty,应该很好理解。ledcWrite函数里面会限制duty不超过最大分辨率,所以不用担心duty的值的问题。
编译并烧录程序就可以看到板子上的呼吸灯效果了。
原文地址:https://blog.csdn.net/JackieCoo/article/details/142900912
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!