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的占空比
}

六、程序分析

  1. PWM 初始化

    • pwm_init(led1_pin, 0, 1000, 10)
    • 频率:1kHz
    • 分辨率:10位,占空比范围 0 ~ 1023
  2. 占空比控制

    • g_duty_value 逐渐递增:LED 逐渐变亮
    • 超过最大值 → 反向递减:LED 逐渐变暗
  3. 呼吸节奏

    • 每次修改占空比后 delay(10),LED 呼吸周期大约为 2s,视觉效果柔和。

七、实验总结

本实验利用 ESP32-S3 的 PWM 功能,通过不断调整 占空比 实现了 呼吸灯效果

  • 学会了使用 ledcSetup()ledcWrite() 控制 PWM
  • 掌握了 占空比的动态变化控制
  • 完整实现了一个非常常见的 LED 呼吸灯应用

PWM 在嵌入式开发中应用非常广泛,不仅可以驱动 LED,还可以用于 电机调速、蜂鸣器音调控制 等场景。

posted @ 2025-08-16 14:14  jeikerxiao  阅读(147)  评论(0)    收藏  举报