ESP32 开发笔记(三)源码示例 3_LEDC_PWM 使用LEDC实现LED呼吸灯

开发板购买连接windows

https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111deb2Ij1As&ft=t&id=626366733674app

开发板简介
开发环境搭建 windows
源码示例:
    0_Hello Bug (ESP_LOGX与printf)    工程模板/打印调试输出
    1_LED                                                    LED亮灭控制       
    2_LED_Task                                          使用任务方式控制LED
    3_LEDC_PWM                                      使用LEDC来控制LED实现呼吸灯效果
    4_ADC_LightR                                      使用ADC读取光敏电阻实现光照传感
    5_KEY_Short_Long                              按钮长按短按实现
    6_TouchPad_Interrupt                          电容触摸中断实现
    7_WS2812_RMT                                  RGB_LED彩虹变色示例
    8_DHT11_RMT                                    使用RMT实现读取DHT11温湿度传感器
    9_SPI_SDCard                                    使用SPI总线实现TF卡文件系统示例
    10_IIC_ADXL345                                使用IIC总线实现读取ADXL345角度加速度传感器
    11_IIC_AT24C02                                 使用IIC总线实现小容量数据储存测试
    12_IR_Rev_RMT                                使用RMT实现红外遥控接收扫码(NEC)
    13_IR_Send_RMT                              使用RMT实现红外数据发送(NEC)
    14_WIFI_Scan                                    附近WIFI信号扫描示例    
    15_WIFI_AP                                        建立软AP示例
    16_WIFI_AP_TCP_Server                  在软AP模式下实现TCP服务端
    17_WIFI_AP_TCP_Client                   在软AP模式下实现TCP客户端
    18_WIFI_AP_UDP                              在软AP模式下实现UDP通信
    19_WIFI_STA                                      建立STA站模
    20_WIFI_STA_TCP_Server                在站模式STA下实现TCP服务端
    21_WIFI_STA_TCP_Client                 在站模式STA下实现TCP客户端
    22_WIFI_STA_UDP                            在站模式STA下实现UDP通信
    23_LVGL_Test                                     LVGL图形库简单示例函数

1、硬件设计/原理

查看开发板原理图,能够看到开发板上有两个指示灯,一个是电源指示灯,直接3.3V到地,不受程序控制,APP_LED接在ESP32-WROOM-32E集成模拟的GPIO4脚上,看原理图可得知IO4拉高LED即灭掉,到地则亮起测试

2、程序设计

LEDC是ESP封装好的LED控制器使用的是PWM定时器实现ui

LED Control (LEDC)模块主要是为了调节LED的亮度而设计的,并且它也能够用于产生其余用途的PWM信号。它有16个通道,能够产生独立的波形,能够用来驱动例如变色RGB灯,呼吸灯,电机调速等器件.net

先引用必要头文件设计

// LEDC_PWM Example

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/ledc.h"
#include "esp_err.h"
#include <esp_log.h>

宏定义调试

#define LEDC_TOTAL_NUM         1				// LED个数,能够多个
#define LEDC_HS_TIMER          LEDC_TIMER_0		// 使用哪一个定时器0-3
#define LEDC_HS_MODE           LEDC_HIGH_SPEED_MODE// 模式
#define LEDC_HS_CH0_GPIO       4				// LED控制器通道对应GPIO
#define LEDC_HS_CH0_CHANNEL    LEDC_CHANNEL_0	// LED控制器通道号
#define LEDC_TEST_DUTY         8000				// 渐变的变大最终目标占空比
#define LEDC_TEST_FADE_TIME    3000				// 变化时长

主函数code

void app_main() 
{
	int ch;
	ESP_LOGI(TAG, "APP Start......");

	ledc_timer_config_t ledc_timer = { 
		.duty_resolution = LEDC_TIMER_13_BIT,	// PWM占空比分辨率
		.freq_hz = 5000,						// PWM信号频率
		.speed_mode = LEDC_HS_MODE,				// 定时器模式
		.timer_num = LEDC_HS_TIMER				// 定时器序号
	};
	// 配置定时器0的高速通道
	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 
		},
	};
	// 配置LED控制器
	for (ch = 0; ch < LEDC_TOTAL_NUM; ch++) {
		ledc_channel_config(&ledc_channel[ch]);
	}
	// 初始化淡入淡出服务
	ledc_fade_func_install(0);					// 注册LEDC服务,在调用前使用,参数是做为是否容许中断
	while (1) {
		ESP_LOGI(TAG,"PWM to max %d\n", LEDC_TEST_DUTY);
		// 循环渐变每一个LED,这里只有一个
		for (ch = 0; ch < LEDC_TOTAL_NUM; ch++) {
			// 配置LEDC定时器
			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);

		ESP_LOGI(TAG,"PWM to min 0\n");
		// 循环渐变每一个LED,这里只有一个
		for (ch = 0; ch < LEDC_TOTAL_NUM; ch++) {
			// 配置LEDC定时器
			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);
	}
}

3、下载测试

打开ESP-IDF Command Prompthtm

cd命令进入此工程目录

cd F:\ESP32_DevBoard_File\2_LED_Task

查看电脑设备管理器中开发板的串口号

执行idf.py -p COM9 flash monitor从串口9下载并运行打开口显示设备调试信息   Ctrl+c退出运行

能够看到开发板的APP_LED从亮到灭再从灭到亮开始渐变。