ESP32-S3 控制 PWM呼吸灯
ESP32-S3 PWM呼吸灯
在很多智能硬件设备中,我们经常能看到一种柔和的“呼吸灯”效果:LED 灯缓慢变亮,再缓慢变暗,如同呼吸一般。
本实验基于 ESP32-S3 的 PWM 功能,实现一个完整的 呼吸灯实验。
一、实验目的
- 学习 ESP32-S3 的 PWM(Pulse Width Modulation,占空比调制) 功能
- 掌握 占空比的变化控制方法
- 实现 LED 呼吸灯 效果
二、实验器材
- ESP32-S3 开发板
- LED 模块 × 1
- 杜邦线若干
三、接线说明
| 模块 | 引脚 | ESP32-S3 IO |
|---|---|---|
| LED 模块 | D1 | IO3 |
LED D1 引脚接到 ESP32-S3 的 GPIO3。
四、实验现象
程序下载成功后,LED 会 逐渐从暗变亮,再逐渐从亮变暗,循环往复,呈现“呼吸灯”效果。
五、完整源代码
实验代码分为 主程序、LED 驱动、PWM 驱动 三部分。
1. 主程序 main.ino
/*
* 实验名称:PWM呼吸灯实验
*
* 接线说明:LED模块-->ESP32 IO
* (D1)-->(3)
*
* 实验现象:程序下载成功后,D1指示灯呈现呼吸灯效果,由暗变亮,再由亮变暗
*/
#include "public.h"
#include "led.h"
#include "pwm.h"
//定义全局变量
u16 g_duty_value=0; // 占空比初值
u8 g_fx=1; // 呼吸方向:1 = 变亮,0 = 变暗
void setup() {
pwm_init(led1_pin,0,1000,10); // 初始化PWM,频率1kHz,分辨率10位
}
void loop() {
if(g_fx==1) // 逐渐变亮
{
g_duty_value+=10;
if(g_duty_value>1010) g_fx=0; // 超过范围,切换方向
}
else // 逐渐变暗
{
g_duty_value-=10;
if(g_duty_value<10) g_fx=1; // 低于范围,切换方向
}
pwm_set_duty(0,g_duty_value); // 设置占空比
delay(10); // 延时10ms,控制呼吸速度
}
2. LED 驱动 led.h
#ifndef _led_H
#define _led_H
#include "public.h"
//LED管脚定义
#define led1_pin 3
//函数声明
void led_init(void);
#endif
3. LED 驱动实现 led.cpp
#include "led.h"
//led初始化
void led_init(void)
{
pinMode(led1_pin, OUTPUT);//设置引脚为输出模式
}
4. PWM 驱动 pwm.h
#ifndef _pwm_H
#define _pwm_H
#include "public.h"
//函数声明
void pwm_init(u8 pin,u8 chanel,u32 freq,u8 resolution);
void pwm_set_duty(u8 chanel,u32 duty);
#endif
5. PWM 驱动实现 pwm.cpp
#include "pwm.h"
//PWM初始化
//pin:引脚号
//chanel:PWM输出通道0-15
//freq:PWM输出频率,单位HZ
//resolution:PWM占空比的分辨率1-16,比如设置8,分辨率范围0-255
void pwm_init(u8 pin,u8 chanel,u32 freq,u8 resolution)
{
ledcSetup(chanel, freq, resolution);// PWM初始化
ledcAttachPin(pin, chanel);// 绑定PWM通道到GPIO上
}
//PWM占空比设置
void pwm_set_duty(u8 chanel,u32 duty)
{
ledcWrite(chanel,duty);// 改变PWM的占空比
}
六、程序分析
-
PWM 初始化
pwm_init(led1_pin, 0, 1000, 10)- 频率:1kHz
- 分辨率:10位,占空比范围
0 ~ 1023
-
占空比控制
g_duty_value逐渐递增:LED 逐渐变亮- 超过最大值 → 反向递减:LED 逐渐变暗
-
呼吸节奏
- 每次修改占空比后
delay(10),LED 呼吸周期大约为 2s,视觉效果柔和。
- 每次修改占空比后
七、实验总结
本实验利用 ESP32-S3 的 PWM 功能,通过不断调整 占空比 实现了 呼吸灯效果。
- 学会了使用
ledcSetup()和ledcWrite()控制 PWM - 掌握了 占空比的动态变化控制
- 完整实现了一个非常常见的 LED 呼吸灯应用
PWM 在嵌入式开发中应用非常广泛,不仅可以驱动 LED,还可以用于 电机调速、蜂鸣器音调控制 等场景。

浙公网安备 33010602011771号