Skip to content

Latest commit

 

History

History
303 lines (220 loc) · 6.05 KB

File metadata and controls

303 lines (220 loc) · 6.05 KB

ESP32-C3 双路编码电机控制器 UART 协议文档 V1.0

基本参数

项目
波特率 115200
数据位 8
停止位 1
校验

帧格式

[0xAA] [0x55] [CMD] [LEN] [PAYLOAD x LEN] [CHK]
字段 长度 说明
帧头 2 字节 固定 0xAA 0x55
CMD 1 字节 命令/响应字
LEN 1 字节 Payload 长度(字节数,可为 0)
PAYLOAD LEN 字节 数据内容
CHK 1 字节 XOR 校验:CMD ^ LEN ^ PAYLOAD[0] ^ ... ^ PAYLOAD[N-1]

系统状态

状态值 状态名 蓝灯 说明
0x00 UNINIT 上电初始状态
0x01 IDLE 常亮 初始化完成
0x02 READY 慢闪 500ms 配置完成
0x03 RUNNING 快闪 100ms 电机运行中
0x04 SYS_ERROR 双闪 系统错误

主机 → ESP32 命令

0x01 INIT — 系统初始化

  • Payload:无(LEN = 0)
  • 作用:复位编码器计数、停止双路电机,进入 IDLE 状态
  • 响应:ACK(0x01)
  • 前置状态:任意

示例

AA 55 01 00 01

0x02 CONFIG — 系统配置

  • Payload(4 字节):
字节 含义 类型
[0:1] PPR(每转脉冲数) uint16 大端
[2:3] PWM 频率(Hz) uint16 大端
  • 作用:更新编码器 PPR 和 PWM 频率,重新初始化驱动引脚,进入 READY 状态
  • 响应:ACK(0x02) 或 NACK
  • 前置状态:必须为 IDLE

常用 PPR 值

减速比 PPR
1:48 2496
1:90 4680

示例(PPR=2496, PWM_FREQ=20000)

AA 55 02 04 09 C0 4E 20 CHK
CHK = 0x02^0x04^0x09^0xC0^0x4E^0x20 = 0xEB
完整帧: AA 55 02 04 09 C0 4E 20 EB

0x10 SET_SPEED — 设置电机速度

  • Payload(3 字节):
字节 含义 类型
[0] 电机 ID(0=M1, 1=M2) uint8
[1:2] 速度(-255~255,负数反转) int16 大端
  • 作用:设置指定电机的 PWM 速度和方向,进入 RUNNING 状态
  • 响应:ACK(0x10) 或 NACK
  • 前置状态:READY 或 RUNNING

示例(M1 正转 200)

AA 55 10 03 00 00 C8 CHK
CHK = 0x10^0x03^0x00^0x00^0xC8 = 0xDB
完整帧: AA 55 10 03 00 00 C8 DB

示例(M2 反转 150)

速度 -150 = 0xFF6A
AA 55 10 03 01 FF 6A CHK
CHK = 0x10^0x03^0x01^0xFF^0x6A = 0x77
完整帧: AA 55 10 03 01 FF 6A 77

0x11 STOP — 自由停止(Coast)

  • Payload(1 字节):电机 ID(0=M1, 1=M2)
  • 作用:两路 PWM 均置 0,电机自由滑行
  • 响应:ACK(0x11) 或 NACK
  • 前置状态:READY 或 RUNNING

示例(停 M1)

AA 55 11 01 00 10

0x12 BRAKE — 刹车

  • Payload(1 字节):电机 ID(0=M1, 1=M2)
  • 作用:两路 PWM 均置 255,电机短接制动
  • 响应:ACK(0x12) 或 NACK
  • 前置状态:READY 或 RUNNING

示例(刹 M2)

AA 55 12 01 01 12

0x13 SET_SPEEDS — 同时设置双电机速度

  • Payload(4 字节):
字节 含义 类型
[0:1] M1 速度(-255~255) int16 大端
[2:3] M2 速度(-255~255) int16 大端
  • 作用:一条指令同时设置两个电机的 PWM 速度和方向,进入 RUNNING 状态
  • 响应:ACK(0x13) 或 NACK
  • 前置状态:READY 或 RUNNING

示例(M1=200, M2=-150)

速度 200 = 0x00C8,-150 = 0xFF6A
AA 55 13 04 00 C8 FF 6A CHK
CHK = 0x13^0x04^0x00^0xC8^0xFF^0x6A = 0xD4
完整帧: AA 55 13 04 00 C8 FF 6A D4

0x20 GET_RPM — 查询转速

  • Payload(1 字节):电机 ID(0=M1, 1=M2, 2=双路同时返回
  • 响应:一条或两条 RPM_DATA(0x90)
  • 前置状态:IDLE 及以上

示例(查询双路)

AA 55 20 01 02 23

0x21 GET_STATUS — 查询系统状态

  • Payload:无(LEN = 0)
  • 响应:STATUS(0x91)
  • 前置状态:任意

示例

AA 55 21 00 21

0xFF RESET — 复位

  • Payload:无(LEN = 0)
  • 作用:停止双路电机,回到 UNINIT 状态
  • 响应:ACK(0xFF)
  • 前置状态:任意

示例

AA 55 FF 00 FF

ESP32 → 主机 响应

0x80 ACK

  • Payload(1 字节):被响应的命令字

示例(响应 INIT)

AA 55 80 01 01 80

0x81 NACK

  • Payload(2 字节):
字节 含义
[0] 被响应的命令字
[1] 错误码

错误码表

错误码 含义
0x01 当前状态不允许该命令
0x02 校验错误
0x03 参数非法(长度/范围/ID错误)
0x04 未知命令

0x90 RPM_DATA — 转速数据

  • Payload(3 字节):
字节 含义 类型
[0] 电机 ID(0 或 1) uint8
[1:2] 转速 RPM(正=正转,负=反转) int16 大端

示例(M1 = 185 RPM)

AA 55 90 03 00 00 B9 CHK

0x91 STATUS — 系统状态

  • Payload(5 字节):
字节 含义 类型
[0] 系统状态值 uint8
[1:2] M1 转速 RPM int16 大端
[3:4] M2 转速 RPM int16 大端

典型初始化流程

主机                          ESP32
  |--- INIT (0x01) ----------->|
  |<-- ACK (0x01) -------------|   蓝灯常亮

  |--- CONFIG (0x02)           |
  |    PPR=2496, FREQ=20000 -->|
  |<-- ACK (0x02) -------------|   蓝灯慢闪

  |--- SET_SPEED (0x10)        |
  |    M1, +200 -------------->|
  |<-- ACK (0x10) -------------|   蓝灯快闪

  |--- GET_RPM (0x20) M1=0 --->|
  |<-- RPM_DATA (0x90) --------|

硬件引脚对照

GPIO 功能
GPIO3 M1 IN2 (DRV8833 AIN2)
GPIO4 M1 IN1 (DRV8833 AIN1)
GPIO5 M1 编码器 A 相
GPIO6 M1 编码器 B 相
GPIO1 M2 IN1
GPIO2 M2 IN2
GPIO7 M2 编码器 A 相
GPIO10 M2 编码器 B 相
GPIO8 板载蓝色 LED
GPIO20 UART RX (USB-CDC)
GPIO21 UART TX (USB-CDC)