ESP32学习笔记11-LEDC_PWM和LED渐变

本文详细介绍了ESP32中LEDC_PWM(LED控制器脉宽调制)的基本概念,包括通道配置、定时器设置和占空比调整。通过LED渐变例程,阐述了如何实现PWM信号的平滑变化,涵盖了初始化、参数设置和渐变控制等关键步骤。
摘要由CSDN通过智能技术生成

11.LEDC_PWM_BASIC–PWM

11.0 概述

  • LED_PWM 主要用于控制 LED 的亮度和颜色,也可以产生 PWM 信号用于其他用途。LED_PWM 有 16 路通道,

即 8 路高速通道和 8 路低速通道。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J0HZVD76-1681468711938)(picture/image-20230414171425426.png)]

  • LED PWM 高速定时器的时钟 LEDC_CLKx 有两个时钟源:REF_TICK 和 APB_CLK

  • 分频系数为 LEDC_CLK_DIV_NUM_HSTIMERx,该系数的固定位宽是 18 位:其中高 10 位为整数部分 A,低 8 位为小数部分 B。分频系数的范围为 1 1023。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YvALPF8b-1681468711939)(picture/image-20230414171603407.png)]

  • 计数达到最大值 2 LEDCHST IMER**xDUT Y _RES 1 时,产生溢出

以下是ESP32用SDK创建用LED PWM控制器实现的RGB七彩渐变程序的示例代码: ```c #include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" #include "driver/ledc.h" #define RED_PIN 25 #define GREEN_PIN 26 #define BLUE_PIN 27 #define LEDC_CH_NUM 3 #define LEDC_FREQ_HZ 5000 #define LEDC_RESOLUTION 8 void led_pwm_init() { ledc_timer_config_t timer_conf; timer_conf.duty_resolution = LEDC_RESOLUTION; timer_conf.freq_hz = LEDC_FREQ_HZ; timer_conf.speed_mode = LEDC_HIGH_SPEED_MODE; timer_conf.timer_num = LEDC_TIMER_0; ledc_timer_config(&timer_conf); ledc_channel_config_t ch_conf[LEDC_CH_NUM]; ch_conf[0].channel = LEDC_CHANNEL_0; ch_conf[0].duty = 0; ch_conf[0].gpio_num = RED_PIN; ch_conf[0].speed_mode = LEDC_HIGH_SPEED_MODE; ch_conf[0].timer_sel = LEDC_TIMER_0; ch_conf[1].channel = LEDC_CHANNEL_1; ch_conf[1].duty = 0; ch_conf[1].gpio_num = GREEN_PIN; ch_conf[1].speed_mode = LEDC_HIGH_SPEED_MODE; ch_conf[1].timer_sel = LEDC_TIMER_0; ch_conf[2].channel = LEDC_CHANNEL_2; ch_conf[2].duty = 0; ch_conf[2].gpio_num = BLUE_PIN; ch_conf[2].speed_mode = LEDC_HIGH_SPEED_MODE; ch_conf[2].timer_sel = LEDC_TIMER_0; for (int i = 0; i < LEDC_CH_NUM; i++) { ledc_channel_config(&ch_conf[i]); } } void rgb_fade() { int step = 5; int r = 255, g = 0, b = 0; while (1) { for (int i = 0; i < 51; i++) { ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, r); ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1, g); ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2, b); ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2); vTaskDelay(20 / portTICK_PERIOD_MS); r -= step; g += step; } for (int i = 0; i < 51; i++) { ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, r); ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1, g); ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2, b); ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2); vTaskDelay(20 / portTICK_PERIOD_MS); g -= step; b += step; } for (int i = 0; i < 51; i++) { ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, r); ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1, g); ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2, b); ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2); vTaskDelay(20 / portTICK_PERIOD_MS); r += step; b -= step; } } } void app_main() { led_pwm_init(); xTaskCreate(rgb_fade, "rgb_fade", 2048, NULL, 5, NULL); } ``` 这个程序实现了一个RGB七彩渐变效果。首先,我们使用`led_pwm_init()`函数初始化三个LED PWM通道,分别对应红、绿、蓝三个颜色。然后,我们使用`rgb_fade()`函数实现RGB七彩渐变效果。在这个函数中,我们使用三个变量`r`、`g`、`b`来代表红、绿、蓝三个颜色的亮度,使用`step`变量代表每次变化的步长。在每次循环中,我们先对红色进行减少、绿色进行增加,然后对绿色进行减少、蓝色进行增加,最后对红色进行增加、蓝色进行减少,这样就实现了一个RGB七彩渐变效果。在每次变化后,我们使用`ledc_set_duty()`函数和`ledc_update_duty()`函数来更新三个LED PWM通道的亮度,然后使用`vTaskDelay()`函数来等待一段时间,以实现比较平滑的变化效果。最后,我们在`app_main()`函数中创建一个任务来运行`rgb_fade()`函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Car12

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值