首页 > 其他分享 >ESP32C3 LEDC_PWM

ESP32C3 LEDC_PWM

时间:2023-08-18 20:55:18浏览次数:48  
标签:定时器 ledc LEDC 占空比 PWM ESP32C3 通道

LEDC_PWM

   LED 控制器 (LEDC) 主要用于控制 LED,也可产生 PWM 信号用于其他设备的控制,ESP32C3有 6 路通道。设置 LEDC 通道分三步完成。与 ESP32 不同,ESP32-C3 仅支持设置通道为低速模式。

定时器配置 指定 PWM 信号的频率和占空比分辨率。
通道配置 绑定定时器和输出 PWM 信号的 GPIO。
改变 PWM 信号 输出 PWM 信号来驱动 LED。可通过软件控制或使用硬件渐变功能来改变 LED 的亮度。另一个可选步骤是可以在渐变终端设置一个中断。

1、定时器配置

    设置定时器,可调用函数 ledc_timer_config(),配置参数的数据结构 ledc_timer_config_t 传递给该函数:
速度模式(值必须为 LEDC_LOW_SPEED_MODE)
定时器索引 ledc_timer_t
PWM 信号频率(Hz)
PWM 占空比分辨率
时钟源 ledc_clk_cfg_t
PWM 频率越高,占空比分辨率越低,反之亦然。

官方文档
https://docs.espressif.com/projects/esp-idf/zh_CN/v5.0.1/esp32c3/api-reference/peripherals/ledc.html

ESP32-C3 LEDC 时钟源特性

APB_CLK--------80 MHz
RC_FAST_CLK---20 MHz
XTAL_CLK-------40 MHz

    如果 ESP32-C3 的定时器选用了RTCxM_CLK作为其时钟源,驱动会通过内部校准来得知这个时钟源的实际频率。这样确保了输出PWM信号频率的精准性。
ESP32-C3 的所有定时器共用一个时钟源。因此 ESP32-C3 不支持给不同的定时器配置不同的时钟源。

2、通道配置

    定时器设置好后,配置所需的通道(ledc_channel_t 之一)。配置通道需调用函数 ledc_channel_config()。
通道的配置与定时器设置类似,需向通道配置函数传递包括通道配置参数的结构体 ledc_channel_config_t 。
此时,通道会按照 ledc_channel_config_t 的配置开始运作,并在选定的 GPIO 上生成由定时器设置指定的频率和占空比的 PWM 信号。在通道运作过程中,可以随时通过调用函数 ledc_stop() 将其暂停。

3、改变 PWM 信号

    通道开始运行、生成具有恒定占空比和频率的 PWM 信号之后,有几种方式可以改变该信号。驱动 LED 时,主要通过改变占空比来变化光线亮度。
在 ESP32-C3 的 LED PWM 控制器中,所有的定时器和通道都只支持低速模式。

(1)使用软件改变 PWM 占空比

    调用函数 ledc_set_duty() 可以设置新的占空比。之后,调用函数 ledc_update_duty() 使新配置生效。要查看当前设置的占空比,可使用 get 函数 ledc_get_duty()。
另外一种设置占空比和其他通道参数的方式是调用 通道配置 一节提到的函数 ledc_channel_config()。
传递给函数的占空比数值范围取决于选定的 duty_resolution,应为 0 至 (2 ** duty_resolution) - 1。例如,如选定的占空比分辨率为 10,则占空比的数值范围为 0 至 1023。此时分辨率为 ~0.1%。

(2)使用硬件改变 PWM 占空比

    LED PWM 控制器硬件可逐渐改变占空比的数值,使用函数 ledc_fade_func_install() 使能渐变,之后用下列可用渐变函数之一配置:

ledc_set_fade_with_time() 在有限的时间内设置LEDC淡入淡出功能
ledc_set_fade_with_step() 设置LEDC淡入淡出功能
ledc_set_fade() 设置LEDC梯度,函数调用ledc_update_duty函数后,函数即可生效。

最后需要调用 ledc_fade_start() 开启渐变,中止一个正在运行中的渐变需要调用函数 ledc_fade_stop()。(此外,在使能渐变后,每个通道都可以额外通过调用 ledc_cb_register() 注册一个回调函数用以获得渐变完成的事件通知。回调函数的原型被定义在 ledc_cb_t。每个回调函数都应当返回一个布尔值给驱动的中断处理函数,用以表示是否有高优先级任务被其唤醒。由于驱动的中断处理函数被放在了 IRAM 中, 回调函数和其调用的函数也需要被放在 IRAM 中。 ledc_cb_register() 会检查回调函数及函数上下文的指针地址是否在正确的存储区域。
如不需要渐变和渐变中断,可用函数 ledc_fade_func_uninstall() 关闭。)

(3)改变 PWM 频率

    LED PWM 控制器 API 有多种方式即时改变 PWM 频率:调用函数 ledc_set_freq() 设置频率。 ledc_get_freq() 查看当前频率。调用函数 ledc_bind_channel_timer() 将其他定时器绑定到该通道来改变频率和占空比分辨率。
通过调用函数 ledc_channel_config() 改变通道的定时器。

4、程序实现

#include <stdio.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "driver/gpio.h"
#include "led_strip.h"
#include "driver/ledc.h"
#include "esp_timer.h"
#include "esp_err.h"


/*函数声明*/
void Led_gpio_init(void);
static void ledc_init(void);
void Breath_Blink(void);


/*
 * @brief LEDC PWM
 * 
 */
static void ledc_init(void)
{
   //LEDC PWM 定时器结构体配置 ledc_timer
    ledc_timer_config_t ledc_timer = {
    .speed_mode       = LEDC_LOW_SPEED_MODE, //定时器模式  低速
    .timer_num        = LEDC_TIMER_0,        //设置定时器源0(0-3)
    .duty_resolution  = LEDC_TIMER_13_BIT,   //将占空比分辨率设置为 13 位  (1-15)
    .freq_hz          = 1000,                //将pwm输出频率设置   1kHz
    .clk_cfg          = LEDC_AUTO_CLK        //配置LEDC时钟源,自动选择
    };
    ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));//配置LEDC定时器
    
    //LEDC PWM 通道结构体配置  ledc_channel
    ledc_channel_config_t ledc_channel = {    
        .speed_mode     = LEDC_LOW_SPEED_MODE,
        .channel        = LEDC_CHANNEL_0,    //通道0
        .timer_sel      = LEDC_TIMER_0,     
        .intr_type      = LEDC_INTR_DISABLE, //失能LEDC中断
        .gpio_num       = 12, //输出GPIO12
        .duty           = 0,  //将占空比设置为 0%
        .hpoint         = 0   //LEDC通道的hpoint,最大值为0xfffff
    };
    ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));
}

/*
 * @brief 呼吸效果 渐亮到渐灭
 * 
 */
void Breath_Blink(void)
{
    // 初始化淡入淡出服务
    ledc_fade_func_install(0);    // 注册LEDC服务,在调用前使用,参数是作为是否允许中断

    //参数:指定速度模式  LEDC通道  衰落的目标占空比 衰落的最长时间(ms)
    ledc_set_fade_with_time(LEDC_MODE,LEDC_CHANNEL, 8192,500);//在有限的时间内设置LEDC淡入功能
    //参数:指定速度模式  LEDC通道  淡入淡出功能
    ledc_fade_start(LEDC_MODE,LEDC_CHANNEL, LEDC_FADE_NO_WAIT);//开始LEDC衰落

    vTaskDelay(200);
  
    ledc_set_fade_with_time(LEDC_MODE,LEDC_CHANNEL, 0,500);
    ledc_fade_start(LEDC_MODE,LEDC_CHANNEL, LEDC_FADE_NO_WAIT);
}



int main()
{
  
  Led_gpio_init();
  ledc_init();

  while(1)
  {
    Breath_Blink();
    vTaskDelay(1);//延时10ms,一个时间片
  }
}

5、效果

视频:【ESP32C3 LEDC PWM呼吸灯-哔哩哔哩】 https://b23.tv/p3rfUdZ

标签:定时器,ledc,LEDC,占空比,PWM,ESP32C3,通道
From: https://www.cnblogs.com/xiaohuzaixue/p/17637565.html

相关文章

  • TMS320F28335 ePWM中断函数里不能关时钟?实际上是关时钟之后不能清中断
    最近发现一个很奇怪的现象,如标题,为此写了一个简单的程序来验证这个问题,下面是部分代码:1voidInitEPwm2Gpio(void)2{3EALLOW;4GpioCtrlRegs.GPAPUD.bit.GPIO2=0;//使能上拉5GpioCtrlRegs.GPAMUX1.bit.GPIO2=1;//将GPIO2配置为EPWM2A......
  • 合宙ESP32C3使用PlatformIO开发点亮ST7735S
    开发背景模块使用的合宙的ESP32-C3(经典款)购买连接COREESP32核心板是基于乐鑫ESP32-C3进行设计的一款核心板,尺寸仅有21mm*51mm,板边采用邮票孔设计,方便开发者在不同场景下的使用。核心板支持UART、GPIO、SPI、I2C、ADC、PWM等接口,可根据实际需要选择。屏幕使用的LuatOS屏......
  • FP6276兼容G5177C,高效5V2A同步PWM升压DC转换器
    FP6276是一款电流模式同步升压型DC-DC转换器,pwm/psm控制。它的pwm电路,内置55mΩ高侧开关和55mΩ低侧开关使该调节器具备高节能。内部补偿网络也最大限度地减少多达6个外部元件数量。误差放大器的非反相输入端连接到一个0.6v精度参考电压和内部软启动功能可降低浪涌电流。FP6276是......
  • STM32定时器输出PWM脉冲
    一、什么是PWM脉冲?PWM(PulseWidthModulation)脉冲宽度调制,通常应用于惯性系统中,(不是不能即停的设备,因为如果设备不具有关心,那么运动是断断续续的,不具有连续性),通过脉宽调节输出不同的波形作用域受控对象。二、PWM中三个重要的参数1.频率=1/Ts;这个很好理解,就是在单位时间内......
  • STM32 HAL库更改PWM频率的方法
    项目上用到了步进电机,控制方式为STEP/DIR。电机的STEP由PWM提供,于是控制步进电机的速度就靠PWM的频率高低来实现。实现频率更改的函数为。__HAL_TIM_SET_PRESCALER(__HANDLE__,__PRESC__);该函数可以直接更改Prescaler(PSC)预分频寄存器的数值,达成改变时钟频率的目的。举例:更......
  • 23. 通用定时器PWM输出实验
    1.PWM模式2.通用定时器PWM输出实验配置步骤2.1相关HAL库函数介绍 ......
  • AP5165B LED降压恒流驱动器 车灯 替代PT4115 支持PWM调光 线性调光
    产品应用原理图5-36V耐压3W射灯应用线路图产品描述AP5165B是一款外围电路简单的连续电流模式的降压型LED恒流驱动芯片。在输入电压高于LED电压时,可以有效地用于驱动一颗或者多颗串联LED。输出电流可调,最大可达1A。适用于3-36V电压范围的非隔离式恒流LED驱动领域。AP5165B......
  • PWM点灯
    目录PWM脉冲宽调点灯前言1.什么是PWM2.PWM的实现3.PWM实现步骤(通用定时器)3.1打开定时器的时钟3.2配置端口3.3设置定时器3.4设置PWM3.5完整代码4.PWM实现步骤(高级定时器)5.开始点灯6.PWM呼吸灯PWM脉冲宽调点灯前言对于灯等来说有很多种方法,前面介绍了一些基础的点灯方法,比如......
  • STM32定时器PWM
    个人估计理解这个图片就差不多明白PWM了。用定时器的加减也一样使用PWM的时候要看PWM的相关IO引脚。CH1-CH4对应OC配置的OC1-OC4频率计算可以看前面的定时器文章。PWM配置过程:1:初始化相关的PWM引脚2:初始化配置定时器   TIM_TimeBaseInit(TIM3,&TIM3_TimeBaseInitStruct);3:配置O......
  • TIM-PWM边沿检测时TI1F_ED的应用解析
    TIM-PWM边沿检测时TI1F_ED的应用解析定时器框图TI1F_ED指示如下所示:以TIMx_CH1的信号为例:TI1FP1和TI1FP2解析:从TIMx_CH1进入的TI1信号,经过输入滤波器生成TI1F,再经过边沿检测器(捕获极性选择上升沿或下降沿)生成TI1FP1和TI1FP2。TI1F_ED解析:TI1经过边沿检测器后生成TI1F_ED信号(双边沿......