【ESP32-C3-DevKitM-1】ESP32-C3的LED PWM
[复制链接]
- LED PWM的评测
ESP32-C3内部有6路的LED PWM发生器,可以用来PWM输出,精度可达14位,输入时钟最高可达80MHZ,同时支持小数分频,占空比可独立调节,同时硬件上支持自动增或降占空比,方便LED RGB的开发。其他具体技术细节请参考数据手册和参考手册
按照之前的方法,新建一个工程,添加模板,如下图,然后编译运行
然后编译运行,利用Eclipse自带的串口助手查看,如下图,会输出一个5KHZ的方波,占空比约50%
先大致分析一下程序
1、首先先对定时器进行配置
其中duty_resolution = LEDC_TIMER_12_BIT是配置PWM分辨位数,ESP32-C3的PWM最高可以配置为14位,通俗的说分辨位数越高,可产生的PWM的占空比越细越多,比如14位就是把PWM的输入时钟源频率在数字上分成2^14份,这样可输出的占空比就越细,也就是分辨率。
.freq_hz = 10000是设置频率的,经过不断试错(主要是没仔细看),按我的理解,首先看下图,频率是由于定时器的时钟源LEDC_CLKx、时钟分频系数
LEDC_CLK_DIV_TIMERx 以及计数器的计数范围LEDC_TIMERx_DUTY_RES决定的,时钟源默认是选择80MHz,时钟分频系数包括10位的整数部分和8位的小数部分,范围为1-1024,计数范围就是2^duty_resolution,所以说当duty_resolution定下来以后,其实在duty_resolution这个分辨率下能输出的PWM频率是有一个固定范围的,如下面的表格(可能理解有错误,欢迎指正)
duty_resolution
|
可设置的最小频率(HZ)
|
可设置的最大频率(HZ)
|
LEDC_TIMER_1_BIT
|
39062.5
|
40,000,000
|
LEDC_TIMER_2_BIT
|
19531.25
|
20,000,000
|
LEDC_TIMER_3_BIT
|
9765.625
|
10,000,000
|
LEDC_TIMER_4_BIT
|
4882.8125
|
5,000,000
|
LEDC_TIMER_5_BIT
|
2441.40625
|
2,500,000
|
LEDC_TIMER_6_BIT
|
1220.703125
|
1,250,000
|
LEDC_TIMER_7_BIT
|
610.3515625
|
625,000
|
LEDC_TIMER_8_BIT
|
305.1757813
|
312500
|
LEDC_TIMER_9_BIT
|
152.5878906
|
156250
|
LEDC_TIMER_10_BIT
|
76.29394531
|
78125
|
LEDC_TIMER_11_BIT
|
38.14697266
|
39062.5
|
LEDC_TIMER_12_BIT
|
19.07348633
|
19531.25
|
LEDC_TIMER_13_BIT
|
9.536743164
|
9765.625
|
LEDC_TIMER_14_BIT
|
4.768371582
|
4882.8125
|
所以选择的频率和分辨率要搭配合理,不然是输不出来PWM波的
除了上面两个参数,我感觉剩余三个参数不是很重要。
2、再对具体通道和引脚进行配置
如下图,这个也好理解,.duty = 0是占空比所对应计数值,计算公式为duty=(n/100)*2^duty_resolution,其中n为0-100。.flags.output_invert = 0是选择是否反转,最后将结构体通过ledc_channel_config写入
如果占空比是固定的,在这个结构体里就可以设置好,如果占空比要变化,调用以下函数比较方便。
ledc_set_duty(ledc_channel.speed_mode, ledc_channel.channel,LEDC_TEST_DUTY);
ledc_update_duty(ledc_channel.speed_mode, ledc_channel.channel);
如果要实现硬件渐变占空比,首先要加上这句ledc_fade_func_install(0);
然后
ledc_set_fade_with_time(ledc_channel[ch].speed_mode,ledc_channel[ch].channel, LEDC_TEST_DUTY, LEDC_TEST_FADE_TIME);
ledc_fade_start(ledc_channel[ch].speed_mode,ledc_channel[ch].channel, LEDC_FADE_NO_WAIT);
具体的可以参考例程,写的也蛮详细的。
最后放几张效果图,用逻辑分析仪观察
下图为4MHZ,50%,还是很轻松的
下图是5KHZ,占空比自动从0-50,再从50-0
|