行为
任务支持 #2636
已关闭调研并实验开环步进电机的FOC控制
开始日期:
2026-09-14
计划完成日期:
% 完成:
100%
预期时间:
描述
同样是STM32+FOC驱动板+电机的架构
板子链接
https://item.taobao.com/item.htm?id=704393564547&mi_id=0000OFbo5ES5ciGvh418pX89ZH97fgWglGaj7Rc4zUYI41w&spm=tbpc.boughtlist.suborder_itempic.d704393564547.2f9a2e8dBmf34a
驱动链接
https://item.taobao.com/item.htm?id=708991780292&mi_id=0000E-mS_JhWwSQ7VgFKu9oLA75tkdhx03ee7JQ7ajVxcN8&spm=tbpc.boughtlist.suborder_itempic.d708991780292.2f9a2e8dBmf34a
电机还用信浓42电机
驱动和板子都在路上,还没到
文件
由 孙乃宇 更新于 大约一个月 之前
- 文件 main.cpp main.cpp 已添加
- 文件 platformio.ini platformio.ini 已添加
- 文件 firmware.elf firmware.elf 已添加
- 文件 LO-FOC-2804-2.json LO-FOC-2804-2.json 已添加
- 状态 从 进行中 变更为 已完成
- % 完成 从 0 变更为 100
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 技术要点¶
-
StepperMotor(200)开环,不是 BLDC FOC -
StepperDriver4PWM(5,6,9,10)→ A4950 - Commander:
AE1/A2/AC2/AMG6… -
兼容 gimbaldll:
C1→velocity_openloop,C2→angle_openloop - 速度斜坡只在速度模式生效,不覆盖角度目标
- 默认
VOLTAGE_LIMIT=4.5V(可调) - 库补丁:
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 打开设备¶
- 先
SPRefrensh,再SPOpen - 格式:
com14-gimbal - 平台 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. 演进时间线¶
- 双轴无刷 FOC(AS5600)→ 与 42 步进不匹配
- A4950 整步
f/r/s→ 能转,与 UI 协议不通 - 串口 UART4 → VCP USART2 → COM14 可通信
- SimpleFOC Stepper + Commander →
motor_control.py可控 -
velocity_openloop+ 限压/斜坡 → 高速丢步改善 - C1/C2→openloop + 角度不走速度斜坡 → Industrial_ui 位置运动可用
行为