STM32两轮平衡车项目详解:原理图、PCB布局与程序代码全攻略

张开发
2026/4/17 20:42:43 15 分钟阅读

分享文章

STM32两轮平衡车项目详解:原理图、PCB布局与程序代码全攻略
stm32两轮平衡车项目资料 两轮平衡车原理图PCB程序两轮平衡车这玩意儿看起来玄乎其实玩明白了也就那么回事。今天咱们直接扒开这个STM32平衡车的底裤从硬件到代码全给它拆明白了。手头正好有完整的原理图、PCB和程序源码这就开整硬件部分的核心是MPU6050和TB6612电机驱动。原理图里有个细节挺有意思——MPU6050的IIC接口直接怼到了STM32F103的PB6/PB7但实际焊板子的时候记得在传感器下面抹点焊锡膏当散热。PCB布局最关键的是电机驱动部分要走大电流我这版用了2oz铜厚电源线直接30mil宽度起步不然电机一启动电压能被拉低到亲妈都不认识。说到代码先看这个结构体typedef struct { float Target; // 目标角度 float Kp,Ki,Kd; // PID参数 float Err,LastErr,PrevErr; // 当前/上次/上上次误差 float Output; // 输出值 } PID;这可不是普通的PID得做成位置式微分先行。为啥因为直立环需要快速响应实测普通的增量式PID反应慢半拍车直接变跷跷板。调参的时候先把Ki设0Kp从3.0开始往上加直到车能勉强站稳但疯狂抖动这时候上Kd来镇压。电机控制有个骚操作void SetMotorPWM(int moto1,int moto2) { if(moto10){ MOTOR1_A1; MOTOR1_B0; __HAL_TIM_SET_COMPARE(htim3,TIM_CHANNEL_1,moto1); } else { MOTOR1_A0; MOTOR1_B1; __HAL_TIM_SET_COMPARE(htim3,TIM_CHANNEL_1,-moto1); } // 另一个电机同理... }注意这里的PWM频率不能乱设推荐18-20kHz。太高了MOS管发热严重太低了你就能听到电机发出销魂的啸叫声。实测用TIM3的CH1/CH2输出预分频设置72分频ARR设成800就刚刚好。stm32两轮平衡车项目资料 两轮平衡车原理图PCB程序滤波算法这块用的是互补滤波代码比卡尔曼简单多了void AngleCalculate(void) { // 读取陀螺仪和加速度计原始数据 MPU_Get_Accelerometer(ax,ay,az); MPU_Get_Gyroscope(gx,gy,gz); // 加速度计换算角度 float Accel_angle atan2(ay, az) * 57.29578f; // 互补滤波 Angle 0.98*(Angle gx*0.000532f) 0.02*Accel_angle; }这个0.98和0.02的权重参数不是玄学实测发现当车体剧烈晃动时陀螺仪积分漂移会被加速度计数据拉回来。要是发现车体有延迟感可以把加速度计的权重提高到0.05。最后说个坑电源管理一定要做掉电检测我在主循环里加了这么个玩意if(__HAL_TIM_GET_COUNTER(htim4) 500){ Motor_Stop(); while(1) Buzzer_Alarm(); // 卡死循环疯狂报警 }原理是用个定时器当看门狗一旦主程序卡死导致喂狗超时立马切断电机并鬼叫报警。别问我是怎么想到的问就是曾经烧过两个电机驱动...源码里还有个speed_ctrl.c文件藏着速度环的秘密——其实是用编码器脉冲数换算成车速然后通过改变目标角度来实现前进后退。这个环要套在直立环外面响应速度得比角度环慢10倍左右不然两个环会打架。整机装好后别急着上电先拿绳子把车绑在栏杆上测试。第一次启动那叫一个刺激电机能带着整车蹦迪。这时候该掏出土耳其进行曲当BGM边哼边调参保准调车效率提升200%...代码和工程文件老规矩在GitHub链接见文末

更多文章