电赛:车载平衡控制系统
电赛:车载平衡控制系统


项目定位:2026 年全国大学生电子设计竞赛 H 题。以 STM32 + FreeRTOS 为主控、Jetson Nano 为视觉上位机,在车辆循迹行驶的同时完成摆杆上钢球的实时平衡控制。我负责 MCU 端软件开发与 PCB 设计。
项目架构
MCU 端软件没有用「裸机 + 一堆全局函数」的写法,而是复用了之前沉淀的 《单片机工程架构》 一文中的 oop-in-c 分层架构:
- HAL 层:把 STM32 HAL/LL 库函数统一封装成自己的接口,换 MCU 时只需改这一层;
- Device 层:以「类 + 对象」组织外设,用 ops 结构体注册每个外设的操作函数;
- Board 层:绑定具体引脚与板级配置,暴露对象地址;
- Facade / App 层:面向业务做预封装,最终在任务里按业务调用对象操作。
这样红外传感器、正交编码器、AT8236 驱动、闭环步进电机等外设都被抽象成可替换的对象,循迹、速度环、平衡环这些业务代码不再直接依赖具体引脚和库函数,新增外设或整体移植到其他 MCU 都更省事。
控制难点
- 底盘行驶与钢球平衡是两条相互耦合的回路——车体的加减速与转向会持续扰动摆杆上的钢球,而钢球位置又需要靠摆杆角度去补偿。
- 小钢球的滑动摩擦力极小,最大摩擦力难以使用模型求出,会导致哪怕是同一角度,我们也不能保证球体一定会冲破最大静摩擦力。在实际工程中,我们发现Kp在这个控制中几乎没有作用。我们通过Ki不断积分误差值,以对抗静摩擦力的作用。
- 钢球的定位只能依赖视觉,同时硬件受限,无法精准求出钢球运行速度,可以实时反馈给下位机钢球位置。也就是说,我们下位机必须依靠位置间接地控制速度。Kd以及阻尼系数用来提前为钢球做减速运动,直至其在目标点停止。
实现要点
- 红外循迹与滤波:基于八路红外传感器与加权误差算法计算角度偏差,结合低通滤波抑制数据突变,提高角度的平顺性。
- 底盘速度闭环:基于 AT8236 电机驱动与正交编码器反馈构建串级 PID 闭环,实现电机调速与稳态控制。
- 视觉反馈链路:上位机部署 YOLOv8,在不同光照条件下以约 30 FPS 识别钢球,实时输出位置并估计速度;MCU 端通过 UART 中断接收并解析位置数据,经低通滤波与速度估计后,为平衡控制提供稳定可用的反馈量。
- 钢球平衡控制:以位置环 PID 融合速度阻尼计算摆杆目标角度,驱动闭环步进电机执行角度调节,形成完整闭环控制链路,实现钢球在 2 s 之内将误差控制在 ≤ ±0.5 cm。
- 调试与可观测性:使用 CMake + DAPLink + OpenOCD 搭建 GDB MCP Server,让 AI Agent 规范化参与到 MCU 的 Debug 中;同时支持在上位机进行 PID 参数在线整定及关键变量波形观测,便于快速定位控制振荡、数据跳变与执行器响应问题。
技术栈
STM32 · FreeRTOS · 串级 PID · YOLOv8 · UART · 闭环步进电机 · 嘉立创 EDA
仓库:电赛
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Cube Diary!
