3 步把旧平衡车改造成可编程双电机动力源:hoverboard-firmware-hack-FOC 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,磁场定向控制)移植到平衡车主板的开源固件:不更换电机、不加驱动板,就能让平衡车里的两个轮毂电机变成转速、扭矩、电压都可精确控制的动力源。对创客来说,它把一台"骑完就闲置"的代步工具,变成了可编程的双电机驱动平台。
一、原厂的换向控制差在哪,FOC 改了什么
平衡车原装固件用的是换向控制(Commutation),粗暴点说,像隔着一段时间"踹一脚"电机,每踹一脚都有相位误差。表现出来就是噪音偏大、电流有浪费、扭矩一顿一顿的。
FOC 的做法不同:先用三相电流反推出转子的实时位置,再在最省力的角度上施加电流。落到使用感受上,你能直接拿到四样东西:
- 更安静:恒速巡航时电机的高频"嘶嘶"声明显减弱,震动也小了
- 更省电:能量不再浪费在相位误差上,同样的电池跑得比原来远
- 扭矩可感知:TORQUE 模式下目标扭矩设 0 时,电机几乎无阻力自由滑行,像汽车松油后顺着下坡溜车
- 更高极速:磁场削弱(Field Weakening)能突破电机原有限速,细节见第六章
这一切都跑在主板原有的 STM32F103(也支持 GD32F103)芯片上,PWM 频率 16 kHz,不需要任何额外硬件。
二、上手前必选:三种控制模式怎么选
打开 Inc/config.h,先定这两个宏:
CTRL_TYP_SEL:选控制算法,默认FOC_CTRL,新手直接用它CTRL_MOD_REQ:选控制模式,三选一
| 模式 | 行为 | 适合场景 |
|---|---|---|
VLT_MODE电压 | 施加恒定电压,响应最快 | 机器人底盘、需要即时响应的机构 |
SPD_MODE速度 | 闭环控制,带载也稳住设定转速 | 传送带、测功台等恒速场景 |
TRQ_MODE扭矩 | 扭矩目标,0 扭矩 = 自由滑行 | 载人载具、需要自然手感的场景 |
别担心电机"跑飞":固件默认带最大电流保护(I_MOT_MAX默认 15 A)和最大转速保护(N_MOT_MAX默认 1000 rpm),FOC 三种模式下均生效。
三、硬件确认:主板上要看的 3 个点
烧录前先在主板上确认三件事:
- 芯片型号:STM32F103RCT6 或 GD32F103RCT6,两者都支持,其他型号请先核对
- 主板变体:
BOARD_VARIANT默认 0,部分主板引脚排布不同,需按实物改成 1 - 左右两根 4 针传感器线:引出 GND、12/15V 和 USART2/3,后面所有输入方式都从这里接入
一个必须知道的坑:左侧线(USART2)不耐 5V,直接接 Arduino Uno 这类 5V 逻辑设备会烧引脚;右侧线(USART3)是 5V 容忍的,外接单片机优先走右边。
轮毂电机本身是标准 BLDC,常见规格为 14 极、83 mm 轮径,内部结构长这样:
四、编译烧录 3 步:克隆、选变体、刷入
第 1 步:克隆仓库
git clone https://gitcode.com/gh_mirrors/ho/hoverboard-firmware-hack-FOC第 2 步:选变体并编译。固件内置 9 个变体,各对应一种输入方式,用环境变量指定:
make -e VARIANT=VARIANT_USART也可以用 PlatformIO,在 platformio.ini 里取消注释想用的 env 后执行pio run -e VARIANT_USART -t upload。常用变体:VARIANT_ADC(两个电位器当油门方向)、VARIANT_USART(串口协议,可用 Arduino 驱动)、VARIANT_PPM/VARIANT_PWM/VARIANT_IBUS(三种遥控器协议)、VARIANT_NUNCHUK(Wii 双节棍手柄)、VARIANT_HOVERCAR(刹车+油门踏板)。
第 3 步:刷入主板。主板上有一个 SWD 编程口(3.3V),接上 ST-Link 后执行:
make flash如果芯片被旧固件锁住了,先执行make unlock(内部用 OpenOCD 解锁)。这两条命令都封装在 Makefile 里,参数不用背。串口协议怎么写,可参考 Arduino/hoverserial/hoverserial.ino 这个示例草图——帧头 + 校验和 + 自动重同步,通信很稳。
五、参数调校:改什么去哪里改
不想深究的话这一步可以跳过,固件自带一套已校准好的电机参数,刷完就能用。
想调整时,两个文件分工明确:
- 控制器参数(电机本体相关的定点数据):Src/BLDC_controller_data.c
- 保护与限制(最大电流、最大转速、磁场削弱阈值):Inc/config.h
参数全是定点数,肉眼难读,作者提供了 Fixed-Point Viewer 工具和控制器 Webview 页面,不用装 Matlab/Simulink 也能看模型。如果你的电机之前在 VESC 驱动器上测过参数,可以按这种方式核对极对数、定子电阻等数值:
六、想跑更快:磁场削弱的收益与代价
平衡车电机一般限速在 1000 rpm 附近。FOC 的磁场削弱通过注入一路反向的 D 轴电流,相当于把定子和转子之间的"磁抓力"适度松开,不升电压也能转得更快——用 10 寸轮子实测,削弱电流最大开到 10 A 是可行的。
相关开关都在 Inc/config.h:
FIELD_WEAK_ENA设为 1 启用(默认 0,关闭状态)FIELD_WEAK_LO/FIELD_WEAK_HI决定从多快到多快之间线性 ramp 到最大削弱值
⚠️ 这是全项目最危险的功能:轮速远超设计值,离心力可能把轮子甩飞,功率骤增还可能触发电池 BMS 过压保护。测试时人不要坐上去,先把电机架在测试台上,从很小的FIELD_WEAK_MAX起步。
七、真实案例:别人拿它做了什么
最经典的玩法是Hovercar 卡丁车:给平衡车主板装上座椅和方向盘,用刹车/油门踏板控制,停车时双击刹车踏板还能进入倒车档:
其他有实物的路线包括:
- 电动轮椅驱动:SPD_MODE 的恒速闭环让轮椅起步、爬坡都平稳
- TranspOtter 搬运车:自动运货机器人,本项目专设了
VARIANT_TRANSPOTTER变体 - 遥控电动滑板:遥控器 PWM 信号接右传感器线,踩上就走
- 串口平台:Arduino 通过 USART 同时控制左右轮,还能回读实测转速、电池电压、主板温度,配合 ROS 驱动可搭完整机器人
八、谁适合用,谁不适合用
适合你,如果:
- 你手头有平衡车(哪怕只剩主板+两个电机),想做机器人、测功台或小车
- 你会用串口终端和 ST-Link,愿意读一个 config 文件
- 你需要电机的速度、扭矩反馈数据(串口协议自带反馈帧)
不适合你,如果:
- 你只想把平衡车当平衡车用、不改任何输入方式——
VARIANT_HOVERBOARD变体的自平衡控制目前尚未实现 - 你的车是 splitboard(左右各一块小板的方案),本固件不支持
- 你不愿意承担接线、刷机和 15V 高压系统带来的风险
安全清单:刷机前读完
- 主板供电 12-15V,XT60 接口在部分改装里甚至接 36-42V 再降压,操作前先断开电池
- 固件有 20 帧超时保护(
TIMEOUT = 20),输入异常时电机会进入安全状态,但它不能替代你戴护具 - 解锁被锁死的 MCU 若操作不当可能让芯片变砖,跑
make unlock前先确认接口线和电源 - 磁场削弱、最大电流、最大转速属于"自负"参数,从最小值开始调
你的下一步:从今晚开始
- 今晚:拆开机盖,确认主板芯片型号是 STM32F103 或 GD32F103,拍照留档
- 这个周末:克隆仓库,用 ST-Link 刷一版
VARIANT_USART固件,从串口终端发速度指令,确认左右两轮同步、安静地转起来 - 下周:按自己的用法(电位器、遥控器或踏板)选对应变体重新编译,把输入接上
当你看到轮子在指尖的指令下安静地加速、电流曲线平滑得像一条直线时,就知道这套固件值了。
【免费下载链接】hoverboard-firmware-hack-FOCWith Field Oriented Control (FOC)项目地址: https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考