ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

hoverboard-firmware-hack-FOC 的 config.h 改哪几处,电机才既稳又快

hoverboard-firmware-hack-FOC 的 config.h 改哪几处,电机才既稳又快

hoverboard-firmware-hack-FOC 的 config.h 改哪几处,电机才既稳又快

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

你手里有块跑 hoverboard-firmware-hack-FOC(磁场定向控制 / FOC 固件)的悬浮板主板,Inc/config.h 有 800 多行,到底该动哪几行?这篇文章只讲必须改的 6 处、每处的推荐值和依据。

先定变体:输入设备决定你烧哪个固件

这个固件一个源码树编出十种固件,区别只在于"控制信号从哪根线进来"。主板上有两根四芯传感器排线,先搞清楚它们各管什么:

  1. 左线(USART2):不耐 5V,仅 3.3V、30mA。可当 12bit ADC 用(PA2/ADC1、PA3/ADC2),电位器和串口控制走这里
  2. 右线(USART3):5V 容忍,PPM / PWM / iBUS / Nunchuk / I2C 屏都走这里
你的输入设备选哪个变体
两个电位器VARIANT_ADC
串口(如 Arduino)VARIANT_USART
遥控 PPM 和弦信号VARIANT_PPM
遥控 PWMVARIANT_PWM
FlySky iBUSVARIANT_IBUS
Wii Nunchuk 手柄VARIANT_NUNCHUK
刹车/油门踏板(hovercar)VARIANT_HOVERCAR
滑板 + 遥控 PWMVARIANT_SKATEBOARD

变体在哪改:三种工具三种地方

PlatformIO 用户改 platformio.ini 顶部的选择区:

;default_envs = VARIANT_ADC ; ← 改这里:取消注释,且只保留一个变体

default_envs决定pio run编哪套环境,只能留一行生效,留两行会编出不确定的东西。

Keil uVision 用户不用碰代码,直接点 Load 按钮右侧的 Target 下拉框选变体。

命令行 make 的话,看 Makefile 里的用法:

make -e VARIANT=VARIANT_ADC # ← 改这里:替换成你要的变体 make make flash

也可以在 config.h 开头 VARIANT SELECTION 区直接取消注释对应行。编译时报Variant not defined!,就是这步漏了。

第一次刷不进去?先解锁

主板上的 STM32F103RCT6(部分板子是 GD32F103RCT6)出厂可能开了读保护,make flash会失败。先用 ST-Link 执行make unlock(内部是stm32f1x unlock 0)再刷。线不知道接哪,对照这张引脚图:

主控板引脚布局:左/右传感器排线、XT60 电源输入和 SWD 编程口(PA13/PA14)都在板上,左线只认 3.3V、右线 5V 容忍,红线位置已标注

把电流和转速锁到安全线

config.h 电机最大电流 I_MOT_MAX 怎么改

#define I_MOT_MAX 15 // [A] ← 改这里:单个电机的最大电流 #define I_DC_MAX 17 // [A] ← 保持 I_MOT_MAX + 2A

I_MOT_MAX是每只轮机电流的硬上限,超过就触发斩波限流;I_DC_MAX是 DC 母线的最后一道保护,文件注释明确要求它等于I_MOT_MAX + 2A,两个数要一起动。默认 15A 对原厂 10S 电池(36~40V)是留了余量的保守值,想要更大扭矩可以逐步试到 18~20A——但上限由电池放电能力决定,这块板上没有额外保险丝兜底。

轮子里那台电机的承受力看什么

拆掉外环的悬浮板电机:定子上的铜线绕组和霍尔传感器环,电流上限就是按这套绕组的线径留的余量,15A 默认值对原厂电机是安全的

转速上限 N_MOT_MAX 给多少

#define N_MOT_MAX 1000 // [rpm] ← 改这里:单轮最大转速

这是单轮转速的天花板。默认 1000rpm 是原厂轮径下的保守值;想再快不是调大它就行,反电动势会把电机卡死,得配合磁场削弱一起用(见下文)。

选控制模式:VLT、SPD、TRQ 各管什么

改这一行就能换电机控制方式

#define CTRL_TYP_SEL FOC_CTRL // ← 改这里:COM_CTRL / SIN_CTRL / FOC_CTRL #define CTRL_MOD_REQ VLT_MODE // ← 改这里:VLT_MODE / SPD_MODE / TRQ_MODE

CTRL_TYP_SEL切换整个控制算法:FOC_CTRL 是默认的磁场定向控制,噪声最小、效率最高;SIN_CTRL 是正弦换相;COM_CTRL 是传统六步换相。CTRL_MOD_REQ只在 FOC 下生效,决定内环跟什么物理量。

三种 FOC 模式怎么选

模式行为适合
VLT_MODE恒定电压输出,响应最快需要快响应的机器人机构
SPD_MODE闭环追目标转速,可抗负载扰动恒速、定速巡航类应用
TRQ_MODE跟随扭矩,指令为 0 时电机自由滑行坐姿载人最舒服,HOVERCAR / SKATEBOARD 变体默认就是它

注意 HOVERCAR 和 SKATEBOARD 变体在 config.h 里会自己#undef再重定义CTRL_MOD_REQ,你手填的值会被变体覆盖,以变体为准。

松手之后,轮子要滑行还是刹车

// #define ELECTRIC_BRAKE_ENABLE // ← 改这里:取消注释,TRQ 模式松输入变恒定制动 // #define ELECTRIC_BRAKE_MAX 100 // (0, 500) 制动强度,越小越"溜" // #define STANDSTILL_HOLD_ENABLE // ← 可选:停稳后保持位置

默认松手电机就自由滑行;打开ELECTRIC_BRAKE_ENABLE后"松手"变成温和制动,STANDSTILL_HOLD_ENABLE进一步让车停稳后锁在原地。两个开关只对 VLT/TRQ 模式有意义,其中电闸只生效于 TRQ 模式。

电池压到多少会断电

先改串数,否则阈值全错

#define BAT_CELLS 10 // ← 改这里:电池串数,原厂悬浮板是 10S

后面的 LVL2 / LVL1 / DEAD 全部按BAT_CELLS算。原厂悬浮板电池是 10S(36~40V);如果你换了 9S 或 13S 电池,只改这一个数,保护线就还落在对的位置上。

三级电压保护线在哪

宏每节电压板上动作
BAT_LVL23.60 V慢速蜂鸣(BAT_LVL2_ENABLE=0可关)
BAT_LVL13.50 V快速蜂鸣,该充电了
BAT_DEAD3.37 V直接断电(仅限未行驶状态)

数字的单位是"每节电压 × 100",改行首那个数就行:

#define BAT_DEAD (337 * BAT_CELLS * BAT_CALIB_ADC) / BAT_CALIB_REAL_VOLTAGE // ← 改 337

锂电池低于 3.3V 就开始伤寿命,默认 3.37V 断电线合理。如果你总骑到"没电",可以略微下探BAT_DEAD,代价是电池寿命。

电压读数差得远?两步校准

  1. 用万用表量实际输入电压,×100 写进BAT_CALIB_REAL_VOLTAGE(文件注释里的例子:39.70V → 3970)
  2. 读串口调试输出的第 5 项(BatADC),写进BAT_CALIB_ADC
  3. 再核对调试输出第 6 项(×100 的电压)是否和万用表一致

默认BAT_CALIB_ADC=1492对应 39.70V,你的板子读数偏差大,基本就是这两个数没对上。

想突破 1000rpm:磁场削弱怎么开

开之前先动这四行

#define FIELD_WEAK_ENA 0 // ← 改成 1 开启磁场削弱 #define FIELD_WEAK_MAX 5 // [A] ← 改这里:最大削弱电流,10A 以内实测过 #define FIELD_WEAK_LO 750 // (500, 1000] 输入目标到它开始介入 #define FIELD_WEAK_HI 1000 // (1000, 1500] 到它时削弱最大,硬上限 1500

FIELD_WEAK_MAX是 d 轴削弱电流,越大极速越高但功耗越大——文件注释里写了 10A 只在 10 寸轮上实测过,别一上来就拉满。LO/HI注意,它们指的是输入指令值(-1000~1000 那个区间),不是 rpm:削弱电流在这两点之间从 0 线性爬到最大值。

曲线长什么样

磁场削弱 / 相位提前在 FIELD_WEAK_LO 到 FIELD_WEAK_HI 之间从 0 线性升到 FIELD_WEAK_MAX,图中是"完全混合、部分混合、目标落在区间外"三种标定,对照着定 LO/HI

如果用的是 SIN_CTRL,对应参数换成PHASE_ADV_MAX(角度制,默认 25°),原理相同。⚠️ 官方 README 的警告必须转述给你:重新标定磁场削弱后电机可能转得非常快,功耗骤增还会触发 BMS 过压保护——先在空地上用小的FIELD_WEAK_MAX试。

避坑:这几处改错,轻则翻车重则烧板

为什么别碰传感器线上的红 15V 线

调试串口、串口控制、输入接线都复用最开始那两根排线,最容易烧板的是接线的 30 秒:

  1. 适配器必须用 3.3V 版 UART-USB,只接 GND、RX(需要发命令再加 TX)
  2. 排线里的红色供电线是 15V,绝对不要接到适配器的 VCC,碰一下整条链路报废
  3. 波特率统一 115200,和 platformio.ini 里monitor_speed一致
// #define DEBUG_SERIAL_USART3 // ← 改这里:右线调试 // #define DEBUG_SERIAL_PROTOCOL // ← 改这里:要发命令、在线改参数才打开

调试口和控制/反馈口共用引脚,config.h 末尾的#error检查会在冲突时直接编译失败,比如DEBUG_SERIAL_USART3 and FEEDBACK_SERIAL_USART3 not allowed,看到报错先想"是不是两条路都想占同一根线"。

温度保护没校准,别开 ENABLE

#define TEMP_WARNING_ENABLE 0 // ← 校准完才改成 1 #define TEMP_POWEROFF_ENABLE 0 // ← 校准完才改成 1

温度传感器就在 STM/GD 芯片内部,不校准误差最大能有 45°C。直接开的话,要么 30°C 就"拒动",要么烧到 100°C 才断电。按注释流程做两点校准(冷态 + 热态各采一组 ADC/温度)再启用,警告值 60.0°C、断电值 65.0°C 对多数场景够用。

改了 config 不生效?校准值存在 flash 里

VARIANT_ADC 的自动校准(长按电源 5 秒以上听到蜂鸣,再把电位器扫到最小/最大,回中后按电源确认)会把 min/max 写进 flash,此后生效的是 flash 里的值,不是你 config.h 里PRI_INPUT1/2的写法。输入手感不对时:

  1. 改一下FLASH_WRITE_KEY,让板子忽略 flash 值、改用 config 值
  2. 或者整片擦除(PlatformIO 刷机默认带 erase)后重新校准

原厂自平衡?那个变体还没做完

VARIANT_HOVERBOARD 是给两根原厂边板准备的,要求边板也刷了改版固件,而且文件里明确标注平衡控制器还是 TODO——别指望它自动平衡,想骑平衡车模式现在还不行。踏板改 hovercar 的接线拿不准时,对照这张完整接线图:

![HOVERCAR 变体完整接线示意:踏板接左线

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

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进