平衡小车car资源包:STM32+MPU6050三环PID完整工程解析

发布时间:2026/10/17 3:56:28
平衡小车car资源包:STM32+MPU6050三环PID完整工程解析 简介平衡小车自主直立与运动控制学习资料包面向自动控制初学者、嵌入式开发人员及科创竞赛爱好者可用于研究双轮自平衡系统的姿态解算、多传感器数据融合与闭环控制。压缩包内共1420个文件其中C源码439个、头文件379个文本说明121个另有工程配置、链接脚本、汇编启动代码、编译中间文件及少量文档图片总体积36.17MB目录结构清晰便于按功能模块对照阅读。目前已有1746人学习下载。资料覆盖从底层传感器驱动到上层控制算法的完整链路涉及陀螺仪与加速度计数据读取、滤波处理、PID参数整定、电机驱动等关键环节同时提供完整工程与编译配置可帮助读者复现项目理解状态观测器在平衡控制中的实际用法并为移植到其他主控平台提供改造基础。对于准备课程设计或智能车竞赛的读者可从这份资源快速搭建实验环境结合源码梳理硬件连接与控制逻辑缩短从理论到真机调试的距离。1. 平衡小车car资源包一套能立住、能跑通、能改的完整工程把平衡小车从手里放下来的那一刻是最容易怀疑人生的它要么朝一个方向冲出去撞墙要么原地高频抖动要么干脆躺平。这个项目真正的难点不在接线而在让三个PID环同时工作还不互相打架。这份资源包是一套完整的平衡小车car工程STM32主控、MPU6050姿态传感器、带编码器的直流减速电机、蓝牙遥控和OLED显示全串在一条链路里从硬件接线到控制算法都给你铺好了。它适合正在做课设、被直立环调参折磨的学生也适合想用最短路径摸一遍惯导与闭环控制完整链路的一线开发。按工程里的接线和参数配置照着烧录、照着调车就能自己立住。下面从硬件选型讲到踩坑记录最后给几条改造方向。2. 硬件与架构从传感器选型到三环控制回路的信号流2.1 硬件分层传感器层、执行层与控制层怎么分工拆这套资源的第一步是先把硬件链路画清楚。平衡车和普通小车最大的区别是它没有静态平衡点车身一倾斜就必须靠电机反向补偿所以整个硬件其实就是围绕“测倾角—算补偿—输出力矩”这条闭环来搭的。常见做法是分三层传感器层负责感知姿态控制层负责运算执行层负责输出力矩。传感器层用MPU6050六轴惯性传感器I2C接口挂到主控总线上输出三轴加速度和三轴角速度。加速度计用来算静态倾角陀螺仪用来获得瞬时角速度两者互补正好为后面的姿态解算提供原始数据。需要注意MPU6050的供电是3.3V和主控电平一致接线时SCL、SDA别接反否则读回的全是乱码。控制层是主流的STM32F103系列Cortex-M3内核72MHz主频定时器资源多生成多路PWM很方便这对双电机差速控制来说属于刚需资源。资源包里主控的PA口和PB口管脚分配都写在头文件里换芯片时主要改引脚映射和定时器通道。执行层是带霍尔编码器的直流减速电机减速比常见1:30配合TB6612双路电机驱动输出PWM同时控制方向和占空比。电源部分在平衡车里最容易被忽略。2S锂电池7.4V供电经过降压模块分别给主控和传感器供电。编码器虽然只消耗小电流但供电纹波大会导致测速跳变一般会在编码器电源脚并一个10uF陶瓷电容低成本但很有效。2.2 软件架构中断时基与控制周期的分配硬件确定后代码层面的核心问题是节奏控制算法多久跑一次传感器多久读一次PWM多久更新一次。这套工程的软件结构是典型的前后台架构一个定时器中断提供时基主循环里跑控制任务。控制周期直接决定平衡效果。常见做法是直立环跑1ms速度环和转向环跑5ms也就是主循环里用一个计数器分频累加到5次才执行一次速度环。这里的依据是直立环需要高刷新率来抑制倾角变化而速度环反馈的是电机转速本身有编码器采样延迟没必要跑那么快跑太快反而容易引入噪声。定时器中断里只做一件事置一个标志位并累加时基计数。真正的姿态读取、PID计算、PWM输出全部放在主循环里。这样设计的好处是控制任务的耗时不会阻塞中断中断只负责节奏不会因为传感器I2C读取出问题而丢时基。如果某个I2C读操作卡住最多是主循环卡住定时器中断仍能维持系统心跳。2.3 信号流向从角速度到PWM的完整链路把整个信号流从传感器一路捋到电机就能看到完整闭环了。MPU6050输出原始加速度和角速度经过互补滤波得到车身倾角倾角进入直立PD环算出补偿力矩编码器测出的轮速进入速度PI环输出一个角度修正量叠加到目标倾角上转向环根据你的遥控目标或角度偏差给出差速量。最终左右电机的PWM就是这三路输出的组合。这条链路上最容易翻车的是方向约定。加速度计的正方向、陀螺仪角速度的正方向、电机正转时编码器的计数方向、PWM输出极性这四者必须一致。资源包的头文件里有角度方向和电机方向的宏定义调参前先确认这些定义和你的实际接线一致否则后面全是白调。太多人花一晚上调PID结果发现是陀螺仪符号写反了这种玄学问题往往都在方向约定上。3. 核心代码拆解姿态解算与三环PID的实现细节3.1 姿态解算互补滤波融合加速度计与陀螺仪平衡车的第一公里是拿到一个可信的车身倾角。陀螺仪短时间积分准确但长时间会漂移加速度计长时间稳定但瞬时值充满振动噪声。这套资源用的是互补滤波把两者按比例融合。核心代码很简洁#define DT 0.001f // 控制周期 1ms #define ACC_WEIGHT 0.98f // 陀螺仪权重 float angle_balance 0.0f; // 融合后的车身倾角 float gyro_y 0.0f; // 俯仰角速度 void Get_Angle(void) { int16_t acc_x, acc_y, acc_z; float acc_angle; MPU6050_Read_Raw(acc_x, acc_y, acc_z); // I2C读取原始数据 acc_angle atan2f((float)acc_y, (float)acc_z) * 57.2958f; gyro_y (float)gyro_raw / 16.4f; // ±2000°/s量程灵敏度 angle_balance ACC_WEIGHT * (angle_balance gyro_y * DT) (1.0f - ACC_WEIGHT) * acc_angle; }这段代码的逻辑是先用加速度计的Y轴和Z轴分量通过atan2算出倾角atan2的好处是能覆盖±180度且不需要额外判断象限。陀螺仪原始值除以16.4是因为量程±2000°/s时16.4是每LBS对应的角速度值。融合公式里(angle_balance gyro_y * DT)是陀螺仪积分的结果短时间可信acc_angle是加速度计的瞬时观测用来长期校正积分漂移。0.98和0.02的比例决定了信任程度如果车身振动大就把0.98调小一点让滤波更平滑换取响应变慢。3.2 三环PID直立环、速度环、转向环怎么合成姿态有了接下来是控制。平衡车和四轴不一样它没有独立的姿态环而是把直立、速度、转向三个环的输出叠加成最终PWM。直立环是核心本质是一个PD控制器比例项把倾角拉回零微分项阻尼掉振荡float Kp_balance 150.0f; // 直立环比例 float Kd_balance 1.8f; // 直立环微分 int16_t Balance_PID(float angle, float gyro) { return (int16_t)(Kp_balance * angle Kd_balance * gyro); }注意这里的微分项直接用了陀螺仪输出而不是对角度做差分。两者效果近似但陀螺仪本身就是角速度信噪比远高于角度差分而且不存在差分运算放大高频噪声的问题。Kp调到多少合适取决于车身重量分布和电机力矩资源包给的150只是一个起点换电池、换底盘后必须重调。速度环用来防止小车往一个方向慢慢溜走。它把编码器的轮速积分成位移输出一个角度修正值加到直立环的目标倾角上float speed_target 0.0f; // 目标速度遥控时改成非零值 float speed_integral 0.0f; float Kp_speed 20.0f; float Ki_speed 0.5f; int16_t Speed_PID(int16_t speed_now) { int16_t error (int16_t)(speed_target - speed_now); speed_integral error; speed_integral clamp(speed_integral, -500, 500); // 限幅防积分饱和 return (int16_t)(Kp_speed * error Ki_speed * speed_integral); }速度环的输出不是直接怼到电机上而是作为直立环的目标角。这句是整个平衡车代码的精髓车想要往前走不是直接给电机正转而是让车身往前倾斜一点点靠直立环去追这个倾斜角车自然就往前走。速度环的目标speed_target在静止平衡时是0做遥控功能时把串口收到的速度值填进来就能控制前后移动。转向环则简单得多一个P控制器输出左右差速float Kp_turn 3.0f; int16_t Turn_PID(int16_t turn_target) { return (int16_t)(Kp_turn * turn_target); }最终合成逻辑是左电机PWM等于直立环输出减去速度环输出加上转向环输出右电机PWM等于直立环输出减去速度环输出再减去转向环输出。减号的意义是差速转向转向环为正时左快右慢车身右转。三个环的方向如果有一个反了整套控制就全乱这也是后面避坑章节里最常见的翻车点。3.3 PWM输出与电机换向PID算出的输出是带符号的整型正负代表方向数值代表占空比。驱动芯片TB6612需要方向信号和PWM信号配合输出。资源包里封装了一个电机设置函数#define PWM_MAX 7200 // 定时器ARR值对应约16kHz PWM频率 void Motor_Set(int16_t pwm_left, int16_t pwm_right) { uint8_t left_dir pwm_left 0 ? 1 : 0; uint8_t right_dir pwm_right 0 ? 1 : 0; HAL_GPIO_WritePin(AIN1_GPIO_Port, AIN1_Pin, left_dir); HAL_GPIO_WritePin(AIN2_GPIO_Port, AIN2_Pin, !left_dir); HAL_GPIO_WritePin(BIN1_GPIO_Port, BIN1_Pin, right_dir); HAL_GPIO_WritePin(BIN2_GPIO_Port, BIN2_Pin, !right_dir); __HAL_TIM_SET_COMPARE(htim1, TIM_CHANNEL_1, abs(pwm_left)); __HAL_TIM_SET_COMPARE(htim1, TIM_CHANNEL_2, abs(pwm_right)); }AIN1与AIN2的逻辑组合决定电机转向PWM比较值决定速度。这里有一个隐藏细节PID输出不允许出现负的PWM比较值所以必须先取绝对值再写进定时器否则会写成一个很大的数导致电机全速猛转。PWM_MAX取7200是因为定时器ARR设成7200配合72MHz主频得到约16kHz开关频率这已经超出人耳可听范围。如果频率设成几百赫兹电机就会发出刺耳的尖叫声那基本是PWM频率配置错了。PWM频率、定时器分频、ARR值这三个参数都集中在定时器初始化里改的时候注意三处联动ARR值、分频系数和Motor_Set里的PWM_MAX宏。三处不一致输出就会莫名其妙地成比例缩放。4. 运行与调参从工程烧录到小车直立的完整路径4.1 工程目录结构这套代码的文件组织方式拿到资源解压后是一个完整的Keil工程目录。典型的平衡车工程会把驱动外设的代码和业务逻辑分开目录一般长这样Car/ ├── USER/ # main.c 中断入口文件 ├── HARDWARE/ # mpu6050.c / motor.c / oled.c / bluetooth.c ├── SYSTEM/ # 延时与串口驱动 ├── CORE/ # 启动文件与内核寄存器定义 ├── bsp/ # 定时器与GPIO初始化 └── OBJ/ # 编译输出烧录hex在这里main.c里只做三件事初始化外设、开定时器中断、进主循环调用控制任务。所有硬件驱动都放在HARDWARE目录下每个模块一个.c和一个.h接口尽量简单比如MPU6050模块只暴露Get_Angle和Get_Gyro两个函数电机模块只暴露Motor_Set。这样改代码时不需要在main.c里翻来翻去。4.2 编译烧录从Keil到ST-Link的完整操作烧录用的是ST-Link的SWD四线接口SWDIO、SWCLK、GND、3.3V。接线完成后在Keil里选好调试器然后在Flash Download选项卡里勾选Reset and Run这样烧录完会自动复位运行不用每次手动按复位键。串口调参是这套工程里最常用到的能力。资源包默认配置了UART1波特率115200在main.c主循环里周期性发送角度、PWM输出和三个环的当前值。用任意串口助手打开能看到类似这样的输出angle:0.53 gyro:-12.4 balance_out:65 speed_out:-3 turn_out:0先看角度和陀螺仪数值。用手把车身掰正角度应该在0附近迅速前倾再回正陀螺仪应该有正负两个方向的突变。这两个数据正常说明传感器链路是通的再往下调PID才有意义。4.3 调参顺序先直立环再速度环最后转向环调参顺序在整个平衡车项目里决定了效率。正确顺序是把速度环和转向环先禁用单独调直立环。具体操作是先把速度环输出设为0只让直立环工作然后从上电开始逐步加大Kp。Kp很小时车身会往一边慢慢倒下电机几乎没有反应Kp增大到某个临界值车身开始能短暂回正但会来回摆动继续增大高频振荡越来越剧烈发出嗡嗡声。当Kp大到车身持续高频抖动时加入Kd抖动会明显被压制。典型参数起点可以看这张表参数初始值调整方向Kp_balance120-180太小会倒太大会抖Kd_balance1.0-3.0太大车身发僵Kp_speed10-30太大起步猛冲Ki_speed0.2-1.0太大低速震荡Kp_turn2-5太大转向发飘直立环稳定后再逐步放开速度环。判断速度环方向是否正确的方法是用手推一下车身如果小车往推的方向加速冲过去说明速度环方向反了需要把编码器两根线对调或把速度环输出取反。速度环正确时车被推一下会后退一点然后回到原位这个“回位”动作就是速度环在起作用。调参时看波形比看数值高效得多。用串口助手的虚拟示波器功能同时监看角度和直立环输出观察阻尼是否合适。调参过程中不要一次改多个参数每改一个就重新抓一次波形养成记录参数的习惯改坏了才知道回到哪一版。5. 避坑手册平衡车调试中最常见的五个问题5.1 电机不动但代码在跑现象串口有数据输出角度也在正常变化但两个电机完全没反应。 原因九成是TB6612的STBY引脚没有拉高。STBY是待机控制脚低电平时驱动芯片整个休眠PWM输入再正常也不会输出。 解决确认主控GPIO对STBY的初始化把它配置为推挽输出并拉高。另外检查PWM通道是否正确映射到电机驱动芯片的PWMA和PWMB引脚定时器通道号写错也会导致没有输出。5.2 一上电就往一个方向猛冲现象刚上电车身还没放稳电机直接以最大占空比猛转车瞬间窜出去。 原因这是平衡车调参最经典的坑几乎都是方向约定不一致。陀螺仪方向或者加速度计方向反了控制系统把“向前倒”识别成“向后倒”于是输出反而加速了倾倒。 解决先把角度方向验证一遍——用手让车身向前倾斜看串口打印的角度是正还是负如果方向不对在MPU6050驱动里把对应轴取反。同理验证电机方向把电机PWM设为一个固定正值看车轮转向是否与代码预期一致。四个方向全部对齐后再接线调参。5.3 车身高频抖动现象车能立住但站在旁边能看到车身以很高的频率微微颤抖同时电机温度上升很快。 原因直立环的Kp太大或者机械结构重心偏高系统进入临界振荡状态。重心越高稳定裕度越小同样的Kp在小车上正常换个高重心底盘就会抖。 解决先把Kp降到能稳住的最低值再加入适量Kd。如果还抖检查控制周期确保直立环确实是1ms跑一次。如果主循环里塞了OLED刷新或蓝牙解析导致周期变长PID参数会整体失灵。5.4 电池电压变化后参数失效现象满电时车很稳玩十几分钟后开始频繁点头甚至彻底倒下去。 原因锂电池电压从8.4V降到7V电机能输出的峰值力矩明显下降原来的PID参数是建立在满电压力矩上的。 解决一个方案是把电源做稳压让电机驱动供电保持在稳定电压。更实用的方案是在代码里用ADC实时采样电池电压把它作为PID输出的补偿系数。电压低时适当降低速度环积分强度避免积分饱和把直立环输出顶到限幅。5.5 蓝牙连接不上现象手机搜索不到蓝牙模块或者连上后丢包严重。 原因蓝牙模块是3.3V供电模块的RXD引脚不能直接接5V串口。如果主控和模块电平不匹配轻则搜索不到重则烧模块。数据丢包往往是波特率不一致主控串口配了115200蓝牙默认却是9600。 解决先短接蓝牙模块的EN引脚进入AT模式用串口助手把波特率设置成和主控一致再检查RXD和TXD是否交叉连接最后确认主控与蓝牙共地。这三点全对齐蓝牙基本就不会出问题。6. 二次开发从直立到遥控再到视觉跟随的改造路径6.1 先改遥控把速度环目标值变成串口数据最值得做的第一个改造是给小车加遥控。实现方法很简单速度环目标值speed_target原本是常量0把它改成全局变量在主循环里解析串口数据并赋值即可。收到前进指令就赋正值收到后退就赋负值转向环的目标值同理。改完这一处车就能从“原地直立”变成“可以开走”。验证方法很简单先开环测试油门方向再闭环验证速度环方向方向无误后遥控功能就通了。6.2 再做视觉跟随用目标角度代替人工指令更进一步的做法是加视觉跟随。常见思路是接一个摄像头识别前方目标把目标在画面中的水平偏差映射成转向环目标值把距离偏差映射成速度环目标值。代码层面完全复用三环结构只需要在控制循环前面加一个视觉回调函数输出两个目标值。调试时的技巧是先让车静止只验证转向跟随再做运动跟随不要一上来就全链路调参。这套工程的价值在于三环结构清晰每个环的入口就是一个目标值改目标值就是加新功能。我现在每拿到一个平衡车项目都会强制先走一遍方向验证——电机方向、编码器方向、陀螺仪方向、加速度计方向四者全部确认后再动手调PID。这个习惯是从一次通宵调参后彻底倒车学来的从那以后所有闭环项目我都先查方向再调参。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询