ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

平衡车FOC固件上手指南:hoverboard-firmware-hack-FOC 从解锁到上路全流程

平衡车FOC固件上手指南:hoverboard-firmware-hack-FOC 从解锁到上路全流程

平衡车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)装进平衡车主板,给电机换上一个电流可以被精确控制的"油门"。

这篇文章的阅读路线:行前准备(认板、认线)→核心操作(解锁、烧录、选变体、核对参数)→到站验收(自检、排错、进阶)。每个实操小节开头都有"完成标志",做到哪一步就对着自检。

行前准备:认主板和别碰错的三根线

完成标志:不看图也能指出 SWD 的四个焊盘,并能说出传感器线缆里哪根是电源线。

主板上的大脑一般是 STM32F103RCT6,部分板子是 GD32F103RCT6,两者这套固件都支持。整个刷写过程只和主板上两个位置打交道:SWD 接口、两根 4 针传感器线缆。

ST-Link V2 的 4 根线这样接到板子上:

  • SWDIO →PA13
  • SWCLK → PA14
  • GND → GND
  • 3.3V → 3.3V(可选,注意 30mA 上限)

主板引出的两根 4 针传感器线缆(原本接左右侧板),每根都带 GND、12/15V 和一个串口:左线是 USART2,右线是 USART3。后面接电位器、遥控器、串口调试,全走这两根线。左线不耐 5V,USB 转 TTL 模块请选 3.3V 电平款。

⚠️ 线缆里的红导线是 15V 电源线。接串口调试或传感器时只碰 GND 和 RX/TX,千万别把红线上电——你的 USB 转 TTL 模块甚至主芯片会一次烧完。

为什么要"解锁"?平衡车出厂固件给芯片开了读保护(RDP),不解掉它,ST-Link 连读都读不了 Flash,更别提写入。这是刷 FOC 固件路上第一道、也是唯一一道真正的门槛。

核心操作:解锁、烧录、让 FOC 固件跑起来

解除读保护,把固件写进 Flash

完成标志:ST-Link Utility 显示 Verification OK,且从 0x08000000 开始的内存不再全是 FFFFFFFF。

全程三步,都在 STM32 ST-Link Utility 里完成:

  1. Target → Option Bytes...:把 Read Out Protection 设为 Level 0,Apply;
  2. Target → Erase Chip:把原厂程序彻底擦干净;
  3. Target → Program & Verify...:选择编译好的.bin文件,起始地址保持0x08000000,等待 "Verification OK"。

如果第 1 步之前连接就弹出 "Can not read memory!",就是 RDP 在拦你:

擦除完成后再刷新一次内存视图,应当全部是 FFFFFFFF:

固件从哪来,两条路:

  • 下现成产物:打开项目的 Actions 构建页面,找最近一次 Success 的构建,下载 Artifacts 里的打包文件,完全不用自己编译;

  • 自己编译:克隆后用 PlatformIO(platformio.ini 已配好 stlink 烧录协议),或用 Keil 打开 mainboard-hack.uvprojx。

git clone https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC cd hoverboard-firmware-hack-FOC
pio run -e VARIANT_ADC -t upload

-e参数选变体(下一节讲怎么选),同一条命令编译并烧录。走 Keil 的话,在 Load 按钮右侧的 Target 下拉框里切变体再点烧录即可。

💡 Keil 工程默认按 STM32F103xE 配置,PlatformIO 目标是 genericSTM32F103RC;GD32F103RCT6 板子同样支持,芯片容量不同只会影响烧录地址布局。

从 10 种输入变体里挑一种

完成标志:动一下输入设备,对应车轮平顺转动;方向反了的话翻一个宏就能掰正。

固件内置 10 种输入变体,按你打算用什么开车轮来挑:

  • VARIANT_ADC:两个电位器走左传感器线缆,自制遥控、电动小车最常见
  • VARIANT_USART:串口协议控制,仓库里 hoverserial.ino 是现成的 Arduino 示例
  • VARIANT_NUNCHUK:Wii 手柄单手出车,电动轮椅、搬运车用得多
  • VARIANT_PPM/VARIANT_PWM/VARIANT_IBUS:RC 遥控器三种信号制式,遥控滑板、卡丁车
  • VARIANT_HOVERCAR:刹车 + 油门双踏板,卡丁车式体验
  • VARIANT_HOVERBOARD:保留与原厂侧板的通信,平衡控制尚未实现
  • VARIANT_SKATEBOARD、VARIANT_TRANSPOTTER:滑板与运输车的专用构建

只选一个:PlatformIO 里用-e参数,或在你本地克隆的 platformio.ini 里放开default_envs的注释;Keil 里切 Target 下拉框;也可以在 config.h 顶部直接定义宏(Ubuntu 下 make 构建)。

变体为什么是个大事?因为两根 4 针线的引脚就那么多,同一条线不能既当输入又当调试串口——config.h 里有一整套编译期检查,撞了会直接编译报错拦下你。烧完发现电机转反方向,不用动线,打开INVERT_L_DIRECTION或INVERT_R_DIRECTION重新编译即可。

ADC 变体首次上电记得做自动校准:长按电源键到蜂鸣,把两个电位器在最小和最大之间来回打几轮,回到中位松开,再按一次电源键确认,数值会写进 Flash 持久保存。

核对三个 FOC 参数和弱磁开关

完成标志:空载试转,电机电流、转速都压在你设的上限内,无过流报警。

FOC 凭什么"握住"电机?换相控制像接力传水,电流按固定顺序一段段灌进去;FOC 则把电流拆成两个独立旋钮:d 轴管励磁(磁场有多强),q 轴管扭矩(有多大力),各自闭环调节,电流波形变成平滑正弦,噪声和发热自然降下来。代码上这就是 BLDC_controller.c 里的核心环,电机参数在 BLDC_controller_data.c——官方已内置一套校准好的默认值,大多数主板开箱即用。

三种控制方式加 FOC 的三种细分模式,都由 config.h 里两个宏切换:

方案(宏)驾驶手感能耗能否弱磁提速典型用途
换相COM_CTRL一顿一顿、嗡嗡响偏高不支持原厂状态,不建议停留
正弦SIN_CTRL明显变顺较低可用相位前移提一点速想先升级又懒得动参数
FOC·电压VLT_MODE响应直接、跟手低支持机械臂、要快响应的机器人应用
FOC·转速SPD_MODE恒速自稳,遇阻力自动补低支持巡航、传送带式定速
FOC·扭矩TRQ_MODE最平滑,松油门可滑行低支持人坐上去代步的日常场景

控制方式用CTRL_TYP_SEL指定(默认FOC_CTRL),FOC 细分模式用CTRL_MOD_REQ指定(默认VLT_MODE,注意转速、扭矩模式仅 FOC 可用)。

参数微调盯三个就够:

  • I_MOT_MAX:单电机电流上限,默认 15A,直接决定扭矩天花板,别超过电机与电池的承受范围;
  • N_MOT_MAX:转速上限,默认 1000rpm,是你极速的最后防线;
  • CTRL_MOD_REQ:按用途在电压/转速/扭矩里三选一,对号上表入座。

嫌 1000rpm 顶不上去,可以开弱磁(Field Weakening):给电机注入一点反向励磁,用少量效率和发热换更高的转速上限。FIELD_WEAK_ENA = 1打开,FIELD_WEAK_MAX(默认 5A,10 寸轮实测到 10A)定注入量,FIELD_WEAK_LO/FIELD_WEAK_HI定义输入目标从哪开始介入、到哪拉满:

⚠️ 弱磁打开后电机可能转得飞快,功耗骤升并可能触发电池 BMS 过压保护。务必架起车轮测试,别上车就开。

到站验收:刷完之后的自检与排错

5 分钟上车自检法

完成标志:下面 5 项全部通过,串口调试流里数值合理。

  1. 架起车轮通电:电机空载怠速,声音均匀,无刮擦、无尖啸;
  2. 满行程走一遍:输入从 0 缓推到满,车轮平滑分级加速,起步点没有电流咔哒声;
  3. 中速保持:SPD_MODE 下把输入停在中间值,速度应自行稳住,轻推车身无肉眼可见漂移;
  4. 看串口:in1/in2跟手、cmdL/cmdR跟随,BatV与万用表实测电压偏差在几个百分点以内;
  5. 断电重启:再上电后输入立即响应,无异常蜂鸣。

💡 在 config.h 打开DEBUG_SERIAL_USART2或DEBUG_SERIAL_USART3重新编译烧录,用 3.3V USB 转 TTL 按 115200 波特率接(只接 GND 和 RX),输出形如in1:.. in2:.. cmdL:.. cmdR:.. BatADC:.. BatV:..,多数问题扫一眼就定位。注意调试串口和输入设备不能同时占同一条线缆。

排错速查:最常见的四个现象

发生了什么根源猜测第一步动作
ST-Link 报 "Can not read memory!"原厂读保护(RDP)没解除Target → Option Bytes设 Level 0 并 Apply,再擦除重刷
电机嗡嗡、尖叫或干脆不转变体与实物接线不符,或电机参数没对上核对变体对应线缆;对照 BLDC_controller_data.c 恢复默认校准值
输入动了毫无反应变体选错,或调试串口抢占了线缆核对 platformio.ini 里的宏与 config.h 串口配置
一通电就自动关机、电压显示明显不对电池电压校准值失效按 config.h 电池区注释:把调试输出第 5 项写入BAT_CALIB_ADC,用第 6 项对表万用表

上车前安全清单与三个进阶玩法 🚀

安全清单,5 条一条都不能少:

  1. 刷完后的每次测试都架起车轮;
  2. 改线前断电,红线 15V 最后接、最先拆;
  3. I_MOT_MAX、N_MOT_MAX动手前先看电机铭牌与电池最大放电电流;
  4. 弱磁只在架车状态下试,并确认 BMS 有裕量;
  5. 调试串口、输入设备、I2C 小屏在同一条线缆上互斥,编译期会报错,但别靠报错兜底,接前自己确认。

进阶玩法,三个方向都能直接上手:

  • 巡航定速:打开CRUISE_CONTROL_SUPPORT加SUPPORT_BUTTONS_LEFT(或_RIGHT),按一下按钮把当前速度锁住,松油门不溜车;
  • 电机制动:扭矩模式下启用ELECTRIC_BRAKE_ENABLE,松开油门从自由滑行变成自动缓刹;
  • 踏板卡丁车:用VARIANT_HOVERCAR变体,自带新手/进阶/高手三档启动模式,起步前双击刹车踏板还能倒车。

想接入自己的控制系统,hoverserial.ino 是现成的串口控制起点;想弄懂 FOC 到底怎么"握住"电流,逐段读 BLDC_controller.c——从"能转"到"知道为什么转",才是这次改造最值的地方 ⚡

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

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

返回列表