把平衡车主板改成FOC磁场定向控制:从解锁到调参的完整指南
【免费下载链接】hoverboard-firmware-hack-FOCWith Field Oriented Control (FOC)项目地址: https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC
电机嗡嗡响、起步一冲一冲、松了油门还滑出去老远——这些现象的根源,是原厂固件只用最粗糙的换相控制(按顺序给三相线圈通电)驱动电机。hoverboard-firmware-hack-FOC 固件把磁场定向控制(Field Oriented Control,FOC,把电流拆成两个分量分别闭环)搬进普通平衡车主板,让电机转得更安静、扭矩更平滑,还能用弱磁控制把极速再往上顶一截。
原理速览:FOC 比原厂换相多做了什么
| 控制方式 | 工作原理 | 平顺度 | 你能得到什么 |
|---|---|---|---|
换相COM_CTRL | 按序给三相线圈通电 | 一般 | 原厂行为,振动与噪声大 |
正弦波SIN_CTRL | 注入正弦电流 | 较好 | 更平顺,但无矢量解耦 |
FOCFOC_CTRL | 磁通/扭矩分量各自闭环 | 优秀 | 平滑输出 + 弱磁提速 + 自由滑行 |
一句话理解:FOC 相当于给电机装了一只"电子油门","磁场多强"和"扭矩多大"各走一条闭环链路。固件里通过 Inc/config.h 的CTRL_TYP_SEL在这三种方式间切换,FOC 下再用CTRL_MOD_REQ细分电压、转速、扭矩三个模式。
动手前先拿到代码:
git clone https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC开工前确认:刷写前你要备齐的 5 样东西
- 主芯片型号:多数主板是 STM32F103RCT6,少数为 GD32F103RCT6,两者都受支持,但 Flash 容量不同会影响烧录地址
- ST-Link V2 加 4 根杜邦线:SWD 刷写的唯一通道
- USB 转 TTL 串口模块:串口调试与 USART 变体控制都要靠它
- PlatformIO 或 Keil MDK:仓库自带
platformio.ini与 MDK-ARM/ 两套工程 - 可安全通电的电机与电池:第一次上电必须架起车轮
阶段一:认出主板上的 SWD 刷写点和两条传感器线
完成标准:你能在板上指出 SWD 四个焊点的位置,并分清左右两条 4 针线各接什么。
SWD 接线对应:PA14(SWDIO)、PA13(SWCLK)、GND、3.3V(限 3.3V/10mA,可选供电)。两条侧板线各引出 GND、12/15V 以及 USART2(左线)或 USART3(右线),均可承载 UART、PWM、PPM、iBUS 输入,左线 USART2 还能当 12bit ADC 用,右线容忍 5V 电平、左线不能。
⚠️ 线束里的红导线是 15V 电源,接 USB-TTL 模块或任何 5V 逻辑设备前务必避开,否则会直接烧毁模块甚至主控。
引脚认对了,下一步刷写才能不烧板。
阶段二:解锁 MCU 读保护,烧入编译好的 .bin
完成标准:ST-Link Utility 里 Program & Verify 后出现 "Verification OK"。
原厂主板大多开启了读保护(芯片出厂锁),不解除的话 ST-Link 只报 "Can not read memory",拒绝任何写入:
操作分三步:在 STM32 ST-Link Utility 里Target → Option Bytes...,把 Read Out Protection 改为 Level 0 并 Apply(此步会自动全片擦除);再Target → Erase Chip清空原厂程序;最后Program & Verify,选编译产物.bin,起始地址保持0x08000000。
.bin从哪里来?两条路:直接从仓库 Actions 构建页下载现成产物,或本机编译:
pio run -e VARIANT_ADC # 指定变体编译,产物在 .pio/build/ 下MDK-ARM/工程默认按 STM32F103xE 配置,如果你的芯片容量不同,需核对链接地址是否一致。刷写完成后板子即可上电,但接下来要告诉它"你打算怎么开车"。
阶段三:选对输入变体与 FOC 控制模式
完成标准:编译烧录目标变体后,转动输入设备,电机平顺正转、无抖动。
固件内置 10 种变体(输入方式的编译模板),在 platformio.ini 里启用对应环境即可:
| 变体 | 输入方式 | 典型场景 |
|---|---|---|
VARIANT_ADC/VARIANT_USART | 电位器 / 串口指令 | 自制小车、Arduino 上位控制 |
VARIANT_NUNCHUK | Wii 手柄 | 电动轮椅、搬运车 |
VARIANT_PPM/PWM/IBUS | RC 遥控器 | 遥控滑板、卡丁车 |
VARIANT_HOVERCAR | 刹车/油门双踏板 | 踏板改造车 |
变体定了,再回 Inc/config.h 选控制模式:
VLT_MODE电压模式:恒定电压输出、响应最快,适合机器人和急停需求高的场景;SPD_MODE转速模式:闭环锁住目标 rpm,抗负载扰动,适合定速巡航;TRQ_MODE扭矩模式:以扭矩为目标,目标为 0 时电机自由滑行,人坐在车上代步首选,HOVERCAR / SKATEBOARD 变体也默认走这条路。
若电机转向反了,打开INVERT_L_DIRECTION/INVERT_R_DIRECTION修正即可。变体与模式都对之后,最后一步是给它定下安全边界。
阶段四:限流、限速,并决定要不要弱磁提速
完成标准:满油门无过流报警,电机噪声明显降低、扭矩线性。
Inc/config.h里三个参数最常用:
I_MOT_MAX:单电机最大电流(安培),默认 15A,直接决定扭矩上限,按电机与电池承受范围设,别盲目拉满;N_MOT_MAX:最大转速(rpm),默认 1000,是限速保护的最后一道防线;FIELD_WEAK_ENA:弱磁控制(注入反向磁场分量,用一点效率换更高转速上限),默认 0 关闭。
开启后,弱磁量在FIELD_WEAK_LO与FIELD_WEAK_HI之间从 0 线性升到FIELD_WEAK_MAX。电机参数集在 Src/BLDC_controller_data.c 里,用定点数表示,仓库已内置一套校准好的默认值,开箱即可用。
⚠️ 重新校准弱磁有风险:电机可能转得极快,功耗飙升并触发 BMS 过压保护,务必在架起车轮的安全环境里测试。
验证与调优:怎么判断 FOC 真的生效了
架起车轮通电后做三项检查:
- 缓慢加大输入:电机应无"咔咔"声地平滑升速,这是与换相控制最直观的区别;
- 打开
DEBUG_SERIAL_USART2或DEBUG_SERIAL_USART3(115200 波特率),终端里能实时看到输入值、指令值与电池电压;注意调试串口和输入设备在同一条线上互斥,只能二选一; - 松开输入:扭矩模式应自由滑行、电压/转速模式应减速,行为不符说明模式选错了。
三个常调参数的方向:I_MOT_MAX宁小勿大,多数原厂电机 10–15A 起步;N_MOT_MAX比目标极速至少留一成余量;弱磁区间先抬高FIELD_WEAK_HI再逐步下移FIELD_WEAK_LO,一次只动一格。另外若开机后异常自动关机,多半是电池电压标定偏差,按config.h中的 BAT 校准流程重新标定即可。
💡 变体、模式、串口输出都集中在
Inc/config.h,改动后必须重新编译烧录才会生效。
故障速查:刷写后的高频翻车点
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| ST-Link 报 "Can not read memory" | 读保护未解除 | Option Bytes 里先把 RDP 设为 Level 0,再擦除烧录 |
| 电机抖动或尖叫 | 控制方式或电机参数不匹配 | 确认 FOC 模式已启用,核对Src/BLDC_controller_data.c参数 |
| 输入无响应 | 变体选错或接错线缆 | 核对变体与输入设备,确认接的是左/右哪条传感器线 |
| 松油门不滑行 | 不在扭矩模式或没开电刹 | ELECTRIC_BRAKE_ENABLE仅在 TRQ_MODE 下生效,两者需配套 |
进阶入口:三个能改变驾驶手感的开关
- 巡航定速:在 Inc/config.h 打开
CRUISE_CONTROL_SUPPORT,用侧板按键或刹车踏板激活与退出; - 电制动:扭矩模式下启用
ELECTRIC_BRAKE_ENABLE,松油门自动缓刹,强度由ELECTRIC_BRAKE_MAX调节; - 串口上位控制:Arduino/hoverserial/hoverserial.ino 是现成示例,把它改一改就是接入 ROS 等平台的起点。
想彻底弄懂电流环与坐标变换为什么能让电机"转得丝滑",直接读 Src/BLDC_controller.c 的核心源码,配合 Src/BLDC_controller_data.c 的定点参数逐段对照——当你能解释清原理,你的下一台车就没有玄学了。
【免费下载链接】hoverboard-firmware-hack-FOCWith Field Oriented Control (FOC)项目地址: https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考