平衡车 FOC 固件入门:用 hoverboard-firmware-hack-FOC 重写电机控制
【免费下载链接】hoverboard-firmware-hack-FOCWith Field Oriented Control (FOC)项目地址: https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC
给平衡车换底盘做卡丁车、电动滑板或机器人底盘,原厂六步换向电机噪声大、振动明显,电流利用也不高。hoverboard-firmware-hack-FOC 这个开源项目把电机控制换成场定向控制(FOC),固件直接烧进平衡车主板,转向更顺、转速上限更高,还能接各种输入设备。
先判断:你的平衡车能不能刷
先确认硬件,不匹配就别往下读了。这份固件面向"主板 + 两条侧板"的传统平衡车结构:
- 主控芯片是STM32F103RCT6或GD32F103RCT6(两种都被支持)
- 主板带两条 4 针侧板排线,引出 GND、12/15V 和 USART2、USART3
- 不是分体主板(splitboard),那种要另用专门的固件
- 手上有 ST-Link,能从 SWD 口(PA13/PA14/GND/3.3V)烧录
主板引脚和线序在 docs/ 的引脚图里标得很清楚:
侧板排线是输入设备的主要接口,两点要记牢:右侧(USART3)排线耐 5V,左侧(USART2)排线不耐 5V,接错会烧口。两条排线都能跑 UART / PWM / PPM / iBUS,左侧还能当 12bit ADC 用,右侧能挂 I2C。
它到底改变了什么:FOC、三种模式与场削弱
先把 FOC 说清楚。原厂的六步换向(commutation)是按固定六步顺序切换三相电流,简单但粗糙:电流角度对不准转子,转矩有脉动,就表现为噪声和抖动。场定向控制(FOC, Field Oriented Control)把三相电流分解成两个互相垂直的分量——一个专管转矩(q 轴),一个管磁场(d 轴),分别闭环,让电机在任何转速都尽量用最小的电流做出最大的转矩。
平衡车电机拆开后能看到三相铜绕组和定子磁钢,FOC 就是围绕这套结构做精确控制:
在 FOC 之下,固件提供三种控制模式,都在 Inc/config.h 里用CTRL_MOD_REQ切换:
- 电压模式
VLT_MODE:恒定电压输出,响应最快,机器人或需要电机立刻跟手的场景 - 速度模式
SPD_MODE:闭环跟踪转速目标、抗负载扰动,适合恒速应用 - 扭矩模式
TRQ_MODE:闭环跟踪扭矩,目标为 0 时可自由滑行,载人驾驶首选
再往上是场削弱(field weakening)。电机转到接近最高转速时,反电动势(转速越高、反向电压越大)会顶住电源电压,再想加速就得让磁场"让路"——d 轴注入反向电流削弱磁场,就能往上再挤一段转速。它默认是关的,开启后按FIELD_WEAK_LO到FIELD_WEAK_HI之间线性过渡,到FIELD_WEAK_HI达到最大削弱:
这三层其实是一条线:FOC 提供电流分解的基础,控制模式决定"控制什么量",场削弱决定"转速上限能多高"。改其中一处,另外两处都会受影响,所以调参要连着看。
从克隆到烧录:最短可跑通路径
最短的一条路:克隆 → 选变体 → 编译 → ST-Link 烧录。
- 克隆仓库:
git clone https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC- 选变体。在 platformio.ini 的
default_envs里打开一行,比如电位器控制:
default_envs = VARIANT_ADC变体对应不同输入方式:VARIANT_ADC(电位器)、VARIANT_USART(串口)、VARIANT_NUNCHUK(Wii 手柄)、VARIANT_PPM/VARIANT_PWM/VARIANT_IBUS(遥控器)、VARIANT_HOVERCAR(踏板)等,细节配置在 Inc/config.h。
- 编译 + 烧录。用 PlatformIO 的话:
pio run -e VARIANT_ADC # 编译 pio run -t upload -e VARIANT_ADC # ST-Link 烧录仓库里也带了 Makefile 和 MDK-ARM/(Keil 工程),可以改用make或 Keil 编译,产物是一个可直接烧录的固件包:
首次烧录前通常要先解锁 MCU 出厂的"读保护",这个坑见下一节。
把它变成你要的样子:变体、用途与调参
选变体,就是选输入和玩法
变体(variant)本质是"一套预设的输入接线 + 控制参数"。同一块主板,只换变体就能变成完全不同的机器:
VARIANT_ADC:两个电位器接左侧排线,最基础的调试方式VARIANT_USART:用 Arduino 等经串口发命令,适合机器人,参考 Arduino/hoverserial/ 的示例草图VARIANT_NUNCHUK:Wii 手柄单手控油门、刹车、转向,常用于电动轮椅VARIANT_PPM/VARIANT_PWM/VARIANT_IBUS:遥控器(PPM 和脉宽信号、飞思卡尔 iBUS 协议)VARIANT_HOVERCAR:油门 + 刹车两个踏板,静止时双击刹车进入倒车VARIANT_SKATEBOARD:扭矩模式的电动滑板VARIANT_TRANSPOTTER:基于平衡车的载人运输车VARIANT_HOVERBOARD:读两块侧板数据,平衡控制算法目前尚未实现
选用途
改造成卡丁车是最常见的玩法,两个踏板加一个转向输入:
调电机参数
真正让车"手感对"的是电机参数,它们都放在 Src/BLDC_controller_data.c 里,用定点数(fixed-point)表示以省运算。仓库给了一份已校准的默认值,想微调再动它。
调参前最好先摸清电机本身(极对数、电阻、电感、反电动势)。如果手上有 VESC 控制器,可用它的"FOC 参数检测"自动量出来再填进去,比盲调省时间:
最常动的限幅参数在 Inc/config.h:
#define I_MOT_MAX 15 // [A] 单电机最大电流 #define N_MOT_MAX 1000 // [rpm] 最大转速从默认值起步,先跑通,再逐个小步调。
别踩的坑
保护机制都内置了,但几处参数动了就危险:
- 电流保护:单电机限流
I_MOT_MAX(默认 15A)、直流母线条限流I_DC_MAX(默认 17A),超限会做电流削波 - 转速限:
N_MOT_MAX(默认 1000 rpm),所有 FOC 模式都有效 - 电池电压分级:从绿灯正常到红灯急促报警,再到低压自动关机,阈值在 Inc/config.h 的
BAT_*里,按你的电池串数校准 - 温度保护:芯片内温传感器,
TEMP_WARNING/TEMP_POWEROFF要先校准再开,不校准不准 - 输入超时:连续 20 帧错误/丢失的输入命令会触发紧急关机(
TIMEOUT)
场削弱是最容易出事的地方:开了之后电机会转得很快,功耗大涨,可能直接触发电池 BMS 的过压保护。调它时一定做好防护,从小电流FIELD_WEAK_MAX往上调。
还有一个高频坑:出厂的 MCU 开了读保护(readout protection),第一次连 ST-Link 会报"Can not read memory! Disable Read Out Protection"。得先做一次全片擦除解锁,之后再正常烧录,docs/ 的 wiki 有专门的解锁页:
周边与延伸
这个项目的价值一半在固件本身,一半在周围攒起来的生态,多数不用装本地环境就能用:
- 网页串口控制:用浏览器直接遥控已刷固件的平衡车
- 在线编译器:浏览器里编译固件,省去本地工具链
- FOC 控制器设计:底层控制器以 Simulink 模型单独成库,还有个不依赖 Matlab 的 Webview,能直接观察控制器行为
- 定点数查看器 FixedPointViewer:看/改定点数参数的辅助工具
- 扩展板 breakout board:把侧板排线信号引出到标准接口,方便接传感器
- ROS 驱动:接入机器人操作系统
- 分体主板固件:给新型 splitboard 的独立实现
- 社区:从旧的 Telegram 群迁到 Matrix,历史消息(含图片)都搬了过去
开始
先拆下车量一下主控型号,对上前面那张"能不能刷"的清单;能刷,就克隆仓库、选个VARIANT_ADC、用 ST-Link 烧一遍,跑通后再决定要不要改成卡丁车或机器人底盘。
先从默认参数跑起来,一次只动一个参数,把 FOC 三种模式和场削弱当成三档可拨的开关,而不是一次性全开。
【免费下载链接】hoverboard-firmware-hack-FOCWith Field Oriented Control (FOC)项目地址: https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考