从零到一:ESP32平衡车硬件设计与PID调参实战
1. 硬件设计从PCB到焊接的避坑指南做平衡车最头疼的就是硬件部分我前后画了四版PCB才最终搞定。第一版上电直接炸电容的酸爽至今难忘——钽电容焊反芯片引脚画反火光一闪30块钱就打水漂了。这里分享几个关键经验主控板设计要点ESP32选型建议用WROOM-32模组自带天线还省空间TB6612电机驱动比L298N发热小支持1.2A持续电流MPU6050一定要远离电机和电源振动和电磁干扰会导致数据漂移电源部分建议用MP2307降压模块实测比AMS1117更稳定PCB踩坑实录第一版直插芯片的封装画反上电就冒烟教训务必用3D视图检查第二版电机驱动电路没加续流二极管PWM调高就烧MOS管第三版MPU6050I²C走线过长数据读取不稳定重要提示打板前先用万用表通断档检查所有GND是否连通我有次因为地线断裂调试了两天焊接时特别注意钽电容有极性白色标记对应正极TB6612的散热焊盘要充分上锡ESP32的EN引脚建议引出到按钮方便复位2. 核心元件选型与组装技巧电机选择带编码器的N20减速电机30:1减速比工作电压6-12V空载转速200RPM实测编码器分辨率12CPR够用更高分辨率会增加ESP32中断负担关键参数对比表元件推荐型号替代方案注意事项陀螺仪MPU6050BMI160需软件校准电池2S锂电18650电池组加保护板轮径65mm50-80mm越大越稳组装时有个骚操作用热熔胶固定MPU6050后再滴一滴704硅胶阻尼振动。我的小车抖动幅度直接从±5°降到±1°。3. 平衡原理与数学建模平衡车的本质是倒立摆控制。当车体前倾时车轮要加速前进来追重心后仰时则要后退。这个动态平衡过程可以用经典的控制方程描述角度误差 当前角度 - 平衡角度约-1.14° 控制量 Kp×角度误差 Kd×角速度实测发现两个关键点平衡角度不是绝对垂直的因为电池重量会导致机械中值偏移角速度数据比角度更重要微分项能有效抑制震荡4. 软件调试从陀螺仪校准到PID整定MPU6050校准void setup() { Wire.begin(21, 22); // ESP32的I²C引脚 mpu6050.begin(); mpu6050.calcGyroOffsets(true); // 自动校准 Serial.println(mpu6050.getAngleX()); // 验证角度 }PID调参三步法先调P比例项从Kp1开始每次增加5观察现象小车应快速回正但会轻微晃动最佳状态轻微超调后立刻回稳再调D微分项固定P值从Kd0.1开始效果判断高频抖动应明显减弱我的参数Kd0.3太大反而会引入噪声最后调I积分项保持PD不变Ki从0.01逐步增加作用消除静态误差比如总往一边偏警告积分饱和会导致剧烈抖动蓝牙遥控进阶技巧 在loop()中加入这行代码可以通过手机实时调整PIDif(SerialBT.available()){ char cmd SerialBT.read(); if(cmdp) kp 0.5; if(cmdm) kp - 0.5; }5. 整车联调与性能优化当硬件和基础软件都搞定后这几个优化让我的小车从能站变成站得稳软件滤波// 一阶低通滤波 filteredAngle 0.9 * filteredAngle 0.1 * newAngle;死区补偿if(PWM10 PWM-10) PWM0; // 消除电机死区动态限幅integrate constrain(integrate, -100,100); // 防积分饱和最终我的PID参数直立环Kp12.0, Ki0.7, Kd0.8速度环Kp0.5, Ki0.05转向环Kp1.2调参时遇到小车疯狂转圈八成是电机极性接反了。有个快速验证方法抬起小车用手向前倾斜观察车轮转向是否与倾倒方向一致。