☰
hoverboard-firmware-hack-FOC 刷写完整指南:把平衡车主板升级成磁场定向控制
2026/10/23 2:07:28 网站建设 项目流程

hoverboard-firmware-hack-FOC 刷写完整指南:把平衡车主板升级成磁场定向控制

【免费下载链接】hoverboard-firmware-hack-FOCWith Field Oriented Control (FOC)项目地址: https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC

给自制代步车接线那天,电机一起转就发出嗡嗡的啸叫,起步一抽一抽,电量掉得飞快——罪魁祸首不是电机,而是原厂固件最基础的换相(Commutation)驱动。这个项目 hoverboard-firmware-hack-FOC 做的事很直接:把磁场定向控制(FOC)算法塞进平衡车主板的 STM32 芯片里,让电流按"磁力分量 + 扭矩分量"两路闭环输出,换来更低的噪声、更平滑的扭矩和更高的效率,还能靠弱磁突破速度上限。

换相驱动 vs FOC:到底差在哪

原厂逻辑相当于给三相线圈排了一个固定的通电顺序,像老式电风扇的三档开关:只有"通/断",档位之间硬切换,电流毛刺大、铜损高。FOC 则更像调光器加闭环稳压器:它实时算出转子位置,把电流精确拆成正交的两路,你可以从 0% 到 100% 无级调节扭矩,电压或负载波动时控制器会自动补偿。

对比项原厂换相(Commutation)正弦波(Sinusoidal)FOC
平顺度一般,切换有冲击较好优秀,扭矩连续
效率一般较好优秀
弱磁提速不支持需手动相移角支持,可配上限
松油门滑行自由滑行自由滑行扭矩模式下可选电子刹车
定速巡航无无支持(切 SPD_MODE)

控制方式在 配置头文件 里由CTRL_TYP_SEL切换(COM_CTRL/SIN_CTRL/FOC_CTRL),FOC 下再由CTRL_MOD_REQ选电压、转速、扭矩三种细分模式。

刷写前备齐硬件、工具与认知

类别清单
硬件平衡车主板(STM32F103RCT6,部分板子是 GD32F103RCT6,两者均支持)、ST-Link V2、3.3V USB 转 TTL 模块(调试串口用)、万用表(标定电压用)
软件PlatformIO 命令行工具,或 Keil(仓库带MDK-ARM/工程),或 arm-none-eabi-gcc + 仓库 Makefile;ST-Link Utility(解锁/烧录)
认知原厂芯片通常开了读保护,必须解锁;主板引出的两根 4 针线是接侧板的,内含 GND、15V、USART2/3,是未来所有输入设备的接口;串口号波特率统一 115200

把仓库拉到本地,后面所有操作都在这里进行:

git clone https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC

认识主板与接线:找准 SWD 口和两条传感器线

预期结果:能指着板子说出 SWD 刷写口在哪、两根传感器线各是什么,接线一次到位不烧东西。

对照上图标注,三组接口是你唯一需要关心的:

  1. SWD 刷写口(图中 "SWD Programming" 位置,供电限 3.3V 30mA max):ST-Link 接法如下。
ST-Link 引脚主板对应
SWDIOPA13
SWCLKPA14
GNDGND
3.3V3.3V(可选,供电限 30mA)
  1. 左侧传感器线缆(蓝色长线):对应 USART2,引脚为 PA2(TX/ADC1)、PA3(RX/ADC2/PPM/iBUS),外加 GND 和 15V。注意USART2 不耐 5V,接 3.3V TTL 模块才不会出事。
  2. 右侧传感器线缆(短线):对应 USART3,引脚为 PB10(TX/SCL)、PB11(RX/SDA),这条线 5V 容忍,还能当 I2C 用。

⚠️ 两根线缆里的红色线是 15V 电源,调试串口或接任何外设时千万不要碰它——接上 USB 转 TTL 的瞬间,模块和主板都会直接报废(配置注释 里反复强调了这点)。

解锁芯片读保护并写入 FOC 固件

预期结果:ST-Link Utility 能连上芯片,Verification OK出现在屏幕上。

  1. 解除读保护:ST-Link Utility 中打开Target → Option Bytes...,把 Read Out Protection 调到 Level 0 并 Apply。这一步会触发全片擦除,属于正常现象。
  2. 擦除芯片:执行Target → Erase Chip,把原厂程序彻底清空。
  3. 写入固件:点Program & Verify,选择编译好的.bin,起始地址保持0x08000000,等 "Verification OK"。

固件怎么来?两条路:去项目的 CI 构建页面直接下载现成.bin(示意如下),或本地自己编译。

本地编译用 PlatformIO 最省事:在 构建配置 顶部解开你想要变体的注释(例如default_envs = VARIANT_ADC),然后:

pio run # 编译,产物在 build 目录 pio run -t upload # 通过 ST-Link 写入

命令行党可以走仓库自带 Makefile(需要arm-none-eabi-gcc和st-flash):

make -e VARIANT=VARIANT_ADC # 指定变体编译 make flash # 等价于 st-flash write 到 0x8000000 make unlock # 用 OpenOCD 解锁读保护(免装 ST-Link Utility)

💡 烧录前确认芯片型号:工程默认按 STM32F103xE(128KB Flash)配置,GD32 同封装可直接通用;若你的板子 Flash 容量不同,链接脚本STM32F103RCTx_FLASH.ld需要相应核对。

给固件匹配输入变体:你的车怎么开就选哪个

预期结果:转动你的输入设备(摇杆、电调、踏板),电机平滑响应,方向正确。

固件内置 10 种输入变体,README 里有完整说明。选型逻辑很简单——"输入信号从哪来,就选哪款":

变体输入方式适合场景
VARIANT_ADC左线接两个电位器(12bit ADC)自制遥控、电动小车
VARIANT_USART串口协议(默认 USART3 右线)Arduino/单片机、ROS 接入
VARIANT_NUNCHUKWii 右线手柄(I2C)电动轮椅、单人代步车
VARIANT_PPM/VARIANT_PWM/VARIANT_IBUS航模遥控(PPM 求和 / PWM / FlySky iBUS)遥控滑板、卡丁车
VARIANT_HOVERCAR刹车 + 油门双踏板(ADC)踏板代步车
VARIANT_HOVERBOARD保留双侧板通信原车结构(平衡控制尚未实现)
VARIANT_TRANSPOTTER/VARIANT_SKATEBOARD游戏摇杆 / 航模 PWM对应改装形态

选定后重新编译烧录即可。验证与修正:

  1. 打开调试串口(Inc/config.h中启用DEBUG_SERIAL_USART2或DEBUG_SERIAL_USART3),115200 波特率,终端会持续滚动in1 / in2 / cmdL / cmdR / BatADC / BatV / TempADC / Temp一行数据——输入没变化先查in1/in2,有输入但电机不动再查cmdL/cmdR。
  2. 方向反了就打开INVERT_L_DIRECTION/INVERT_R_DIRECTION(在对应变体配置段内)重新烧录。
  3. 串口控制的现成示例在 Arduino 工程,可以直接抄进自己的控制端。

调 FOC 参数与弱磁:让极速再往上走一格

预期结果:电流与转速上限贴合你的电机,弱磁开启后极速提升,全程无过流、无异响。

核心参数都集中在 配置头文件 的 "MOTOR CONTROL" 段:

参数默认值含义
CTRL_MOD_REQVLT_MODE电压模式:响应快,适合机器人;SPD_MODE:定速巡航;TRQ_MODE:扭矩闭环,人驾驶体验最好,松手可自由滑行
I_MOT_MAX15 A单电机最大电流,扭矩上限由此决定,别超过电机与电池余量
I_DC_MAX17 A母线直流限流(换相/正弦波模式生效,经验值 = I_MOT_MAX + 2A)
N_MOT_MAX1000 rpm最高转速硬限制,安全防线
FIELD_WEAK_ENA0(关闭)弱磁总开关

电机本体的标定参数(极对数、绕组电感等,定长定点数存储)在 Src/BLDC_controller_data.c,官方已给好一套校准值,绝大多数主板开箱即用;想深挖原理可对照 FOC 控制器源码。

想突破极速时打开弱磁:FIELD_WEAK_ENA置 1,控制器会在输入目标从FIELD_WEAK_LO(默认 750)到FIELD_WEAK_HI(默认 1000)之间线性叠加一路反向 d 轴电流,最高到FIELD_WEAK_MAX(默认 5A,作者实测 10A 可跑在 10 寸轮上)。正弦波模式则对应PHASE_ADV_MAX(默认 25°)。三种典型的斜率取法:

⚠️ 弱磁是危险参数:电机可能转得极快、功耗骤增,还会触发电池 BMS 的过压保护。务必把车轮架起来、人离远点,小步上调FIELD_WEAK_MAX验证。

刷完不转?按这张表排查

现象可能原因处理
ST-Link 报 "Can not read memory" / 无法连接读保护未解除先按上节把 RDP 降到 Level 0 再 Erase Chip
电机抖动、尖叫电机参数不匹配(极对数/电流/电感)核对 BLDC_controller_data.c,参考官方校准表微调
输入完全无响应变体选错或接错线缆对照变体注释确认左线(USART2)/右线(USART3),并检查 TX/RX 是否交叉
方向反了电机安装方向打开INVERT_L_DIRECTION/INVERT_R_DIRECTION
一开机就掉电关机电池电压标定偏差看调试输出里BatADC(第 5 项),写入BAT_CALIB_ADC;万用表实测电压 ×100 写入BAT_CALIB_REAL_VOLTAGE,再核对BatV(第 6 项,电压 ×100)
串口输出乱码波特率错或 TX/RX 直连统一 115200,TTL 模块 TX 对板子 RX、RX 对 TX,只用 GND + 数据两根线
左线接 5V 设备后串口挂掉USART2 不耐 5V换 3.3V 电平的模块,或改用右线 USART3

安全清单与进阶玩法

第一次通电的三个必须:车轮架起、人站在 1 米外、手边有电源开关。改弱磁参数前算好电机与电池余量;接串口永远绕开红色 15V 线;调试串口和输入设备若共用一条线缆,编译期就会报#error(配置里有成对的互斥检查),照提示改宏即可。

刷好之后的可玩性其实才刚打开:

  • 定速巡航:启用CRUISE_CONTROL_SUPPORT加SUPPORT_BUTTONS_LEFT/RIGHT,按键切入后自动切到SPD_MODE锁速,再松油门也不会溜。
  • 电子刹车:扭矩模式下启用ELECTRIC_BRAKE_ENABLE,用ELECTRIC_BRAKE_MAX/ELECTRIC_BRAKE_THRES设定刹车力度,松油门即缓刹,下坡更稳。
  • 静态驻车:STANDSTILL_HOLD_ENABLE让停稳后电机"咬住"位置,斜坡不打滑。
  • 踏板代步车:切到VARIANT_HOVERCAR,双踏板控制油门刹车,停稳时双击刹车踏板倒车;MULTI_MODE_DRIVE还能用踏板组合在开机时选新手/进阶/老手三档(电流与转速逐级放开)。

从"能转起来"到"每一安培都花在刀刃上",这块主板已经被你彻底改写了规则——剩下的,就是上路 🚀

【免费下载链接】hoverboard-firmware-hack-FOCWith Field Oriented Control (FOC)项目地址: https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询