ESP32-S3 IDF编程第六课:硬件PWM —— 让LED呼吸、舵机听话

上节课我们用硬件定时器实现了精确1秒闪烁。但你有没有想过:如果把定时器再升级一下,让它能控制”亮多久、灭多久”的比例,会是什么效果?这就是这节课的主角——PWM(脉宽调制)

你可能会说:”PWM不就是方波吗?我直接用定时器中断配合GPIO翻转也能模拟啊!”没错,第四课我们确实可以这样干,但有两个致命问题:

  • CPU累死:哪怕只是50Hz的舵机信号,每秒100次中断翻转GPIO,CPU就围着它转。
  • 波形不准:中断被其他高优先级任务抢占,波形就会抖,舵机就会”帕金森”。

ESP32-S3有一个专门的硬件模块叫 LEDC(LED PWM Controller),它本质是”带比较输出的硬件定时器”,配置完就不用CPU管了,波形稳得像老狗。

这节课你会学到

  1. PWM的三个核心参数:频率、占空比、分辨率——彻底搞懂它们的关系。
  2. ESP32-S3的LEDC模块深度解析(为什么只有低速模式、内部结构、时钟树)。
  3. LED呼吸灯实验——用正弦函数实现丝滑呼吸效果。
  4. 舵机控制实战——驱动SG90,精准控制角度,附校准秘籍。
  5. 常见坑点:频率与分辨率互斥的数学原理、占空比更新时机、ESP32-S3与ESP32的LEDC差异。

硬件接线

  • LED呼吸灯:LED正极接 GPIO4(串220Ω电阻),负极接GND。
  • 舵机实验:SG90舵机信号线接 GPIO5,电源接5V,GND接GND(注意:舵机要从开发板的5V引脚取电,别用3.3V,电流不够会抽搐)。

PWM深度解析:从波形到数学

什么是PWM?一张波形图胜过千言万语

假设我们要让LED呈现50%亮度,GPIO输出的波形是这样的: