完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我们先来看一下什么是rgb灯。 全彩 LED 灯, 实质上是一种把红、绿、 蓝单色发光体集成到小面积区域中的 LED 灯,控制时对这三种颜色的灯管输出不同的光照强度,即可混合得到不同的颜色,其混色原理与光的三原色混合原理一致。简单来说就是led会有三个引脚,分别对应着red颜色,green颜色,blue颜色。通过改变它们的占空比,以来达到显示不同的颜色。就像调色板一样,通过红绿蓝三种基础色来调出不同的颜色。 接下来说一下所用到的一些esp32的api,我把它封装在了三个函数里面。 //配置gpio的pwm的初始化 //无形参 //无返回值 void ledp_Init(void) { ledc_timer_config_t ledc_timer = { .duty_resolution = LEDC_TIMER_8_BIT, // resolution of PWM duty .freq_hz = 5000, // frequency of PWM signal .speed_mode = LEDC_MODE, // timer mode .timer_num = LEDC_TIMER, // timer index .clk_cfg = LEDC_AUTO_CLK, // Auto select the source clock }; ledc_timer_config(&ledc_timer); } //gpio输出不同占空比的pwm(带缓冲时间) //LEDC_NUM:输出的引脚,LEDC_DUTY:占空比,LEDC_FADE_TIME:缓冲时间 //无返回值 void ledp_fade_Output(int LEDC_NUM, uint32_t LEDC_DUTY, int LEDC_FADE_TIME) //void ledp_fade_Output() { ledc_channel_config_t ledc_channel = { .channel = LEDC_CH0_CHANNEL, .duty = 0, .gpio_num = LEDC_CH0_GPIO, .speed_mode = LEDC_MODE, .hpoint = 0, .timer_sel = LEDC_TIMER }; ledc_channel_config(&ledc_channel); ledc_fade_func_install(0); ledc_set_fade_with_time(ledc_channel.speed_mode, ledc_channel.channel, LEDC_DUTY, LEDC_FADE_TIME); ledc_fade_start(ledc_channel.speed_mode, ledc_channel.channel, LEDC_FADE_NO_WAIT); } //gpio输出不同占空比的pwm(不带缓冲时间) //LEDC_NUM:输出的引脚,LEDC_DUTY:占空比 //无返回值 void ledp_pwm_Output(int LEDC_NUM, uint32_t LEDC_DUTY) { ledc_channel_config_t ledc_channel = { .channel = LEDC_CHANNEL[LEDC_NUM], .duty = 0, .gpio_num = LEDC_GPIO[LEDC_NUM], .speed_mode = LEDC_MODE, .hpoint = 0, .timer_sel = LEDC_TIMER }; ledc_channel_config(&ledc_channel); ledc_fade_func_install(0); ledc_set_duty(ledc_channel.speed_mode, ledc_channel.channel, LEDC_DUTY); ledc_update_duty(ledc_channel.speed_mode, ledc_channel.channel); 第一个函数ledp_Init()中,ledc_timer_config(const ledc_timer_config_t* timer_conf)主要是对占空比分辨率,频率和时钟的一些配置。 第二个函数ledp_fade_Output(int LEDC_NUM, uint32_t LEDC_DUTY, int LEDC_FADE_TIME)中,ledc_channel_config(const ledc_channel_config_t* ledc_conf)是对通道和引脚进行的配置;其中 ledc_set_fade_with_time(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t target_duty, int max_fade_time_ms)可以做到在一段时间中才到达一个占空比,就像我们平常见到的呼吸灯一样,逐渐到达一个占空比,因此它有传参值 target_duty传入占空比的大小和max_fade_time_ms传入到达占空比的时间(也就是最后两个参数)。最后还需要调用ledc_fade_start(ledc_mode_t speed_mode, ledc_channel_t channel, ledc_fade_mode_t fade_mode)才可以实现功能。 第三个函数ledp_pwm_Output(int LEDC_NUM, uint32_t LEDC_DUTY)就是没有缓冲时间更改占空比的函数了。配置通道和引脚的函数是ledc_channel_config(const ledc_channel_config_t* ledc_conf),配置占空比的函数是ledc_set_duty(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t duty)。 接下来就是实现功能的函数了。 首先说一下调节灯的亮度。 //显示不同亮度的红灯 //LEDC_DUTY:占空比 //无返回值 void ledp_red_Output(uint32_t LEDC_DUTY) { ledp_pwm_Output(GPIO_RED, LEDC_DUTY); ledp_pwm_Output(GPIO_GREEN, LEDC_DUTY_0); ledp_pwm_Output(GPIO_BLUE, LEDC_DUTY_0); } //显示不同亮度的绿灯 //LEDC_DUTY:占空比 //无返回值 void ledp_green_Output(uint32_t LEDC_DUTY) { ledp_pwm_Output(GPIO_RED, LEDC_DUTY_0); ledp_pwm_Output(GPIO_GREEN, LEDC_DUTY); ledp_pwm_Output(GPIO_BLUE, LEDC_DUTY_0); } //显示不同亮度的蓝灯 //LEDC_DUTY:占空比 //无返回值 void ledp_blue_Output(uint32_t LEDC_DUTY) { ledp_pwm_Output(GPIO_RED, LEDC_DUTY_0); ledp_pwm_Output(GPIO_GREEN, LEDC_DUTY_0); ledp_pwm_Output(GPIO_BLUE, LEDC_DUTY); } 在ledp_pwm_Output(int LEDC_NUM, uint32_t LEDC_DUTY)函数中就可以先确定是哪一个引脚输出。然后ledp_red_Output(uint32_t LEDC_DUTY),ledp_green_Output(uint32_t LEDC_DUTY),ledp_blue_Output(uint32_t LEDC_DUTY)就可以传入不同的占空比以来调节灯的亮度。 然后再来说一下如何显示不同颜色的灯光。我们以调出橙光为例 //显示不同亮度的黄灯 //NUM:占空比 //无返回值 void ledp_yellow_Output(uint32_t NUM) { if(NUM<=10) { ledp_pwm_Output(GPIO_RED, LEDC_DUTY_100/NUM); ledp_pwm_Output(GPIO_GREEN, LEDC_DUTY_5/NUM); ledp_pwm_Output(GPIO_BLUE, LEDC_DUTY_0/NUM); } else if(NUM>10) { ledp_pwm_Output(GPIO_RED, LEDC_DUTY_100/NUM); ledp_pwm_Output(GPIO_GREEN, LEDC_DUTY_70/NUM); ledp_pwm_Output(GPIO_BLUE, LEDC_DUTY_0/NUM); } } ledp_yellow_Output(uint32_t NUM)中传参NUM可以调节亮度,函数体中三个函数,根据调节它们的占空比来调节出所需要的颜色。在实际测试中,在全亮状态下得到橙色时,红色和绿色的占空比相差比较大,调节亮度是通过等除脉冲宽度来调节的。当等除的数比较大时,对脉冲宽度比较小的影响比较大,所以可以对不同段的亮度,可以设置出相应的配对组合,上面是设置出了两份。 |
|
|
|
只有小组成员才能发言,加入小组>>
3323 浏览 9 评论
3000 浏览 16 评论
3497 浏览 1 评论
9072 浏览 16 评论
4093 浏览 18 评论
1192浏览 3评论
613浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
603浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2341浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1899浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 05:12 , Processed in 0.919678 second(s), Total 48, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号