[esp32教程] 4、LEDC使用

描述

0、前期准备

1、参考上一篇文章搭建好esp32环境

2、准备好一块esp32开发开发板(本作者使用了esp32c3作为开发平台)

1、知识储备

1.1 概述

LEDC是乐鑫公司专门开发,通过PWM来控制LED,具有软件控制占空比以及硬件自动控制占空比的方式。同时据说也可以用来控制电机。

1.2 功能架构

LEDC有4个定时器可以独立配置,定时器时钟来源有三个时钟源,分别是:APB_CLK、RC_FAST_CLK 和 XTAL_CLK。

架构图如下所示:

1.3 LEDC配置流程介绍

LEDC的配置流程可分为以下3步

1、定时器配置:设置PWM 频率和占空比分辨率(位数)

2、通道配置:设置定时器通道以及PWM的输出引脚

3、 修改占空比

1、定时器配置

定时器的配置主要是给 ledc_timer_config_t 结构体赋值,然后通过ledc_timer_config函数进行对定时器设置

以下对ledc_timer_config_t 结构体进行说明

typedefstruct{ledc_mode_tspeed_mode;// ledc速度模式:LEDC_HIGH_SPEED_MODE和LEDC_LOW_SPEED_MODEunion{ledc_timer_bit_tduty_resolution;//占空比的分分辨率ledc_timer_bit_tbit_num __attribute__((deprecated));//esp-idf 3.1以上已经使用该参数};ledc_timer_ttimer_num;//定时器编号uint32_tfreq_hz;//pwm频率ledc_clk_cfg_tclk_cfg;//时钟源:}ledc_timer_config_t;

例子:

// 定时器配置ledc_timer_config_tledcTimerConfig = { .speed_mode = LEDC_LOW_SPEED_MODE, .duty_resolution = LEDC_TIMER_13_BIT, .clk_cfg = LEDC_AUTO_CLK, .freq_hz =5000, .timer_num = LEDC_TIMER_0, }; ledc_timer_config(&ledcTimerConfig);
2、通道配置

通道的配置主要是给 ledc_channel_config_t 结构体赋值,然后通过ledc_channel_config函数进行通道设置。

以下对ledc_channel_config_t 结构体进行说明

typedefstruct{intgpio_num;//输出pwm的gpio口ledc_mode_tspeed_mode// ledc速度模式:LEDC_HIGH_SPEED_MODE和LEDC_LOW_SPEED_MODEledc_channel_tchannel;// ledc的输出通道:ledc_intr_type_tintr_type;//是否使能中断,如果使能中断之后,需要使用ledc_isr_register函数,进行中断注册,在渐变完成之后,就会调用中断函数ledc_timer_ttimer_sel;//设置使用哪一个定时器,需要和ledc_timer_config_t配置的一致uint32_tduty;//占空比inthpoint;//上升沿出现的位置,一般设置为0,最大值为0xfffffstruct{unsignedintoutput_invert:1;//电平是否翻转,1:0- >1, 0:1- >0} flags; }ledc_channel_config_t;

例子:

// 通道配置ledc_channel_config_tledcChannelConfig = { .gpio_num = GPIO_NUM_14, .speed_mode = LEDC_LOW_SPEED_MODE, .channel = LEDC_CHANNEL_0, .intr_type = LEDC_INTR_DISABLE, .timer_sel = LEDC_TIMER_0, .duty =0, .hpoint =0, .flags.output_invert =0, }; ledc_channel_config(&ledcChannelConfig);
3、 修改占空比

ledc占空比可以通过,软件和硬件两个方式进行设置。

软件方式:主要涉及了ledc_set_duty和ledc_update_duty两个函数,其中

ledc_set_duty:用来设置占空比

ledc_update_duty:使设置生效,

函数参数说明如下:

esp_err_tledc_set_duty(ledc_mode_tspeed_mode,ledc_channel_tchannel,uint32_tduty)//参数:speed_mode:ledc速度模式,要和ledc_channel_config_t的speed_mode保持一致// channel:通道,要和ledc_channel_config_t的channel保持一致// duty:占空比,取值范围:0 ~ (2^duty_resolution) - 1esp_err_tledc_update_duty(ledc_mode_tspeed_mode,ledc_channel_tchannel);//参数:speed_mode:ledc速度模式,要和ledc_channel_config_t的speed_mode保持一致// channel:通道,要和ledc_channel_config_t的channel保持一致

硬件方式:主要涉及到了ledc_fade_func_install、ledc_set_fade_with_step、ledc_set_fade_with_time和ledc_fade_start几个函数,其中

ledc_fade_func_install:用来使能硬件,使得硬件能够改变占空比,

ledc_set_fade_with_step:用于设置渐变的步长

ledc_set_fade_with_time:用于设置渐变到某一个值,一般ledc_set_fade_with_step和ledc_set_fade_with_time使用其中一个即可

ledc_fade_start:开始渐变

(注意:ledc_set_fade_with_time和ledc_fade_start不是线程安全的,不要在不同的任务中同时调用这些函数来控制一个ledc通道,API的线程安全版本是ledc_set_fade_step_and_start)

函数参数说明如下:

esp_err_tledc_fade_func_install(intintr_alloc_flags);//参数:intr_alloc_flags:用于分配中断的标志,一般填0即可esp_err_tledc_set_fade_with_step(ledc_mode_tspeed_mode,ledc_channel_tchannel,uint32_ttarget_duty,uint32_tscale,uint32_tcycle_num);// 参数 :speed_mode:ledc速度模式,要和ledc_channel_config_t的speed_mode保持一致// channel:通道,要和ledc_channel_config_t的channel保持一致// target_duty: 目标占空比,取值范围:0 ~ (2^duty_resolution) - 1// scale:控制增加或减少步长比例。// cycle_num:每cycle_num个周期增加或减少占空比esp_err_tledc_set_fade_with_time(ledc_mode_tspeed_mode,ledc_channel_tchannel,uint32_ttarget_duty,intmax_fade_time_ms);// 参数 :speed_mode:ledc速度模式,要和ledc_channel_config_t的speed_mode保持一致// channel:通道,要和ledc_channel_config_t的channel保持一致// target_duty: 目标占空比,取值范围:0 ~ (2^duty_resolution) - 1// max_fade_time_ms:减到目标占空比花费的时间esp_err_tledc_fade_start(ledc_mode_tspeed_mode,ledc_channel_tchannel,ledc_fade_mode_tfade_mode);// 参数 :speed_mode:ledc速度模式,要和ledc_channel_config_t的speed_mode保持一致// channel:通道,要和ledc_channel_config_t的channel保持一致// fade_mode: 渐变模式,阻塞(LEDC_FADE_WAIT_DONE)和非阻塞(LEDC_FADE_NO_WAIT)

2、新建工程

idf.py create-project project_led # 新建工程 cd project_led idf.py set-target esp32c3 # 设置工程使用的芯片

2、查看原理图确定按键控制引脚

定时器

3、编写程序

本例子是使用软件,配置占空比方式,有兴趣的小伙伴可以尝试使用硬件方式

#include#include#include#includevoidapp_main(void){// 定时器配置ledc_timer_config_tledcTimerConfig = { .speed_mode = LEDC_LOW_SPEED_MODE, .duty_resolution = LEDC_TIMER_13_BIT, .clk_cfg = LEDC_AUTO_CLK, .freq_hz =5000, .timer_num = LEDC_TIMER_0, }; ledc_timer_config(&ledcTimerConfig);// 通道配置ledc_channel_config_tledcChannelConfig = { .gpio_num = GPIO_NUM_5, .speed_mode = LEDC_LOW_SPEED_MODE, .channel = LEDC_CHANNEL_0, .intr_type = LEDC_INTR_DISABLE, .timer_sel = LEDC_TIMER_0, .duty =0, .hpoint =0, .flags.output_invert =0, }; ledc_channel_config(&ledcChannelConfig);floatduty_num =0;intder =1;while(pdTRUE) { ledc_set_duty(LEDC_LOW_SPEED_MODE,LEDC_CHANNEL_0,(int)(8191*(duty_num/200))); ledc_update_duty(LEDC_LOW_SPEED_MODE,LEDC_CHANNEL_0);if(duty_num ==200) der =0;elseif(duty_num ==0) der =1;if(der ==1) duty_num +=1;elseduty_num -=1; vTaskDelay(10/portTICK_PERIOD_MS); } }

4、编译下载

#编译idf.py build#烧录以及查看日志,使用ctrl+] 可以退出监视窗口idf.py -p /dev/ttyUSB0 flash monitor

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分