给平衡车刷 FOC 场定向控制固件的完整指南:从换向控制到顺滑驱控(新手适用)
【免费下载链接】hoverboard-firmware-hack-FOCWith Field Oriented Control (FOC)项目地址: https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC
hoverboard-firmware-hack-FOC 是一个为普通平衡车主板编写的FOC(Field Oriented Control,场定向控制)固件,用来替换原厂的换向控制,让电机噪音更小、扭矩输出更平滑、效率更高。它适合手里有闲置平衡车、想改造成电动滑板/卡丁车/机器人底盘的动手派玩家,也适合想学习 FOC 电机控制的工程师。
它是什么,能换成什么
原厂平衡车用的是"六步换向":电流按六个固定角度切换来推动电机,实现简单,但代价是噪音、振动和效率损失。这个固件在同一块主板上提供三档控制方式:
- 换向控制(COM_CTRL):保留原厂行为,作为保底;
- 正弦波控制(SIN_CTRL):电流波形正弦化,平滑度提升,还支持提前角(Phase Advance)提升极速;
- FOC 场定向控制(FOC_CTRL):默认选项,把三相电流分解为"产生转矩"和"建立磁场"两个分量分别闭环控制,再配合 16kHz PWM 输出(见
Inc/config.h中的PWM_FREQ)和相位电流 ADC 采样。
FOC 下又有三种工作模式,决定了"你给它什么指令、它怎么执行":
| 控制方式 | 输入指令 | 特点 | 适合场景 |
|---|---|---|---|
| FOC 电压模式 VLT_MODE | 电压目标 | 响应最快,松手即滑行 | 机器人、需要快速响应的场合 |
| FOC 速度模式 SPD_MODE | 转速目标(RPM) | 闭环抗扰,恒定转速 | 定速巡航类应用 |
| FOC 扭矩模式 TRQ_MODE | 扭矩目标 | 输出最线性,松手自由滑行 | 有人乘坐、需要自然脚感的场合 |
原理:FOC 到底"定向"了什么
用大白话说:换向控制像一个只会踩 6 档深浅的油门——车快还是慢,脚只能落在那 6 个固定位置里;FOC 则像连续可调的油门,你想要多大的扭矩,它就在最合适的角度上给恰好那么大的电流。
具体过程分三步:采样——在 PWM 周期内用 ADC 实测三相绕组电流,同时用霍尔传感器知道转子角度;分解——把三相电流换算到随转子旋转的坐标系里,拆成 d 轴(磁场)和 q 轴(转矩)两个分量;执行——两个电流环各自 PID 调节,把 q 轴电流精确压到你请求的扭矩上。因为电流方向始终"定向"在转矩最优的位置,能量不会浪费在无效方向上,这就是它更安静、更省电的原因。
一个直观的对比:同样 5km/h 的车速,换向控制下电机是"一顿一顿"地在跳格子,FOC 下电流是连续平滑的,振动和"嗡嗡"声会明显减少。
硬件准备:先确认你的板子支持
固件只支持主芯片为STM32F103RCT6 或 GD32F103RCT6的主板(新款分体式主板不支持,需要另外的固件)。动手前准备好:
- ST-Link V2编程器(接主板 SWD 口:PA14/SWCLK、PA13/SWDIO,3.3V);
- USB 转串口适配器(3.3V 电平,用于调试和串口控制);
- 万用表与基础焊接工具。
主板上两根侧板电缆引出 GND、12/15V 和 USART2/USART3,引脚定义可参考下图(来自 docs/pictures/mainboard_pinout.png):
两个容易踩的坑:
- USART2(左侧板电缆)不耐 5V,接 5V 串口会烧;USART3(右侧板电缆)支持 5V。
- 侧板电缆上的红线是 12/15V,接串口或电位器时务必只用 GND 和信号线,接错会烧板。
编译与刷写:PlatformIO 一条命令搞定
项目提供三种构建方式:PlatformIO(推荐)、Keil MDK、命令行 Makefile(Makefile支持make -e VARIANT=VARIANT_NUNCHUK这类变体选择)。用 PlatformIO 的话,先克隆仓库:
git clone https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC cd hoverboard-firmware-hack-FOC然后在platformio.ini里把目标变体取消注释(见下一节的变体说明),编译并用 ST-Link 刷入:
pio run -e VARIANT_USART # 编译串口控制变体 pio device -e VARIANT_USART -u /dev/stlink # 经 ST-Link 写入 Flash编译产物是.bin,刷写走 ST-Link 而非串口。变体(variant)决定固件"听谁的指令",一次只能启用一个,选错时编译会直接报Variant not defined!或引脚冲突错误——这个校验写死在Inc/config.h里,不用自己排查。
选变体与配参数:从 config.h 入手
所有可选项集中在Inc/config.h,按注释分成几大块。最核心的两个定义决定控制方式:
#define CTRL_TYP_SEL FOC_CTRL // 控制类型:FOC 场定向(另有 SIN_CTRL、COM_CTRL) #define CTRL_MOD_REQ VLT_MODE // 控制模式:电压模式(另有 SPD_MODE、TRQ_MODE)白话:第一行选"用什么算法驱动电机",第二行选"用什么指令驱动算法"。比如做遥控电动滑板,仓库自带VARIANT_SKATEBOARD变体已替你改成TRQ_MODE(扭矩模式),踏板松开即滑行,脚感最自然。
可选变体一览(platformio.ini/config.h顶部):
| 变体 | 输入来源 | 典型用途 |
|---|---|---|
| VARIANT_ADC | 两个电位器(左电缆) | 桌面调试、DIY 摇杆 |
| VARIANT_USART | 串口协议(右电缆,115200) | Arduino/Pi 遥控,机器人 |
| VARIANT_NUNCHUK | Wii Nunchuk(I2C) | 单手控制的电动轮椅/搬运车 |
| VARIANT_PPM / PWM / IBUS | 遥控模型接收机 | 遥控车、滑板 |
| VARIANT_HOVERCAR | 油门+刹车踏板(ADC) | 平衡车卡丁车,双击刹车倒车 |
| VARIANT_SKATEBOARD | RC PWM | 电动滑板(默认扭矩模式) |
说明:
VARIANT_HOVERBOARD(保留原厂自平衡骑行)目前只实现了与侧板的通信,平衡控制器尚未实现,想骑还是要刷回原厂固件。
参数调优与安全边界
电机可调参数(电感、电阻、极对数等)在Src/BLDC_controller_data.c中,仓库已提供标定好的一套,默认参数直接可用。参数采用定点数表示以节省运行开销,如需微调可用作者配套的 Fixed-Point Viewer 工具查看数值。
常规调优只需动Inc/config.h的三个保护阈值:
I_MOT_MAX 15:单电机最大电流 15A,建议按你的电机和轮子逐步下调试;I_DC_MAX 17:直流母线总电流保护(注释建议设为 I_MOT_MAX + 2A);N_MOT_MAX 1000:电机最高转速限制(RPM)。
内置的安全机制不用你额外开发:单电机限流 + 母线限流、电池电压分级报警并在3.37V/片(约 33.7V,10S 电池)自动关机、主板芯片过热检测(需先校准才能启用)、输入命令连续出错 20 次即紧急断电(TIMEOUT)、8 分钟无操作自动关电。
警告:场削弱(Field Weakening)默认关闭。
FIELD_WEAK_ENA默认为 0,不要随手打开。它通过注入 d 轴电流突破反电动势限制来换取更高极速,README 原文提醒:电机可能转得非常快,功耗剧增并可能触发电池 BMS 过压保护。如确需使用,FIELD_WEAK_MAX最大电流在 10 寸轮上测试过 10A 上限,FIELD_WEAK_HI不得高于 1500,且调试前务必断开轮子连接、做好防护。
另外建议开启DIAG_ENA(默认 1)保留电机诊断,并可用DEBUG_SERIAL_USART2/3打开串口调试输出,实时查看输入指令、电池电压与芯片温度。
还能做什么:同一套硬件的多种玩法
因为输入层和控制层解耦,同一块主板可以按需切换角色:
- 机器人底盘:
VARIANT_USART下串口发 -1000~1000 的指令即可精确控车,仓库自带 Arduino 示例 Arduino/hoverserial/hoverserial.ino,配合 ROS 驱动可做导航平台; - 卡丁车/搬运车:
VARIANT_HOVERCAR支持油门+刹车踏板、双击刹车倒车,还能用MULTI_MODE_DRIVE在开机时用踏板组合选择新手/进阶/高级三档驾驶模式(分别限制最大电流与转速); - 巡航模式:开启
CRUISE_CONTROL_SUPPORT后按侧板按钮可锁定当前速度,松手不再滑行; - 轮椅/货运车:
VARIANT_NUNCHUK单只 Nunchuk 同时控制油门、刹车与转向,是电动轮椅社区的成熟方案。
社区生态还包括 Web 串口控制、在线编译器、扩展板(breakout board)和针对分体主板的姊妹项目,README 的 Projects and Links 一节有完整索引,遇到问题可以先翻 docs/ 里的原理图与数据手册。
常见问题
Q:我的平衡车能刷吗?怎么确认?A:拆开看主板芯片,丝印是 STM32F103RCT6 或 GD32F103RCT6 即可。分体式主板(新一代"split board")需要其他项目的固件。
Q:刷回原厂固件可以吗?A:可以,FOC 固件和原厂固件走同一个 Flash,随时用 ST-Link 刷回,不存在变砖锁死的情况。
Q:成本大概多少?A:除了平衡车本身,主要是 ST-Link V2(约二三十元)和一个 3.3V 的 USB 转串口模块(十几元)。
Q:需要多深的技术背景?A:能看懂 C 语言、会用 PlatformIO 或 Keil 编译即可上手;调参阶段会接触到定点数和 FOC 概念,config.h的注释写得很细,docs/ 里也有电机参数表可对照。
Q:风险在哪?A:这是带电、带大电流、高速旋转的系统。首次通电前检查接线、避免短接红线(12/15V);调场削弱和电流上限时先架空轮子;电池低压保护阈值(3.37V/片)不要随意放宽,防止过放。
下一步
- 克隆仓库并把 ST-Link 接到主板 SWD 口,先编译默认变体验证刷写流程;
- 阅读项目 Wiki 的 Getting Started 与 Troubleshooting 两节,对照
docs/中的主板原理图核对引脚; - 从
VARIANT_USART起步,用Arduino/hoverserial/hoverserial.ino在电脑上验证串口控车,再切换到目标变体; - 遇到问题先到 Wiki 和社区(项目 Wiki 有完整索引)搜一遍,仍有疑问再提问;
- 有改进想法欢迎直接提 Pull Request,固件按 GPL v3 开源,所有人的贡献最终惠及整个社区。
【免费下载链接】hoverboard-firmware-hack-FOCWith Field Oriented Control (FOC)项目地址: https://gitcode.com/GitHub_Trending/ho/hoverboard-firmware-hack-FOC
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考