该项目演示了如何使用 ESP32 控制一个通过 PWM 驱动的电机,使用两个按钮实现电机启动、调速和停止功能。
- 使用
IN1引脚输出 PWM 信号控制电机速度。 - 使用
IN2反向(本例中固定为正转)。 - 使用
BUTTON_PWM按钮依次切换电机的 PWM 档位(50%、60%、70%)。 - 使用
BUTTON_STOP按钮停止电机并清除 PWM 输出。
| 引脚 | 功能 |
|---|---|
| GPIO9 | IN1(PWM 输出) |
| GPIO10 | IN2(0) |
| GPIO0 | BUTTON_PWM(PWM 档位切换) |
| GPIO4 | BUTTON_STOP(电机停止) |
所有按钮使用下拉电阻,并配置为下降沿中断。
PWM 占空比定义如下(以 10-bit 分辨率为准):
| 档位 | 占空比 |
|---|---|
| 1 | 50% |
| 2 | 60% |
| 3 | 70% |
循环按下 BUTTON_PWM 将在这几个档位之间切换。重新启动电机后从第一档(50%)开始。
-
编译并烧录固件到 ESP32。
-
上电后,按下
BUTTON_PWM:- 第一次按下启动电机。
- 随后每次按下将切换至下一个 PWM 档位。
-
按下
BUTTON_STOP可立即停止电机。
-
app_main():- 初始化 GPIO 和中断;
- 设置 PWM;
- 创建任务
button_task用于处理按钮事件。
-
button_task():- 等待按钮中断事件;
- 控制电机运行状态及 PWM 档位;
- 实现按钮去抖。
-
中断处理函数:
button_pwm_isr_handler:处理 PWM 按钮按下;button_stop_isr_handler:处理停止按钮按下。
-
apply_pwm_level():根据当前档位设置 PWM 占空比; -
init_pwm():初始化ledc模块用于 PWM 控制。
- ESP-IDF
- 硬件:ESP32 芯片(GPIO9 和 GPIO10 可替换为其它 PWM 支持引脚)
- 电机的驱动电流需要由电机驱动芯片提供,ESP32 仅作为控制信号输出;
- BUTTON_PWM 和 BUTTON_STOP 必须具备下拉或外接电阻确保稳定触发;
- 所有 GPIO 号可根据实际开发板引脚修改。