项目

一般

简介

行为

任务支持 #2636

已关闭

调研并实验开环步进电机的FOC控制

由 曹晏彬 在 大约 2 个月 之前添加. 更新于 大约一个月 之前.

状态:
已完成
优先级:
C级
指派给:
开始日期:
2026-09-14
计划完成日期:
% 完成:

100%

预期时间:


文件

main.cpp (3.67 KB) main.cpp 孙乃宇, 2026-09-24 18:13
platformio.ini (291 Bytes) platformio.ini 孙乃宇, 2026-09-24 18:14
firmware.elf (117 KB) firmware.elf 孙乃宇, 2026-09-24 18:15
LO-FOC-2804-2.json (31 KB) LO-FOC-2804-2.json 孙乃宇, 2026-09-24 18:20

由 孙乃宇 更新于 大约一个月 之前

  • 状态 从 新建 变更为 进行中

由 孙乃宇 更新于 大约一个月 之前

A4950 + NEMA42 步进 · Nucleo-G474RE 设备整合记录

整理日期:2026-09-24
硬件:NUCLEO-G474RE + A4950 双路 H 桥 + 信浓 42 步进(双极 4 线)
上位机:Industrial_ui(LO-FOC-2804-2 + gimbaldll)


1. 最终结论

项 结论
固件 SimpleFOC 开环步进 + Commander,兼容 gimbal(C1/C2→openloop)
串口 ST-LINK VCP (USART2 PA2/PA3) → COM14 @ 115200,行尾 \n
位置模式 绝对位置(度→rad);目标相同则不转,属正常
Industrial_ui 可用;SPOpen=com14-gimbal,COM14 独占
不要用 无刷 FOC、整步 f/r/s 旧协议(已替换)

2. 硬件接线

2.1 A4950 ↔ Nucleo

A4950 Nucleo-G474RE
VCC 3V3
GND GND(与电机电源共地)
AIN1 D5
AIN2 D6
BIN1 D9
BIN2 D10
VM 外部电机电源+(常用 12V,勿接 3V3)
电源负 与 GND 相连

2.2 电机 4 线

电机 A4950
A 相两根 AOUT1 / AOUT2
B 相两根 BOUT1 / BOUT2

同相可对调(只影响转向)。

2.3 串口

  • 固件走 板载 ST-LINK VCP(USART2 PA2/PA3)
  • PC 上一般为 USB 串行设备 (COMxx),本机 COM14
  • 不要再映射到 UART4 PC10/PC11(除非另接 CH340)

3. 固件

3.1 路径

用途 路径
编译烧录(推荐) D:\pio_a4950_nema42\
同步源码 ...\9-22\SimpleFOC_MS8313\src\main.cpp

关键文件:

  • src\main.cpp — 固件逻辑
  • platformio.ini — nucleo_g474re + SimpleFOC@2.2.3 + stlink
  • .pio\build\nucleo_g474re\firmware.elf — 烧录产物

3.2 技术要点

  1. StepperMotor(200) 开环,不是 BLDC FOC
  2. StepperDriver4PWM(5,6,9,10) → A4950
  3. Commander:AE1 / A2 / AC2 / AMG6…
  4. 兼容 gimbaldll:C1→velocity_openloop,C2→angle_openloop
  5. 速度斜坡只在速度模式生效,不覆盖角度目标
  6. 默认 VOLTAGE_LIMIT=4.5V(可调)
  7. 库补丁:StepDirListener.h 去掉 #define PinStatus int

3.3 编译与烧录

# 建议纯英文路径,避免中文路径链接失败
pio run -d D:\pio_a4950_nema42 -e nucleo_g474re -t upload

成功标志:

** Programming Finished **
** Verified OK **
** Resetting Target **
[SUCCESS]

3.4 手工验证

cd D:\Users\Administrator\Desktop\work\配置文件\9-22\SimpleFOC_MS8313
python python\motor_control.py COM14
# AE1 → A2 应连续转动

python python\test_gimbal_pos.py COM14 90 30
# 复刻 gimbaldll:AE1 / AC2 / A<rad> <rad_s> / AMG6

4. Industrial_ui / gimbaldll

4.1 调用链

UI JSON SingleToPosition
  → WebSocket ws://localhost:33654
  → SPOpen "com14-gimbal" 加载 gimbaldll
  → PositionMove: AE1 → AC2 → A<rad> [<rad_s>]
  → 固件 angle_openloop

4.2 DLL 位置

项 路径
运行时 D:\workspace\Industrial_ui\device\gimbaldll.dll
源码 D:\Users\Administrator\Desktop\work\配置文件\9-24\

JiaheGetDllName() = gimbal,与 SPOpen 后缀一致。

4.3 串口协议(DLL 实际发出)

动作 命令(行尾 \n)
打开 AE1、BE1
速度 %cE1 → %cC1 → %c<rad/s>
位置(绝对) %cE1 → %cC2 → %c<rad> 或 %c<rad> <rad_s>
停止 %cC1 → %c0
读位置 AMG6/BMG6 → angle:
读速度 AMG5/BMG5 → vel:

换算(DLL 内完成):Distance 度→rad;Speed 度/s→rad/s;X→A,Y→B。

示例(90° / 30°/s):

AE1
AC2
A1.570796 0.523599

4.4 JSON(exec)

{
  "type": 0,
  "name": "exec",
  "value": {
    "actions": [{
      "normal_data": {
        "serialport": "com14",
        "name": "SingleToPosition",
        "data": [
          { "name": "Axis", "val": "X" },
          { "name": "Distance", "val": "90" },
          { "name": "Speed", "val": "30" }
        ]
      },
      "device": { "model": "LO-FOC-2804-2", "port": "com14" }
    }]
  }
}

配置:Industrial_ui\src\json\LO-FOC-2804-2.json

  • SPOpen: "-gimbal" → 前端拼成 com14-gimbal
  • SPQuery: "gimbal"

4.5 打开设备

  1. 先 SPRefrensh,再 SPOpen
  2. 格式:com14-gimbal
  3. 平台 WebSocket 进程需后台常驻

5. 位置运动:点了几次没反应

SingleToPosition = 绝对位置,不是相对位移。

情况 结果
已在 90°,再发 Distance=90 目标未变 → 不转(正常)
0° 发 90,再发 90 第二次不转(正常)
要再转 改为 180、-90 等新绝对角,或用速度指令

开环注意:

  • AMG6 的 angle 是软件虚拟角,监控在变 ≠ 轴一定在转
  • AE1 后手摸应有锁力;motor_control.py 的 A2 能转则供电/接线基本正常

6. 联调检查清单

  • VM=12V 已接,与 Nucleo 共地
  • 电机 A/B 相 → AOUT/BOUT
  • 固件横幅含 open-loop + gimbal Commander
  • COM14 未被 python/monitor 占用
  • UI:SPRefrensh → SPOpen=com14-gimbal
  • test_gimbal_pos.py COM14 90 30 能转
  • UI 改不同绝对角(90→180)再点位置运动

7. 常见问题

现象 处理
COM 打不开 查设备管理器实际口号
访问被拒绝 关占用 COM14 的程序
Warn: \r detected 行尾改为 \n
监控在动、轴不动 查 VM / 限压 / 接线(开环虚拟角)
第二次位置无动作 绝对目标相同;换新角度
bad rate 旧整步固件;应已是 SimpleFOC
中文路径链接失败 用 D:\pio_a4950_nema42 编译
PinStatus 编译错 库 StepDirListener.h 去掉 #define PinStatus int

8. 文件索引

# 固件
D:\pio_a4950_nema42\src\main.cpp
D:\pio_a4950_nema42\platformio.ini
...\SimpleFOC_MS8313\src\main.cpp
...\SimpleFOC_MS8313\python\motor_control.py
...\SimpleFOC_MS8313\python\test_gimbal_pos.py

# 上位机
D:\workspace\Industrial_ui\src\json\LO-FOC-2804-2.json
D:\workspace\Industrial_ui\device\gimbaldll.dll
D:\Users\Administrator\Desktop\work\配置文件\9-24\   # gimbaldll 源码

9. 演进时间线

  1. 双轴无刷 FOC(AS5600)→ 与 42 步进不匹配
  2. A4950 整步 f/r/s → 能转,与 UI 协议不通
  3. 串口 UART4 → VCP USART2 → COM14 可通信
  4. SimpleFOC Stepper + Commander → motor_control.py 可控
  5. velocity_openloop + 限压/斜坡 → 高速丢步改善
  6. C1/C2→openloop + 角度不走速度斜坡 → Industrial_ui 位置运动可用
行为

导出 Atom PDF