首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐
2025年6月14日 星期六 6:42am

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

  • 23-11-14 06:23
  • 3002
  • 10134
blog.csdn.net

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

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配网小工具。

文章目录

      • 一 前言:
      • 二 前言:
      • 三 官方`API`说明:
      • 二 代码:
        • 其他:

一 前言:

  • 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
", 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
");

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

	}

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72

其他:
  • 本博文硬件下载:https://download.csdn.net/download/xh870189248/10432852
  • ESP8266学习之旅代码汇总,欢迎star:https://github.com/xuhongv/StudyInEsp8266
  • ESP32学习之旅代码汇总,欢迎star:https://github.com/xuhongv/StudyInEsp32
  • 小徐QQ交流群:434878850
注:本文转载自blog.csdn.net的半颗心脏的文章"https://blog.csdn.net/xh870189248/article/details/80417430"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top