1. 学习目的及目标
- 学习 LED 灯电路及硬件原理
- 学习 ESP32 的 PWM(ledc)功能的配置
掌握 PWM(ledc)控制LED 灯渐变
2.LED 灯控制原理
要使用 ESP32 控制 LED 灯输出多种亮度等级,可以通过控制输出脉冲的占空比来实现。就是我们今天要学习的 PWM 功能,在 ESP32中就是 ledc 功能。
上图列出了周期相同而占空比分别为100%、80%、50和20%的脉冲波形,假如利用这样的脉冲控制 LED 灯,即可控制 LED 灯亮灭时间长度的比例。若提高脉冲的频率,LED 灯将会高频率进行开关切换,由于视觉暂留效应,人眼看不到 LED 灯的开关导致的闪烁现象,而是感觉到使用不同占空比的脉冲控制 LED 灯时的亮度差别。即单个控制周期内,LED 灯亮的平均时间越长,亮度就越高,反之越暗。
把脉冲信号占空比分成 256 个等级,即可用于控制 LED 灯输出 256 种亮度,使用三种这样的信号控制 RGB 灯即可得到256x256x256种颜色混合的效果。而要控制占空比,直接使用 ESP32 的 LEDC 功能即可.3.硬件设计原理
实验使用ESP32开发板自带的LED灯进行实验
LED标号 LED引脚 ESP32引脚 LED_IO 2 2 4.代码设计
1.代码逻辑
2.源码编写#include <stdio.h> #include <sdkconfig.h> #include <driver/ledc.h> #include <driver/gpio.h> #include <driver/ledc.h> #include <esp_log.h> #include <freertos/FreeRTOS.h> #include <freertos/task.h> #define LED_IO 2 #define LEDC_MAX_DUTY (8191) //最大占空比,2的13次方 #define LEDC_FADE_TIME 1000 //渐变时间 //ledc_timer_config_t ledc_timer; ledc_channel_config_t ledc_con; //声明结构体函数 void ledc_init(void) { //设置LED定时器 ledc_timer_config_t ledc_timer = { .duty_resolution = LEDC_TIMER_13_BIT, //设置PWM分辨率 .freq_hz = 5000 , //设置频率 .speed_mode = LEDC_HIGH_SPEED_MODE,//设置为高速模式 .timer_num = LEDC_TIMER_0,//选择定时器 }; //启动定时器的PWM模式 ledc_timer_config(&ledc_timer); //LED 灯结构体配置 ledc_con.channel = LEDC_CHANNEL_0;//pwm通道 ledc_con.duty = 0;//占空比 ledc_con.gpio_num = LED_IO; //选择IO口 ledc_con.speed_mode = LEDC_HIGH_SPEED_MODE; //选择高速通道 ledc_con.timer_sel = LEDC_TIMER_0; //选择定时器 ledc_channel_config(&ledc_con); //安装LED渐变 ledc_fade_func_install(0); } void app_main(void) { //选择IO口 esp_rom_gpio_pad_select_gpio(LED_IO); //设置IO口 gpio_set_direction(LED_IO,GPIO_MODE_OUTPUT); //定时器、LED灯初始化 ledc_init(); while (1) { //LED灯从渐变到100%,时间是 LEDC_FADE_TIME ledc_set_fade_with_time(ledc_con.speed_mode,ledc_con.channel,LEDC_MAX_DUTY,LEDC_FADE_TIME); //渐变开始 ledc_fade_start(ledc_con.speed_mode,ledc_con.channel,LEDC_FADE_NO_WAIT); //延时LEDC_FADE_TIME,给LEDC控制时间 vTaskDelay(LEDC_FADE_TIME / portTICK_PERIOD_MS); //LED灯渐变到0%,时间为LEDC_FADE_TIME ledc_set_fade_with_time(ledc_con.speed_mode,ledc_con.channel,0,LEDC_FADE_TIME); //启动渐变,等待时间为LEDC_FADE_NO_WAIT不等待 ledc_fade_start(ledc_con.speed_mode,ledc_con.channel,LEDC_FADE_NO_WAIT); //延时LEDC_FADE_TIME,给LEDC控制时间 vTaskDelay(LEDC_FADE_TIME / portTICK_PERIOD_MS); } }
3.展示效果
LED灯由暗到亮,再由亮变暗,如此循环。
5.PWM(ledc)总结
- 渐变在指示灯处比较常用。
- 不用渐变的时候可以使用,设置占空比函数直接怼。
- 设置占空比 ledc_set_duty();
- 还有几个常用的 ledc 库函数,请参考 ledc.h 文件。
评论