ESP32 PWM Motor Control with Button Input

该项目演示了如何使用 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 档位说明

PWM 占空比定义如下(以 10-bit 分辨率为准):

档位 占空比
1 50%
2 60%
3 70%

循环按下 BUTTON_PWM 将在这几个档位之间切换。重新启动电机后从第一档(50%)开始。

使用方式

  1. 编译并烧录固件到 ESP32。

  2. 上电后,按下 BUTTON_PWM

    • 第一次按下启动电机。
    • 随后每次按下将切换至下一个 PWM 档位。
  3. 按下 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 号可根据实际开发板引脚修改。