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 处、每处的推荐值和依据。
先定变体:输入设备决定你烧哪个固件
这个固件一个源码树编出十种固件,区别只在于"控制信号从哪根线进来"。主板上有两根四芯传感器排线,先搞清楚它们各管什么:
- 左线(USART2):不耐 5V,仅 3.3V、30mA。可当 12bit ADC 用(PA2/ADC1、PA3/ADC2),电位器和串口控制走这里
- 右线(USART3):5V 容忍,PPM / PWM / iBUS / Nunchuk / I2C 屏都走这里
| 你的输入设备 | 选哪个变体 |
|---|---|
| 两个电位器 | VARIANT_ADC |
| 串口(如 Arduino) | VARIANT_USART |
| 遥控 PPM 和弦信号 | VARIANT_PPM |
| 遥控 PWM | VARIANT_PWM |
| FlySky iBUS | VARIANT_IBUS |
| Wii Nunchuk 手柄 | VARIANT_NUNCHUK |
| 刹车/油门踏板(hovercar) | VARIANT_HOVERCAR |
| 滑板 + 遥控 PWM | VARIANT_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 + 2AI_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_MODECTRL_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_LVL2 | 3.60 V | 慢速蜂鸣(BAT_LVL2_ENABLE=0可关) |
| BAT_LVL1 | 3.50 V | 快速蜂鸣,该充电了 |
| BAT_DEAD | 3.37 V | 直接断电(仅限未行驶状态) |
数字的单位是"每节电压 × 100",改行首那个数就行:
#define BAT_DEAD (337 * BAT_CELLS * BAT_CALIB_ADC) / BAT_CALIB_REAL_VOLTAGE // ← 改 337锂电池低于 3.3V 就开始伤寿命,默认 3.37V 断电线合理。如果你总骑到"没电",可以略微下探BAT_DEAD,代价是电池寿命。
电压读数差得远?两步校准
- 用万用表量实际输入电压,×100 写进
BAT_CALIB_REAL_VOLTAGE(文件注释里的例子:39.70V → 3970) - 读串口调试输出的第 5 项(BatADC),写进
BAT_CALIB_ADC - 再核对调试输出第 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] 到它时削弱最大,硬上限 1500FIELD_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 秒:
- 适配器必须用 3.3V 版 UART-USB,只接 GND、RX(需要发命令再加 TX)
- 排线里的红色供电线是 15V,绝对不要接到适配器的 VCC,碰一下整条链路报废
- 波特率统一 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的写法。输入手感不对时:
- 改一下
FLASH_WRITE_KEY,让板子忽略 flash 值、改用 config 值 - 或者整片擦除(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),仅供参考