> ⚠️ 这是**学习/实验向**的电压模式 FOC:没有相电流采样,没有过流保护。
> 第一次上电请用限流电源,先不接电机看波形,再接电机。
需要 SDCC 4.x(作者用 4.5.0)。默认安装在 C:\Program Files\SDCC,
脚本会自动找;在 PATH 里也可以。
powershell -ExecutionPolicy Bypass -File .\build.ps1
输出 build\foc.hex,并打印 Flash 占用。
请自己在提供文件的P3.2和3.3飞线以连接编码器
串口协议
115200 8N1,命令以回车/换行结束,大小写都行。
| 命令 |
作用 |
P<角度> |
移动到机械角度,如 P90、P123.5、P-45(单位 °,限幅 ±360,按 360 取模) |
E1 / E0 |
使能 / 关闭功率桥 |
CAL 或 CAL |
自校正,pct 为校准电压百分比(5~100,默认 35) |
V<0..100> |
最大调制比(默认 40,越小电流越小) |
W<1..20> |
目标转速上限,单位计数/ms(默认 2 ≈ 176°/s) |
K,, |
位置环增益(默认 K128,20,13) |
D1 / D0 |
10 Hz 状态流 开 / 关 |
D2 |
100 Hz 状态流(诊断用) |
上电状态:串口打印 BOOT foc,读到编码器打印 RDY4;功率桥完全关闭,
电机不动作。第一次 P 命令会自动 E1(前提是已 CAL)。
状态行:
P=108.4 T=114.5 E=-6.1 SP=12 U=45 EN=1 CAL=1 SG=1
| 字段 | 含义 |
|---|---|
| `P` | 当前机械角(°) |
| `T` | 目标角(°) |
| `E` | 误差(°) |
| `SP` | 速度(°/s) |
| `U` | 当前 q 轴电压(±256) |
| `EN` | 使能 |
| `CAL` | 已校准 |
| `SG` | 方向 ±1 |
错误:`ERR CAL`(没校准)、`ERR ARG`、`ERR ENC`(编码器异常)、
`ERR MAG`(磁铁丢失)、`ERR SPD`(超速保护)。
---
## 8. 上位机 GUI
```powershell
py -m pip install --user pyserial
py foc_gui.py COM3
界面功能:
- 串口连接,自动
D1 开 10 Hz 数据流;
- 输入角度点“移动”、一键“保持当前位置”;
- 测试 0↔180:自动来回走,每次到位后静止 5 s;
到位判据 |E| ≤ 1° 连续 3 帧,单次移动 10 s 超时;
- CAL(可填校准电压百分比)、E1/E0、V/W/K 参数下发;
- 圆形角度表 + 最近 20 s 角度/目标曲线;
- 可勾选记录 CSV(
t,P,T,E,SP,U,EN,CAL,SG)。
固件接收缓冲一次只存一行,GUI 已经做了节流;自己写脚本时不要在
同一次发送里连发多条命令。
第一次上手步骤
- 不接电机电源,只接 MCU、AS5600 和 USB-TTL,烧录
foc.hex;
- 打开 GUI,手转电机轴,确认
P 平滑变化、CAL=0、没有 ERR ENC;
- 磁铁没装好会报
ERR MAG,先解决机械安装;
- 接上限流电源(建议 12 V / 0.5 A 起),发送
CAL35,
电机会“咯噔”两下,返回 CAL OK DIR=? OF=?;
CAL ERR MOVE:电机没跟上,加大 CAL60 或提高电源电压;
CAL ERR ENC:I2C 读不到,先查接线/上拉/3.3 V;
- 发
E1,然后 P10、P90 小步测试;
- 正常后再加
W、V、K 调动态响应。
调参建议(作者硬件上的经验):
| 现象 |
调整 |
| 保持时抖动/啸叫 |
kd 减小(1020)、ki 移位加大(1315)、V 降低 |
| 响应太慢 |
W 加大、kp 加大(如 160~200) |
| 到位前冲过头 |
kd 加大、W 减小、V 降低 |
| 堵转/手拧后积分回不来 |
ki 移位加大(积分更弱) |
| 低速一顿一顿 |
死区偏大或 PWM 频率偏低,可试 PWM_DTR=12~16 |
| 大角度走一半反向 |
极对数不对,先解决 POLE_PAIRS |
Flash 只剩 277 字节:加功能前先删代码(比如未用的
as5600_read_stable()),或者换 1K16/1K28。
附件:stc8h1k08_foc_20261113.zip
附件:Gerber_PCB2_2026-11-12.zip