Skip to main content

HXC 电机控制项目 — 三套工程模板 & AM32 开发 Skill

概述

综合三个电机控制项目(HXC_A_C620HCX_A_N630AM32)的文档和经验沉淀。涵盖基于 ESP32-S3 + PlatformIO + Arduino 的电机驱动开发全链路:C620 标准 CAN 调试、N630/VESC 扩展 CAN 位控开发、AM32 DSHOT 数字协议驱动,以及 BoardA 模块化库的使用。

前置条件

  • ESP32-S3-DevKitC-1(N16R8:16MB Flash + 8MB PSRAM)
  • Visual Studio Code + PlatformIO 插件
  • 对应硬件:C620 电调 / N630(VESC) 电调 / AM32(FLYROUN) 电调
  • USB 数据线(支持数据传输)

硬件平台共性

PlatformIO 正确配置(关键踩坑)

串口约定

  • Serial = USB CDC(原生 USB,无 CH340)
  • Serial0 = UART0 (GPIO43/44) — 无线烧录器/外部串口链路
  • 初始化:Serial0.begin(115200, SERIAL_8N1, 44, 43);
  • USB CDC 枚举较慢,Python 读串口前需 time.sleep(3)

无线烧录配置

无线 DAP-Link 缺少 DTR/RTS 信号,需手动进入下载模式:
烧录步骤:按住 BOOT → 按一下 EN → 继续按住 BOOT → 执行 pio run -t upload → 看到 Connecting... 后松手。

项目一:HXC_A_C620 — 单 C620 调试模板

用途

单 C620 电调起转、电流环/速度环调试、电机 ID 排查、CAN 接线排错。

CAN 约定

控制本质:通过 CAN 发电流给定。“速度模式”是 ESP32 侧基于反馈转速做的软件外环。

串口命令

安全特性

  • 上电先用 listen-only 模式只听总线,不先乱发控制帧
  • 支持主动发送”零电流扫描帧”找电机 ID

适合使用场景

  • 需要调试单台 C620 电机的参数和响应
  • 排查 CAN 总线接线问题
  • 确认电机 ID 和方向

项目二:HCX_A_N630 — N630/VESC 位控开发

用途

基于 VESC 协议的 N630 电调位置控制开发。主控做位置环,N630 只做电流执行器。

控制架构

⚠️ 主控初版只发 CAN_PACKET_SET_CURRENT不发 CAN_PACKET_SET_RPM / CAN_PACKET_SET_POS

VESC CAN 协议

使用扩展帧: 反馈帧:

N630 侧 VESC 上位机必须确认

Motor Settings → FOC:
  • Sensor Mode = Encoder(不要停在 HFI)
  • Sensor Port Mode = Sin/Cos
  • Encoder Detection 已成功
  • Motor Configuration 已写入,点 ↓M
App Settings → General:
  • CAN Status Rate 1 = 50Hz,勾选 Status 1 + Status 4
  • CAN Status Rate 2 = 5Hz,勾选 Status 5
  • App Configuration 已写入,点 ↓A

已知硬件参数

串口命令

位置反馈和多圈展开

Status 4 的 pid_pos 解析为单圈角度:
主控通过相邻两次单圈角度的跨越判断圈数:

控制算法(PID + 轨迹规划)

当前已调优的参数

安全限制(首次调试)

推荐试车顺序

状态回显格式

适合使用场景

  • N630/VESC 电调的位置控制开发
  • 需要多圈角度控制和轨迹规划的场合
  • 夹爪/执行器类精准位置控制

项目三:AM32 — DSHOT 驱动开发 & BoardA 模块库

用途

用 ESP32-S3 通过 DSHOT300 数字协议驱动 AM32 电调(FLYROUN, NXN 18M09),作为 C620 的应急替代方案。同时包含 HXC 战队 BoardA 板的所有模块化库。

DSHOT300 协议

时序参数(RMT 外设生成)

数据帧格式(16bit,MSB 先发)

油门值定义

DSHOT_ESC 驱动 API

AM32Motor 状态机封装

方向切换非阻塞状态机(在 update() 内驱动):

四轮小车控制(已验证)

硬件映射

运动逻辑

串口命令

遥控集成(HotRC RC)

  • CH1 → GPIO48(左右转向)
  • CH3 → GPIO38(前后油门)
  • 1000~2000us 脉宽,50Hz
  • 60us 死区消除中位抖动
  • 100ms 超时自动停车(失控保护)
  • toNormalized() → -1.0~+1.0

混控公式

缓冲模式(加速度限制)

遥控 + 串口全部适用,任何突发指令都会被平滑。

适合使用场景

  • 用 AM32 电调替代 C620 驱动 M3508 类电机
  • 需要 DSHOT 数字协议的高精度/抗干扰场景
  • 四轮底盘调试(开环验证)
  • 遥控 + 串口双模控制
  • 需要加速度缓冲保护的小车

BoardA 模块库索引


开发规则

GPIO 不变规则

⚠️ 以下引脚已经过硬件验证,不要随手更改:

C620 规则

  • 上电先 listen-only 模式监听总线
  • 控制帧用标准 11-bit ID
  • 反馈 ID = 0x200 + motor_id
  • 速度模式是 ESP32 侧软件外环

N630 规则

  • 调试前先接 VESC 上位机确认当前 CAN 波特率
  • 主控只发 CAN_PACKET_SET_CURRENT
  • 不发 CAN_PACKET_SET_RPM / CAN_PACKET_SET_POS
  • 使用扩展帧 EID = (packet_id << 8) | controller_id
  • 位置反馈需要从 Status 4 的 pid_pos 做多圈展开
  • 位置反馈方向必须和电流正方向一致(否则可能跑飞)

AM32 / DSHOT 规则

  • Flash 配置必须匹配硬件(N16R8 配 16MB)
  • Arduino-ESP32 v3.x 基于 IDF 4.x,用旧版 RMT API(driver/rmt.h
  • 方向指令需要连续发送 ≥10 次才生效
  • 切换方向前必须停电机
  • 四轮底盘注意左右两侧电机镜像安装方向相反

安全规则

  • 第一次调试 N630 时,current_cmd 限幅 ±0.5A 起步
  • 上电默认不输出,先 arm 再控制
  • 串口活动 watchdog 超时后自动停机
  • C620 位置模式超时时进入低电流保持
  • 带载测试前先 r 10 / r 30 确认方向和制动
  • 如果出现反向跑飞,立即 s 停止

三项目选型对照