ESP32零基础教学:PWM(脉宽调制)超详细指南
创作时间:
作者:
@小白创作中心
ESP32零基础教学:PWM(脉宽调制)超详细指南
引用
CSDN
1.
https://blog.csdn.net/Hi__gril/article/details/145915971
PWM(脉宽调制)是嵌入式开发中非常重要的一项技术,广泛应用于LED调光、电机控制、舵机驱动、音频输出等领域。本文将详细讲解PWM的原理、ESP32中PWM的实现方法以及如何利用PWM完成具体的应用。
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的基本配置步骤:
- 设置PWM的频率。
- 设置PWM的分辨率(决定占空比的精度)。
- 将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度。
常见问题与调试
- PWM信号不稳定
- 检查电源是否稳定。
- 确保接地良好。
- 舵机不工作
- 检查舵机电源电压是否匹配。
- 确保PWM信号的频率和脉冲宽度正确。
- LED亮度不均匀
- 检查PWM频率是否过高或过低。
- 确保占空比范围正确。
总结
PWM是一项非常实用的技术,在ESP32中可以通过analogWrite()函数轻松实现。通过调整占空比和频率,可以完成LED亮度控制、舵机驱动等多种应用。希望这篇教程能帮助你掌握PWM的基本原理,并成功应用到自己的项目中!
热门推荐
秋冬炸萝卜丸子,家庭安全指南
炸萝卜丸子新花样:加点豆腐和馒头屑!
减肥也能吃炸萝卜丸子?这样做就对了!
古城西安,历史以及文化的厚重,让它孕育了很多的特色美味
西安美食推荐:穿越千年的味蕾盛宴
8K+三维音效,今年春晚黑科技大揭秘!
双十一期间如何用AI保障你的网购安全?
从落魄王子到英国王夫:菲利普亲王的历史传奇
米其林推荐:福建必吃佛跳墙
福建旅游打卡:武夷山、鼓浪屿、三坊七巷,你去了几个?
新手爸妈必读:维生素AD补充全攻略
攀枝花苏铁保护区:科技赋能,守护“植物活化石”
湛江国庆游玩指南:霞山步行街必打卡!
赤坎老街:湛江千年商埠的文化瑰宝
东海岛:湛江必打卡的绝美海滩度假胜地
湛江三大景点全攻略:湖光岩、硇洲岛、东海岛
惊人的"鸡群定律":兄弟姐妹间最好的相处方式,不是聚会和吃饭
亚龙湾最刺激的水上项目大集合!
《蛟龙行动》主创揭秘:从陆地到深海的挑战
《蛟龙行动》揭秘:林超贤如何打造特种兵训练营?
新种子、新技术、新装备……在“中国蔬菜之乡”看农业“未来式”
推动农业科普,耕耘在科技“田野”上
跟着汪曾祺探秘高邮美食
高邮美食地图:从水上漂馄饨到淮扬菜,一座被低估的美食天堂
高邮阳春面在家也能做!
冬季养生:煲鸡汤的正确打开方式
冬日暖心:老母鸡配甜玉米,一锅好汤的完美秘诀
香菇炖鸡汤,让你秒变大厨!
文成县十大景点推荐:百丈飞瀑、峡谷景廊等
卫生间还做干湿分离就落伍了,如今流行这样改,比两个卫生间实用