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 结构体进行说明
typedef struct { ledc_mode_t speed_mode; // ledc速度模式:ledc_high_speed_mode和ledc_low_speed_mode union { ledc_timer_bit_t duty_resolution; //占空比的分分辨率 ledc_timer_bit_t bit_num __attribute__((deprecated)); //esp-idf 3.1以上已经使用该参数 }; ledc_timer_t timer_num; //定时器编号 uint32_t freq_hz; //pwm频率 ledc_clk_cfg_t clk_cfg; //时钟源:} ledc_timer_config_t;例子:
// 定时器配置ledc_timer_config_t ledctimerconfig = { .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 结构体进行说明
typedef struct { int gpio_num;//输出pwm的gpio口 ledc_mode_t speed_mode// ledc速度模式:ledc_high_speed_mode和ledc_low_speed_mode ledc_channel_t channel; // ledc的输出通道: ledc_intr_type_t intr_type; //是否使能中断,如果使能中断之后,需要使用ledc_isr_register函数,进行中断注册,在渐变完成之后,就会调用中断函数 ledc_timer_t timer_sel;//设置使用哪一个定时器,需要和ledc_timer_config_t配置的一致 uint32_t duty;//占空比 int hpoint;//上升沿出现的位置,一般设置为0,最大值为0xfffff struct { unsigned int output_invert: 1;//电平是否翻转,1:0- >1, 0:1- >0 } flags;} ledc_channel_config_t;例子:
// 通道配置ledc_channel_config_t ledcchannelconfig = { .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_t ledc_set_duty(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t duty);//参数:speed_mode:ledc速度模式,要和ledc_channel_config_t的speed_mode保持一致// channel:通道,要和ledc_channel_config_t的channel保持一致// duty:占空比,取值范围:0 ~ (2^duty_resolution) - 1 esp_err_t ledc_update_duty(ledc_mode_t speed_mode, ledc_channel_t channel);//参数: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_t ledc_fade_func_install(int intr_alloc_flags);//参数:intr_alloc_flags:用于分配中断的标志,一般填0即可esp_err_t ledc_set_fade_with_step(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t target_duty, uint32_t scale, uint32_t cycle_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_t ledc_set_fade_with_time(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t target_duty, int max_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_t ledc_fade_start(ledc_mode_t speed_mode, ledc_channel_t channel, ledc_fade_mode_t fade_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_ledidf.py set-target esp32c3 # 设置工程使用的芯片2、查看原理图确定按键控制引脚
3、编写程序本例子是使用软件,配置占空比方式,有兴趣的小伙伴可以尝试使用硬件方式
什么是HDSL
音响发烧友俚语大全
ROCCAT高性能光学键轴亮相 VULCAN系列又添新款
戴尔易安信数据保护解决方案:集成式数据保护应用装置
OPPO、小米领衔,目前最值购买的手机TOP 4
[esp32教程] 4、LEDC使用
axure中继器实现实时搜索
宏控多媒体中央控制系统操作知识
全新OPPO Reno5 Pro+重磅发布
采购人员必看的集成电路芯片辩别知识
网格环境微型监测系统的主要功能有哪些?
Beats Studio 3 评测解析
phpy:PHP与Python互调用库
智慧供水整体解决方案 打造数字孪生智慧供水解决方案
复工企业借UWB技术实现防控疫情智慧化管理
基于Arduino的低功耗睡眠模式设计方案
国产时钟IC-AiP8563替代AT8563/HYM8563/PCF8563,主要运用在RK方案上面
体验混合自动化:倍加福将“数字博览会”与其在SPS 2021的展示相结合
无线充电器充电手机发烫正常吗 无线充电器手机放上去无反应
布谷:拥抱智能,打造互联网新品牌