ESP32_PWM 驱动LED灯

冇雨
2023-09-16 / 0 评论 / 141 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年09月16日,已超过463天没有更新,若内容或图片失效,请留言反馈。

1. 学习目的及目标

  1. 学习 LED 灯电路及硬件原理
  2. 学习 ESP32 的 PWM(ledc)功能的配置
  3. 掌握 PWM(ledc)控制LED 灯渐变

    2.LED 灯控制原理

      要使用 ESP32 控制 LED 灯输出多种亮度等级,可以通过控制输出脉冲的占空比来实现。就是我们今天要学习的 PWM 功能,在 ESP32中就是 ledc 功能。
    PWM占空比.png
      上图列出了周期相同而占空比分别为100%、80%、50和20%的脉冲波形,假如利用这样的脉冲控制 LED 灯,即可控制 LED 灯亮灭时间长度的比例。若提高脉冲的频率,LED 灯将会高频率进行开关切换,由于视觉暂留效应,人眼看不到 LED 灯的开关导致的闪烁现象,而是感觉到使用不同占空比的脉冲控制 LED 灯时的亮度差别。即单个控制周期内,LED 灯亮的平均时间越长,亮度就越高,反之越暗。
      把脉冲信号占空比分成 256 个等级,即可用于控制 LED 灯输出 256 种亮度,使用三种这样的信号控制 RGB 灯即可得到256x256x256种颜色混合的效果。而要控制占空比,直接使用 ESP32 的 LEDC 功能即可.

    3.硬件设计原理

    实验使用ESP32开发板自带的LED灯进行实验

    LED标号LED引脚ESP32引脚
    LED_IO22

    4.代码设计

    1.代码逻辑
    lmlebfmd.png
    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)总结

  1. 渐变在指示灯处比较常用。
  2. 不用渐变的时候可以使用,设置占空比函数直接怼。
  3. 设置占空比 ledc_set_duty();
  4. 还有几个常用的 ledc 库函数,请参考 ledc.h 文件。
1

评论

博主关闭了所有页面的评论