ESP32零基础教学第二章: 2.3 ESP32 PWM(脉宽调制)

ESP32 PWM(脉宽调制)超详细零基础教学

PWM(Pulse Width Modulation,脉宽调制)是嵌入式开发中非常重要的一项技术,广泛应用于LED调光、电机控制、舵机驱动、音频输出等领域。本文将详细讲解PWM的原理、ESP32中PWM的实现方法以及如何利用PWM完成具体的应用。


目录

  1. PWM简介
  2. ESP32的PWM
  3. PWM应用实例
  4. 常见问题与调试
  5. 总结

PWM简介

什么是PWM?

PWM是一种通过快速切换信号的高低电平来模拟不同电压的技术。简单来说,PWM信号是一个周期性变化的方波,通过调整方波中高电平的持续时间(占空比),可以控制输出信号的平均电压。

占空比

占空比(Duty Cycle)是指一个PWM周期内,高电平时间占整个周期时间的比例。占空比通常用百分比表示,范围是0%到100%。

例如:

  • 占空比为0%:信号始终为低电平。
  • 占空比为50%:高电平时间和低电平时间相等。
  • 占空比为100%:信号始终为高电平。

频率

PWM频率是指每秒钟完成的PWM周期数,单位为赫兹(Hz)。频率决定了PWM信号的周期长度。

例如:

  • 频率为1kHz:每个周期长度为1ms。
  • 频率为10kHz:每个周期长度为0.1ms。

PWM波形图

以下是一个PWM信号的示意图:

图中:

  • 横轴表示时间,纵轴表示电压。
  • T代表一个PWM周期。
  • Ton代表高电平时间,Toff代表低电平时间。
  • 占空比 = Ton / T。

ESP32的PWM

PWM引脚

ESP32大部分GPIO引脚都支持PWM输出,但以下引脚是常用的PWM引脚:

  • GPIO2, GPIO4, GPIO5, GPIO12, GPIO13, GPIO14, GPIO15, GPIO16, GPIO17, GPIO18, GPIO19, GPIO21, GPIO22, GPIO23, GPIO25, GPIO26, GPIO27。

PWM配置

ESP32的PWM功能通过LEDC(LED Control)模块实现。以下是PWM的基本配置步骤:

  1. 设置PWM的频率。
  2. 设置PWM的分辨率(决定占空比的精度)。
  3. 将PWM信号输出到指定引脚。

默认情况下,ESP32的PWM频率为5kHz,分辨率为8位(占空比范围为0到255)。

analogWrite()函数详解

在ESP32中,analogWrite()函数用于生成PWM信号。该函数的原型为:

void analogWrite(uint8_t pin, int value);

参数说明:

  • pin:PWM输出的引脚。
  • value:占空比值,范围为0到255。

例如:

  • analogWrite(5, 128);:在GPIO5上生成占空比为50%的PWM信号。

PWM应用实例

控制LED亮度

通过调整PWM信号的占空比,可以控制LED的亮度。

硬件连接
  • 将LED的正极连接到ESP32的GPIO5。
  • 将LED的负极通过一个220Ω电阻接地。
示例代码
int ledPin = 5; // 使用GPIO5控制LED

void setup() {
  pinMode(ledPin, OUTPUT); // 设置引脚为输出模式
}

void loop() {
  // 逐渐增加亮度
  for (int dutyCycle = 0; dutyCycle <= 255; dutyCycle++) {
    analogWrite(ledPin, dutyCycle);
    delay(10); // 等待10ms
  }
  // 逐渐降低亮度
  for (int dutyCycle = 255; dutyCycle >= 0; dutyCycle--) {
    analogWrite(ledPin, dutyCycle);
    delay(10); // 等待10ms
  }
}
效果
  • LED会逐渐变亮,然后逐渐变暗,形成呼吸灯效果。

驱动舵机

舵机是一种角度控制的执行器,通过PWM信号可以控制其旋转角度。

硬件连接
  • 将舵机的信号线连接到ESP32的GPIO5。
  • 将舵机的电源线连接到外部电源(注意电压与舵机规格匹配)。
  • 将舵机的地线连接到ESP32的地线。
示例代码
int servoPin = 5; // 使用GPIO5控制舵机

void setup() {
  pinMode(servoPin, OUTPUT);
}

void loop() {
  // 从0度到180度
  for (int angle = 0; angle <= 180; angle++) {
    int pulseWidth = map(angle, 0, 180, 500, 2500); // 映射角度到脉冲宽度
    analogWrite(servoPin, pulseWidth); // 生成PWM信号
    delay(10); // 等待10ms
  }
  // 从180度到0度
  for (int angle = 180; angle >= 0; angle--) {
    int pulseWidth = map(angle, 0, 180, 500, 2500); // 映射角度到脉冲宽度
    analogWrite(servoPin, pulseWidth); // 生成PWM信号
    delay(10); // 等待10ms
  }
}
效果
  • 舵机会从0度旋转到180度,然后从180度旋转回0度。

常见问题与调试

  1. PWM信号不稳定

    • 检查电源是否稳定。
    • 确保接地良好。
  2. 舵机不工作

    • 检查舵机电源电压是否匹配。
    • 确保PWM信号的频率和脉冲宽度正确。
  3. LED亮度不均匀

    • 检查PWM频率是否过高或过低。
    • 确保占空比范围正确。

总结

PWM是一项非常实用的技术,在ESP32中可以通过analogWrite()函数轻松实现。通过调整占空比和频率,可以完成LED亮度控制、舵机驱动等多种应用。希望这篇教程能帮助你掌握PWM的基本原理,并成功应用到自己的项目中!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

龙大大L

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

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

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

打赏作者

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

抵扣说明:

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

余额充值