平衡车主板 FOC 固件改造完整指南:解锁、刷写、调参一次搞定
【免费下载链接】hoverboard-firmware-hack-FOCWith Field Oriented Control (FOC)项目地址: https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC
起步一冲一冲、电机嗡嗡响?换一套 FOC 固件试试
如果你的平衡车起步顿挫、低速有嗡嗡声、爬坡没劲、松手后还滑老远,多半不是硬件坏了,而是原厂固件只用了最基础的换相控制(Commutation)来驱动电机——电流波形粗糙,噪声、发热和抖动自然偏高。hoverboard-firmware-hack-FOC 把磁场定向控制(Field Oriented Control,FOC)塞进了普通平衡车主板的 STM32 芯片里:电机电流被拆成"产磁力"和"产扭矩"两个分量分别闭环控制,相当于给电机装了一个精确的油门。改造之后,电机更安静、扭矩更平滑、耗电更低,还能通过弱磁控制(Field Weakening)把极速再往上顶一截。
下面用五步带你走完整个流程,全程只需要一块 ST-Link 和一颗平衡车主板。
项目速览:这套固件是什么、适合谁
先给结论:它不是替换你的主板,而是替换主板里的程序。硬件还是原来那块 STM32F103RCT6(部分车是 GD32F103RCT6,同样支持),变的是控制算法和输入方式。
| 项目 | 说明 |
|---|---|
| 是什么 | 运行在平衡车主板上的开源 FOC 无刷电机控制固件 |
| 解决什么 | 换相控制的顿挫、噪声、效率低问题;顺带解锁串口/电位器/遥控等多种输入方式 |
| 控制方式 | 换相(Commutation)、正弦(Sinusoidal)、FOC 三选一,FOC 下再分电压 / 转速 / 扭矩三种模式 |
| 适合谁 | 想改造平衡车做代步小车、电动轮椅、卡丁车、机器人平台的 DIY 玩家 |
| 控制算法源码 | 集中在 Src/BLDC_controller.c,电机参数在 Src/BLDC_controller_data.c |
三种控制方式的直观对比(摘自 README.md):
| 控制方式 | 效率 | 平顺度 | 弱磁提速 | 一句话点评 |
|---|---|---|---|---|
| 换相(Commutation) | 一般 | 一般 | 不支持 | 原厂默认,够用但粗糙 |
| 正弦(Sinusoidal) | 较好 | 较好 | 可用相位超前替代 | 平滑升级的第一步 |
| FOC | 优秀 | 优秀 | 支持(注入反向磁场分量) | 本次改造的目标 |
FOC 下还有三种细分模式,决定"你给它的指令是什么":
- 电压模式(VLT_MODE):给电机恒定电压,响应快,适合机器人项目;
- 转速模式(SPD_MODE):闭环锁转速,抗扰动,适合恒定速度巡航;
- 扭矩模式(TRQ_MODE):给扭矩指令,松手时电机"滑行",人坐在车上代步最舒服。
动手前准备:工具与前置清单
开始前把下面这份清单备齐,避免刷到一半才发现缺东西:
| 类别 | 需要准备的 | 用途 |
|---|---|---|
| 硬件 | 平衡车主板(STM32F103RCT6 / GD32F103RCT6) | 刷写目标 |
| 硬件 | ST-Link V2 下载器 | 与主板通信、写入 Flash |
| 硬件 | USB 转 TTL 模块(3.3V 电平)+ 串口工具 | 可选,用于调试输出 |
| 软件 | STM32 ST-Link Utility(或 Keil 自带) | 解除读保护、擦除、烧录 |
| 软件 | PlatformIO(VS Code 插件)或 Keil uVision | 自行编译固件 |
| 环境 | 电脑账户 / 仓库访问权限 | 获取源码与构建产物 |
克隆源码(后续编译、查配置都会用到):
git clone https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC接线前先记住一件事:传感器线缆里的红色线是 15V 电源,串口子模块、USB 转 TTL 接进去都会烧。调试只接 GND 和 TX/RX,电源用模块自带的 3.3V。
核心流程:四步把 FOC 固件跑起来
第 1 步:接对线——认准 SWD 口和两根传感器线
刷写只走 SWD 口,对照主板引脚图确认位置:
| ST-Link 引脚 | 主板对应 |
|---|---|
| SWDIO | PA14 |
| SWCLK | PA13 |
| GND | GND |
| 3.3V | 3.3V(可选,多数情况不需要) |
主板还引出两根 4 针传感器线(左线 USART2、右线 USART3),内含 GND 和 12/15V。未来接遥控器、串口、电位器都靠它们。
这一步的判断标准:对照引脚图能准确指出 SWDIO、SWCLK、GND 三个焊点,并且能分清哪根是红(15V)线。
第 2 步:写入固件——解除读保护,三步进 Flash
原厂芯片普遍开了读保护(Read Out Protection),不解除的话 ST-Link Utility 会直接报 "Can not read memory",这是新手最高频的卡点:
按顺序做三件事:
- 解除保护:
Target → Option Bytes...,把 Read Out Protection 改为 Level 0,Apply 并等待芯片复位; - 整片擦除:
Target → Erase Chip,把原厂程序彻底清掉; - 写入固件:
Program & Verify,选择编译好的.bin文件,起始地址保持0x08000000,直到看到 Verification OK。
固件从哪来?两条路任选其一:
到项目的 Actions 构建页面直接下载现成的构建产物(打包好的固件文件):
或者本地自行编译:在 platformio.ini 里取消对应变体的
default_envs注释后执行pio run,或用 Keil 打开 MDK-ARM/ 下的工程(默认按 STM32F103xE 配置)。
这一步的判断标准:ST-Link Utility 日志从 "Can not read memory" 变为连接成功、擦除成功、校验通过(Verification OK)。
第 3 步:配置输入——告诉固件"你怎么开这辆车"
固件支持 10 种输入变体,选择方式是在 platformio.ini 中启用对应env(或在 Keil 的 Target 下拉菜单里切换),只选一个:
| 变体 | 输入方式 | 典型玩法 |
|---|---|---|
| VARIANT_ADC | 两个电位器 | 自制遥控、电动小车 |
| VARIANT_USART | 串口协议 | 用 Arduino / 单片机远程下发指令 |
| VARIANT_NUNCHUK | Wii 震动棒 | 电动轮椅、搬运车单手操控 |
| VARIANT_PPM / PWM / IBUS | RC 遥控器 | 遥控滑板、卡丁车 |
| VARIANT_HOVERCAR | 刹车 + 油门踏板 | 踏板卡丁车(双击刹车倒车) |
| VARIANT_SKATEBOARD | RC 遥控(PWM) | 遥控电动滑板 |
| VARIANT_HOVERBOARD | 保留侧板通信 | 原车结构(平衡控制仍在完善中) |
| VARIANT_TRANSPOTTER | 方向盘 / 手柄 | TranspOtter 代步系统 |
选定变体后重新编译烧录。以 VARIANT_ADC 为例,把两个电位器接到左传感器线(只用 0~3.3V 和 GND),长按电源键 5 秒进入自动校准,来回转动电位器让固件记录上下限。
这一步的判断标准:通电后转动输入设备,两个电机随指令平滑加减速;方向反了就在 Inc/config.h 中打开INVERT_L_DIRECTION/INVERT_R_DIRECTION再刷一次。
第 4 步:调参——让电流与转速匹配你的场景
打开 Inc/config.h,重点盯住四个宏:
| 参数 | 默认值 | 作用 |
|---|---|---|
CTRL_TYP_SEL | FOC_CTRL | 控制方式:换相 / 正弦 / FOC |
CTRL_MOD_REQ | VLT_MODE | FOC 细分模式:电压 / 转速 / 扭矩 |
I_MOT_MAX | 15 A | 单电机最大电流,决定扭矩上限 |
N_MOT_MAX | 1000 rpm | 最大转速,超速保护的关键 |
选型建议:机器人平台用电压模式;恒定速度巡航用转速模式;人坐在上面代步用扭矩模式。改电流上限前先确认电机和电池铭牌上的承受能力,不要拍脑袋往大了调。
想要更高极速可以启用弱磁:把FIELD_WEAK_ENA置 1,并理解FIELD_WEAK_LO/FIELD_WEAK_HI/FIELD_WEAK_MAX三个阈值的关系——从 LO 开始线性介入,到 HI 达到最大注入量:
弱磁会让电机转得飞快,功耗随之大幅上升,甚至触发电池 BMS 的过压保护。请务必把车轮架起来测试,人不要靠近旋转面。
这一步的判断标准:满油门下电流不超过I_MOT_MAX、转速不超过N_MOT_MAX,电机无异响、主板不烫手。
验证·排错·进阶:确认结果对不对,再往深走
如何验证刷写成功
最快的方式是开调试串口:在 Inc/config.h 中启用DEBUG_SERIAL_USART2或DEBUG_SERIAL_USART3,用 3.3V USB 转 TTL 接对应传感器线(GND + RX),115200 波特率。终端会持续滚动一行数据:
in1:345 in2:1337 cmdL:0 cmdR:0 BatADC:0 BatV:0 TempADC:0 Temp:0转动输入设备时in1/in2变化、cmdL/cmdR跟随变化,说明输入链路通了;BatV应与你万用表测到的电池电压(×100)大致一致。
常见问题速查
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
| ST-Link 报 "Can not read memory" | 读保护没解除 | 回到第 2 步先解除 RDP 再擦除 |
| 电机抖动、尖叫 | 控制方式或参数不匹配电机 | 核对极对数与电流参数,参考 Src/BLDC_controller_data.c 校准 |
| 输入完全无响应 | 变体选错、接错左右线缆 | 对照所选变体确认指令走的是 USART2 还是 USART3 |
| 一开机就自动关机 | 电池电压校准值偏差 | 按 Inc/config.h 中 BATTERY 注释流程重新标定BAT_CALIB_ADC |
| 电机转反方向 | 相序或方向宏未设置 | 打开对应INVERT_*_DIRECTION重新烧录 |
安全底线
- 第一次通电测试务必架起车轮,确认转向和制动符合预期再落地;
- 串口线只碰 GND 和 TX/RX,永远别碰红线(15V);
- 调试串口与输入设备共用同一条线缆时会互相冲突,只能二选一,配置里也有对应互斥检查(编译期直接报错);
- 弱磁参数任何改动都放在台架环境进行。
进阶玩法
开启
CRUISE_CONTROL_SUPPORT,用一个按钮实现巡航定速,松手自动回到设定速度;扭矩模式下启用
ELECTRIC_BRAKE_ENABLE,松油门不再滑行而是缓刹停住;尝试 VARIANT_HOVERCAR:刹车 + 油门双踏板,"双击刹车倒车",做一台真正的卡丁车:
想接入 Arduino、ROS 等平台,直接参考 Arduino/hoverserial/ 里的串口控制示例;
想弄懂原理,从 Src/BLDC_controller.c 读起,配合 docs/literature/ 里备好的 STM32 数据手册与电机控制资料,再拆一台电机看看绕组长什么样:
从"能转"到"懂原理",这一步改造的成本不高,回报却是一台安静、顺滑、可控性拉满的电动平台——准备好 ST-Link,今天就动手吧。
【免费下载链接】hoverboard-firmware-hack-FOCWith Field Oriented Control (FOC)项目地址: https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考