乐鑫Esp32学习之旅⑤ 接触实践esp32的pwm宽度脉冲功能的LEDC, 实现呼吸效果闪烁一盏LED灯。(附带Demo)


  • 本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。

1、 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 “Hellow World”。
2、 巧用eclipes编辑器,官方教程在在Windows下搭建esp32开发环境,打印 “Hellow World”。
3、 认识基本esp32的GPIO接口,开始点亮您的第一盏 LED和中断回调实现按键功能 。
4、体会esp32的强大的定时器功能, 实现定时2s闪烁一盏LED灯。
5、接触实践esp32的pwm宽度脉冲功能, 实现呼吸效果闪烁一盏LED灯。
6、smartConfig和微信airKiss在esp32的实现,一键配网轻松快捷连接路由器。
7、利用GPIO中断做一个按键的短按和长按的回调事件,再也无须担心触发源。
8、esp32上实现本地 UDP 客户端和服务端角色,在局域网内实现通讯。
9、esp32上实现本地 TCP 客户端和服务端角色,可断线重连原路返回数据。
10、乐鑫esp32 SDK编程利用rmt驱动ws2812七彩灯,实现彩虹渐变效果。
11、入门 乐鑫esp-adf 音频框架开发,esp32造一个蓝牙耳机,实现切换歌曲,获取歌曲信息等功能。
12、开源一个微信公众号airkiss配网esp32以及局域网发现功能的工程,分享一个airkiss配网小工具。

一 前言:

  • PWM的技术我们再熟悉不过了,只需要输出脉冲信号,即可调节灯具或者电机这些设备,在ESP32里面,官方把输出控制的PWM的功能控制器叫PWMC,因为是由他控制的,见下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OrRD4xmo-1570417652194)(https://esp-idf.readthedocs.io/en/latest/_images/ledc-api-settings.jpg)]


二 前言:


  • 本博文的电路图为如下:

这里写图片描述


  • 效果:

2路PWM输出的管脚呼吸闪烁,从俺到亮,之后又渐变暗,不断循环交替!


三 官方API说明:


  • 此文档的地址:https://esp-idf.readthedocs.io/en/latest/api-reference/peripherals/ledc.html
  • 原文,个人翻译,大概讲的意思是如下:

       LED Control (LEDC)模块主要是为了调节LED的亮度而设计的,而且它也可以用于产生其他用途的PWM信号。它有16个通道,可以产生独立的波形,可以用来驱动例如RGB LED器件。


  • 我在认真阅读了这文档之后,发现esp32对调光的封装真是太好了,一共有6个时钟计数器,有8个通道,而且在调光过程中,还提供了渐变的函数,就是从一个占空比到另外一个占空比的过渡时候,是逐渐地,不是一下子跳过去的,这点非常适合LED行业的需求!

①:重要方法: ledc_fade_func_install():注册LEDC服务,在调用前使用,参数是作为是否允许中断。

这里写图片描述


②:结构体ledc_timer_config_t:配置定时器参数,ledc_mode_t是指定高速或者低速运行?ledc_timer_t是指哪个定时器,有四个0到3!定时器的位数ledc_timer_bit_t

这里写图片描述


③:配置好上面的结构体之后,请调用ledc_timer_config(),参数为上面的结构体!

这里写图片描述


③:每次改变占空比,请先调用ledc_set_fade_with_time():顾名思义就是设置渐变的时间,ledc_channel_t参数是指哪个通道,target_duty是要占空比,注意这个数值的取值和上面设置的duty_resolution的定时器位数有关系!比如duty_resolution = LEDC_TIMER_13_BIT指定为13位,则取值范围是0 到 2^13-1!说白了就是个被除数!最后调用ledc_fade_start()即可实现调光啦!

这里写图片描述


二 代码:


  • 详细见下面:


//定义2个GPIO作为PWM输出
#define  LEDC_TOTAL_NUM 2
#define LEDC_HS_TIMER          LEDC_TIMER_0
#define LEDC_HS_MODE           LEDC_HIGH_SPEED_MODE
#define LEDC_HS_CH0_GPIO       18
#define LEDC_HS_CH0_CHANNEL    LEDC_CHANNEL_0
#define LEDC_HS_CH1_GPIO       19
#define LEDC_HS_CH1_CHANNEL    LEDC_CHANNEL_1

//渐变的变大最终目标占空比
#define LEDC_TEST_DUTY         8000
//渐变的时间
#define LEDC_TEST_FADE_TIME    3000

void fun_pwm() {

	ledc_timer_config_t ledc_timer = { .duty_resolution = LEDC_TIMER_13_BIT, // resolution of PWM duty
			.freq_hz = 5000,                      // frequency of PWM signal
			.speed_mode = LEDC_HS_MODE,           // timer mode
			.timer_num = LEDC_HS_TIMER            // timer index
			};

	// Set configuration of timer0 for high speed channels
	ledc_timer_config(&ledc_timer);

	ledc_channel_config_t ledc_channel[LEDC_TOTAL_NUM] = { { .channel =
	LEDC_HS_CH0_CHANNEL, .duty = 0, .gpio_num = LEDC_HS_CH0_GPIO, .speed_mode =
	LEDC_HS_MODE, .timer_sel = LEDC_HS_TIMER },

	{ .channel = LEDC_HS_CH1_CHANNEL, .duty = 0, .gpio_num = LEDC_HS_CH1_GPIO,
			.speed_mode = LEDC_HS_MODE, .timer_sel = LEDC_HS_TIMER },

	};

	int ch;
	// Set LED Controller with previously prepared configuration
	for (ch = 0; ch < LEDC_TOTAL_NUM; ch++) {
		ledc_channel_config(&ledc_channel[ch]);
	}

	// Initialize fade service.
	ledc_fade_func_install(0);

	while (1) {

		printf("1. PWM逐渐变大的周期目标 = %d\n", LEDC_TEST_DUTY);

		for (ch = 0; ch < LEDC_TOTAL_NUM; ch++) {
			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);
		}
		vTaskDelay(LEDC_TEST_FADE_TIME / portTICK_PERIOD_MS);

		printf("2.  PWM逐渐变小的周期目标 = 0\n");

		for (ch = 0; ch < LEDC_TOTAL_NUM; ch++) {
			ledc_set_fade_with_time(ledc_channel[ch].speed_mode,
					ledc_channel[ch].channel, 0, LEDC_TEST_FADE_TIME);
			ledc_fade_start(ledc_channel[ch].speed_mode,
					ledc_channel[ch].channel, LEDC_FADE_NO_WAIT);
		}

		vTaskDelay(LEDC_TEST_FADE_TIME / portTICK_PERIOD_MS);

	}

}


其他:
  • 本博文硬件下载:https://download.csdn.net/download/xh870189248/10432852
  • ESP8266学习之旅代码汇总,欢迎star:https://github.com/xuhongv/StudyInEsp8266
  • ESP32学习之旅代码汇总,欢迎star:https://github.com/xuhongv/StudyInEsp32
  • 小徐QQ交流群:434878850
  • 6
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半颗心脏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值