ESP32 控制步进电机

该项目使用 ESP32 控制步进电机的正反转,通过按钮触发电机的状态改变。项目使用 FreeRTOS 任务调度,利用定时器中断来实现步进电机的控制,并通过按钮触发电机的动作切换。

硬件连接

  • IN1、IN2、IN3、IN4:连接步进电机的四个控制引脚,用于控制电机的旋转方向和步进。
  • BUTTON_PIN:连接到 GPIO 0 引脚,用于触发电机状态的改变(暂停、正转、反转)。

引脚定义

  • IN1_PIN: GPIO 9
  • IN2_PIN: GPIO 10
  • IN3_PIN: GPIO 11
  • IN4_PIN: GPIO 12
  • BUTTON_PIN: GPIO 0

功能概述

1. 电机控制

该系统使用一个定时器来周期性地控制步进电机的步进,每 5ms 更新一次步进状态。电机的四个控制引脚(IN1~IN4)根据当前步进序列的值来设置,步进序列通过 step_sequence 数组预设。

2. 按钮触发

通过按钮(连接到 GPIO 0)触发电机状态的切换。每按下按钮一次,电机的状态会从暂停切换到正转,再到反转,最后再次暂停。

  • 按钮按下时,电机会按顺序经历:正转 → 暂停 → 反转 → 暂停

3. 中断与队列

使用中断和队列来保证按钮按下事件的响应和电机控制状态的更新。

4. 定时器

利用 ESP32 的硬件定时器,每隔 5ms 触发一次步进电机的更新,以控制电机的旋转。

系统流程

  1. 初始化

    • 配置步进电机的控制引脚(GPIO 9、10、11、12)。
    • 配置按钮引脚(GPIO 0)并启用中断。
    • 初始化定时器,用于周期性更新电机的步进状态。
  2. 按钮事件

    • 按下按钮时,通过中断触发事件,将事件发送到队列中。
    • 主任务从队列中接收事件,更新电机的状态(正转、反转、暂停)。
  3. 步进控制

    • 电机的步进序列是通过 8 步序列的方式实现的,根据当前的电机状态更新步进的引脚值。

代码结构

1. gpio_init()

初始化步进电机控制引脚的输入输出模式。

2. init_motor_timer()

初始化定时器,用于定时更新步进电机的状态。定时器中断每 5 毫秒触发一次,调用 on_timer_isr() 更新步进电机的状态。

3. motor_control_task()

FreeRTOS 任务,负责接收按钮事件并根据当前的电机状态进行切换。电机状态按顺序循环:暂停 → 正转 → 暂停 → 反转 → 暂停

4. on_timer_isr()

定时器中断服务程序,每隔 5ms 更新电机的步进状态。

5. button_isr_handler()

按钮中断服务程序,检测按钮按下事件,并将事件放入队列中进行处理。

如何运行

  1. 将代码上传到 ESP32 开发板。
  2. 连接步进电机控制引脚(IN1~IN4)到相应的硬件。
  3. 将按钮连接到 GPIO 0 引脚。
  4. 编译并上传代码到 ESP32 开发板。
  5. 按下按钮,观察电机的旋转状态和日志输出。