旧平衡车刷 FOC 固件:完整刷机与调参指南
【免费下载链接】hoverboard-firmware-hack-FOCWith Field Oriented Control (FOC)项目地址: https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC
车库角落那台吃灰的平衡车,上次启动大概是它出厂那天——老式六步换向控制带来的电机尖啸和顿挫,让它很难再被翻出来骑。hoverboard-firmware-hack-FOC 这套开源固件把工业级的 FOC(Field Oriented Control,场定向控制:实时估算转子位置,让三相电流始终以最有效角度馈入电机)搬进了平衡车主板,刷上之后噪音和振动明显收敛,电流利用率更高,还能用场削弱功能突破原厂的速度上限。
项目速览:这套固件是什么来头
| 项目 | 内容 | | -- | -- | | 项目名 | hoverboard-firmware-hack-FOC(GPL v3 协议) | | 主芯片 | STM32F103RCT6 / GD32F103RCT6 | | 控制算法 | FOC 场定向控制(兼容正弦波、传统换向三种控制类型) | | 输入方式 | 串口协议、ADC 电位器、Wii Nunchuk、PPM / PWM / iBUS 遥控,共 10 种变体 | | 默认保护 | 单电机 15A 电流上限、1000 rpm 转速上限、多级低压关机 |
一句话概括:它不挑硬件,兼容市面上最常见的平衡车主板,刷进去后既能让电机安静下来,也给你留足了往卡丁车、滑板、机器人平台上改的空间。
硬件摸底:三步确认你的主板能不能刷
第一步,确认主板形态。这套固件面向"主板 + 两块侧板"的传统结构(侧板带轮子和陀螺仪),拆掉踏板和贴纸后,主板应通过两根 4-pin 排线连左右侧板;如果你的车是主板一分为二的 splitboard 新款结构,这套代码不适用,需要对应的二代固件方案。
第二步,看主芯片丝印。多数主板大脑是 STM32F103RCT6,部分型号用的是国产 GD32F103RCT6——两者都支持,拆开主板上盖看一眼芯片上的字就能确认。仓库docs/literature/里附了两颗芯片的数据手册和逆向出的主板原理图(20150722_hoverboard_sch.pdf),不确定时对着查。
第三步,确认烧录与调试条件:
- 主板需有 SWD 接口,可接 ST-Link 编程器烧录(芯片 Flash 为 32K 字节)
- 两根侧板排线引出 GND、12/15V 以及 USART2 / USART3 两路串口
- 注意引脚耐受电压:右侧板线(USART3)耐 5V,可兼作 I2C;左侧板线(USART2)不耐 5V,只能接 3.3V 电平,还能当 12bit ADC 用
刷机落地:五步走
- 准备工具:ST-Link V2 编程器、3.3V 的 USB 转串口模块(调试用)、会看芯片丝印的耐心。
- 克隆代码:
git clone https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC,仓库内自带 PlatformIO 工程和 Keil MDK 工程(MDK-ARM/)两种构建路径。 - 选变体:打开
platformio.ini,把你要的变体那行去掉分号(build_flags会自动注入宏,无需手改Inc/config.h):
;default_envs = VARIANT_ADC ; Variant for control via ADC input ;default_envs = VARIANT_USART ; Variant for Serial control via USART3 input ;default_envs = VARIANT_NUNCHUK ; Variant for Nunchuk controlled vehicle build ;default_envs = VARIANT_HOVERCAR ; Variant for HOVERCAR build- 编译并烧录(以 USART 变体为例,
upload_protocol已配置为 stlink,接线后即可直写):
pio run -e VARIANT_USART pio run -e VARIANT_USART --target upload- 首次上电标定:以 ADC 变体为例,长按电源键听到蜂鸣后松开,把两个电位器在最小/最大之间反复打到头,松开等蜂鸣确认,极值会被自动存进 Flash;想清掉标定值就做一次全片擦除再刷。
新板第一次用 ST-Link 连接时常遇到"Can not read memory"提示——这是芯片出厂读保护,按仓库 Wiki 的解锁流程(连接 → 读保护解除 → 全片擦除 → 重连)处理一遍即可,docs/pictures/wiki_unlock/里有逐步截图。
核心能力:FOC 控制与三种工作模式
换传统六步换向相比,FOC 带来的变化是可感知的:加速时电机不再"咔咔"跳着走,尖啸声基本消失,同样的电压下出力更顺、能耗更低。控制类型在Inc/config.h里用CTRL_TYP_SEL三选一(换向 / 正弦波 / FOC,默认就是 FOC)。
FOC 之下还有三种工作模式,由CTRL_MOD_REQ指定:
- 电压模式(VLT_MODE):给定多少电压就给多少响应,反应最快,适合机器人底盘这类需要即时响应的场合
- 速度模式(SPD_MODE):闭环追踪目标转速(rpm),负载拖拽时也能稳住转速
- 扭矩模式(TRQ_MODE):追踪扭矩目标,目标为 0 时电机自由滑行;坐着驾驶的应用(踏板车、轮椅类)最推荐,也可启用
ELECTRIC_BRAKE_ENABLE把滑行换成恒力电子刹车
// Control selections #define CTRL_TYP_SEL FOC_CTRL // 控制类型: COM_CTRL, SIN_CTRL, FOC_CTRL(默认) #define CTRL_MOD_REQ VLT_MODE // 工作模式: OPEN_MODE, VLT_MODE(默认), SPD_MODE, TRQ_MODE场削弱怎么开:电机高速时反电势逼近母线电压,转速就被"顶"住了。场削弱通过注入 D 轴电流削弱气隙磁场,给速度留出余量。它在FIELD_WEAK_LO(默认 750)到FIELD_WEAK_HI(默认 1000)之间线性从 0 插值到FIELD_WEAK_MAX(默认 5A,注释写明用 10 寸轮实测过 10A 以内),默认是关闭的(FIELD_WEAK_ENA 0),改成 1 即启用。
变体应用:同一块主板改出十种车
仓库内置 10 个编译变体,选一个即可覆盖大多数玩法:
VARIANT_HOVERCAR:油门 + 刹车双踏板,停车状态下双击刹车进入倒车;还支持MULTI_MODE_DRIVE,开机时用踏板组合选新手 / 进阶 / 高手三档,新手档电流限到 4A、转速限到 30 rpmVARIANT_SKATEBOARD:PWM 遥控控速的电动滑板,默认扭矩模式,松开摇杆即滑行VARIANT_NUNCHUK:Wii Nunchuk 单手控制油门、刹车、转向,适合电动轮椅或搬运小车VARIANT_ADC/VARIANT_USART:电位器或串口协议控制,后者可用 Arduino 发指令(仓库Arduino/hoverserial/自带示例工程)VARIANT_PPM/VARIANT_PWM/VARIANT_IBUS:三种常见遥控信号格式VARIANT_TRANSPOTTER/VARIANT_HOVERBOARD:运输车构建与平衡车本体;注意 HOVERBOARD 变体的平衡控制算法在Inc/config.h里标注为 TODO,尚未实现
具体构建细节以仓库README.md的 Example Variants 一节为准。
安全边界:调参前必读
这一节请认真看。📌
- 电流:
I_MOT_MAX单电机上限 15A,I_DC_MAX母线上限 17A(注释要求I_DC_MAX = I_MOT_MAX + 2A,超出后触发斩波保护)。想榨出力就先确认 MOS 管和电池放电能力 - 转速:
N_MOT_MAX默认 1000 rpm 封顶;一旦开场削弱,电机可能转得"非常快"(作者原话),功耗骤升可能触发 BMS 过压保护——首次试跑务必留足空旷场地 - 输入超时:连续 20 次错误/缺失指令(
TIMEOUT)直接紧急断电,遥控失联不会失控狂奔 - 电池:10 串分级——3.9V/cell 绿灯 → 3.8V 黄灯 → 3.7V 黄闪 → 3.6V 红灯轻鸣 → 3.5V 红闪急促鸣叫,3.37V/cell 自动关机
- 温度:测温点在芯片内部,不校准的话误差可达 ±45°C,所以 60°C 报警和 65°C 断电默认都是关的——按
Inc/config.h注释先用热像仪完成两点校准再启用 - 调试红线:接 USB 转串口只碰 GND 和 RX/TX,排线里那根红线是 15V,接错直接烧模块 ⚠️
进阶调参:从默认值到合脚
- 电机本体参数(电感、电阻、极对数等)集中在
Src/BLDC_controller_data.c,采用定点数存储换取执行效率;仓库已附带校准好的控制器,细调时建议配合 README 提到的 Fixed-Point Viewer 工具换算 - 响应手感由
RATE(默认 480,越小越慢)和FILTER(默认 6553,即 0.1,越小越软)控制;速度 / 转向增益分别是SPEED_COEFFICIENT、STEER_COEFFICIENT - 开
DEBUG_SERIAL_USART3后用 115200 波特率读串口,能看到in1/in2(原始输入)、cmdL/cmdR(输出指令,±1000)、电池与温度读数 - 电池电压先校准:用万用表实测母线电压写入
BAT_CALIB_REAL_VOLTAGE,再记下串口输出的 ADC 值写入BAT_CALIB_ADC;温度校准同理,先低温点后高温点
行动清单:现在就可以做的五件事
- 拆下踏板和贴纸,确认主板是"主板 + 双侧板"结构、芯片丝印为 STM32F103RCT6 或 GD32F103RCT6,顺手拍下 SWD 接口位置
- 克隆仓库,在
platformio.ini里选定变体(第一次建议VARIANT_ADC,两个电位器就能玩),pio run编译通过 - ST-Link 连主板烧录;若遇读保护,按
docs/pictures/wiki_unlock/的截图流程解锁后再上传 - 上电跑一遍自动标定,开串口调试口核对
cmdL/cmdR是否跟随输入;确认无误后再动I_MOT_MAX、N_MOT_MAX这些保护值,小步加量 - 遇到问题先翻仓库 Wiki 的 Getting Started 与 Troubleshooting 页面,社区讨论集中在
README.md提到的 Matrix 群组(历史 Telegram 消息已整体迁移过去);想要更省事的构建,README 里还列了在线编译器等扩展资源
【免费下载链接】hoverboard-firmware-hack-FOCWith Field Oriented Control (FOC)项目地址: https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考