)
1. PID调参前的准备工作调参前需要确保硬件和基础代码已经就绪。我遇到过不少同学直接开始调PID结果发现是电机极性接反或者MPU6050数据异常导致的假故障。这里分享几个必查项机械中值校准将小车放在绝对水平面上用OLED显示MPU6050的俯仰角Pitch这个值就是机械中值。我的经验值是-3.2°你的可能不同电机极性测试分别给左右电机正电压观察车轮转向。正确的转向应该是正电压对应车轮向前转编码器值增加传感器数据验证用串口打印以下数据printf(Pitch:%.1f GyroY:%.1f EncL:%d EncR:%d\n, Pitch, gyroy, Read_Speed(2), Read_Speed(4));当车体前倾时Pitch应增大gyroY为正值车轮向前时编码器值为正注意建议先用胶带固定小车防止调试时突然失控摔倒。我当年第一个平衡车就是在调试时从桌上飞出去电机轴都摔弯了...2. 直立环调试PD控制直立环是平衡车的核心采用PD控制。公式很简单直立环输出 Kp×角度偏差 Kd×角速度2.1 比例系数Kp调试初始值设定根据经验Kp初始值车身重量(g)×车轮半径(cm)×0.3。我的小车重300g轮径6.5cm所以Kp300×6.5×0.3≈600调试方法先将Kd设为0手持小车倾斜10度左右突然放手观察现象Kp过小小车缓慢倒下像慢动作Kp适中小车快速回正但有轻微振荡这是我们想要的Kp过大剧烈振荡甚至跳舞实测技巧用手机慢动作录像观察振荡次数。理想状态是2-3次振荡后稳定2.2 微分系数Kd调试Kd用于抑制振荡相当于阻尼力。初始值KdKp/10。我的Kp600所以Kd初始值60调试现象Kd过小小车持续摆动欠阻尼Kd适中快速稳定无振荡临界阻尼Kd过大反应迟钝像老年痴呆特殊技巧用指尖轻敲车身好的参数下小车应该像不倒翁一样快速回正3. 速度环调试PI控制速度环用于消除静态误差防止小车缓慢移动。公式速度环输出 Kp×速度偏差 Ki×速度偏差积分3.1 比例系数Kp调试初始值Kp直立环Kp×0.1。我的直立环Kp600所以速度环Kp60调试方法给小车一个轻微推力观察现象Kp过小推力导致持续移动Kp适中移动1-2cm后停止Kp过大出现抽搐现象3.2 积分系数Ki调试Ki用于消除静态误差但容易导致积分饱和。初始值KiKp/200。我的Kp60所以Ki0.3调试技巧在代码中加入积分限幅if(Encoder_S 10000) Encoder_S 10000; if(Encoder_S -10000) Encoder_S -10000;观察长时间运行后小车是否出现自发运动4. 转向环调试P控制转向环相对简单主要控制Z轴角速度转向环输出 Kp×Z轴角速度初始值Kp直立环Kp×0.05。我的Kp600转向环Kp30调试方法手持小车悬空手动旋转观察车轮转向是否与旋转方向相反产生抵抗旋转的力在地面测试时好的参数下小车应该能保持直线行驶5. 常见问题排查5.1 小车单方向跑偏可能原因机械中值不准重新校准电机输出不对称在Load函数中加入补偿值地面不平换个场地测试5.2 高频抖动解决方案降低Kd值每次减5检查MPU6050的DLPF设置推荐配置为5HzMPU6050_SetDLPF(MPU6050_DLPF_BW_5);5.3 响应迟钝优化建议提高控制频率建议200-500Hz检查MPU6050数据更新时间DMP输出频率建议≥100Hz调试过程中建议保存多组参数备用。我的习惯是用Excel记录参数和现象参数组Kp直立Kd直立Kp速度Ki速度Kp转向现象描述组160060600.330轻微振荡组255065500.225响应略慢但稳定最后分享一个实用技巧用蓝牙模块实时调参。在代码中添加if(USART_RX_BUF[0]P) Vertical_Kp atof(USART_RX_BUF[1]);这样通过手机串口APP发送P550就能实时修改Kp值