438|0

48

帖子

0

资源

一粒金砂(中级)

【ESP32-C3-DevKitM-1】ESP32-C3的LED PWM [复制链接]

  1. LED PWM的评测

ESP32-C3内部有6路的LED PWM发生器,可以用来PWM输出,精度可达14位,输入时钟最高可达80MHZ,同时支持小数分频,占空比可独立调节,同时硬件上支持自动增或降占空比,方便LED RGB的开发。其他具体技术细节请参考数据手册和参考手册

按照之前的方法,新建一个工程,添加模板,如下图,然后编译运行

image-20210701171942-1.png

然后编译运行,利用Eclipse自带的串口助手查看,如下图,会输出一个5KHZ的方波,占空比约50%

image-20210701171942-2.png

 

先大致分析一下程序

1、首先先对定时器进行配置

image-20210701171942-3.png

其中duty_resolution = LEDC_TIMER_12_BIT是配置PWM分辨位数,ESP32-C3PWM最高可以配置为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频率是有一个固定范围的,如下面的表格(可能理解有错误,欢迎指正)

image-20210701171942-4.png

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,其中n0-100.flags.output_invert = 0是选择是否反转,最后将结构体通过ledc_channel_config写入

image-20210701171943-5.png

如果占空比是固定的,在这个结构体里就可以设置好,如果占空比要变化,调用以下函数比较方便。           

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);

具体的可以参考例程,写的也蛮详细的。

最后放几张效果图,用逻辑分析仪观察

下图为4MHZ50%,还是很轻松的

image-20210701171943-6.png

下图是5KHZ,占空比自动从0-50,再从50-0

image-20210701171943-7.png


回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/9 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表