别再死记硬背PID公式了!用Arduino小车调参实战,带你搞懂位置式和增量式的区别

张开发
2026/4/6 14:20:12 15 分钟阅读

分享文章

别再死记硬背PID公式了!用Arduino小车调参实战,带你搞懂位置式和增量式的区别
用Arduino小车玩转PID控制位置式与增量式的实战对比PID控制算法听起来高大上但真正用起来却让人头疼——公式背了又忘参数调了又调小车还是走不直。今天我们不谈枯燥的数学推导就用手边的Arduino小车套件通过实际编码和调试直观感受位置式PID和增量式PID的区别。你会发现理解PID其实可以像玩游戏一样有趣。1. 准备工作搭建你的PID实验平台在开始PID算法实战前我们需要一个合适的实验平台。Arduino配合L298N电机驱动的小车是最佳选择成本低廉且易于搭建。所需材料清单Arduino UNO开发板L298N电机驱动模块带编码器的直流电机小车底盘9V电池组为电机供电USB数据线为Arduino供电和编程杜邦线若干接线时需特别注意电机的编码器输出需连接到Arduino的中断引脚通常为2和3号引脚以便准确测量轮速。L298N的使能端ENA和ENB应连接PWM引脚用于速度控制。// 基础电机控制代码框架 #define MOTOR_A_ENA 5 // PWM引脚 #define MOTOR_A_IN1 6 #define MOTOR_A_IN2 7 #define ENCODER_A 2 // 中断引脚 volatile long encoderPos 0; // 编码器计数 void setup() { pinMode(MOTOR_A_ENA, OUTPUT); pinMode(MOTOR_A_IN1, OUTPUT); pinMode(MOTOR_A_IN2, OUTPUT); attachInterrupt(digitalPinToInterrupt(ENCODER_A), updateEncoder, RISING); Serial.begin(9600); } void updateEncoder() { encoderPos; } void loop() { // 后续将在此添加PID控制代码 }提示编码器安装质量直接影响速度测量精度。确保编码器盘与电机轴同轴度高且传感器间隙适当通常1-2mm。2. 位置式PID直观但需谨慎位置式PID是最经典的实现方式它直接计算系统当前需要的控制量输出。让我们先实现一个基础版本// 位置式PID实现 float Kp 1.0, Ki 0.1, Kd 0.01; float error, lastError, integral, derivative; int setpoint 100; // 目标速度编码器计数/采样周期 void positionPID(float currentSpeed) { error setpoint - currentSpeed; integral error; derivative error - lastError; float output Kp * error Ki * integral Kd * derivative; lastError error; // 限制输出范围 output constrain(output, -255, 255); analogWrite(MOTOR_A_ENA, abs(output)); digitalWrite(MOTOR_A_IN1, output 0 ? HIGH : LOW); digitalWrite(MOTOR_A_IN2, output 0 ? LOW : HIGH); }位置式PID有三大特点值得关注全量输出每次计算都基于从开始到当前的所有误差累积积分项这使得系统能精确消除稳态误差但计算量大对异常值敏感参数敏感度对比参数响应速度超调风险抗干扰性计算量Kp↑↑↑↑↑↑低Ki↑↑↑↑↑↑↑高Kd↓↓↓↓↑↑↑中实战现象当用手轻推运行中的小车时如果Kp过大小车会剧烈抖动后恢复如果Ki过大小车会出现持续振荡适当Kd能显著减少这种干扰的影响3. 增量式PID稳定且计算高效增量式PID只计算控制量的变化而非绝对值。这种实现方式更适合实时性要求高的场景// 增量式PID实现 float lastError1, lastError2; // 需要保存前两次误差 void incrementalPID(float currentSpeed) { error setpoint - currentSpeed; float delta Kp*(error - lastError1) Ki*error Kd*(error - 2*lastError1 lastError2); lastError2 lastError1; lastError1 error; // 注意需要维护一个全局变量output作为基准 output delta; output constrain(output, -255, 255); analogWrite(MOTOR_A_ENA, abs(output)); digitalWrite(MOTOR_A_IN1, output 0 ? HIGH : LOW); digitalWrite(MOTOR_A_IN2, output 0 ? LOW : HIGH); }增量式PID的独特优势体现在抗干扰性强由于只关注最近几次误差变化单个异常采样值不会造成输出剧烈波动无积分饱和不会因为长期误差累积导致控制量超出合理范围手动/自动切换平滑在需要人工干预的系统中模式切换不会产生冲击注意增量式PID需要初始output值。通常可以先让电机以中等速度运行一段时间再开启PID控制。4. 参数整定实战技巧调参是PID控制中最考验经验的部分。基于小车平台我们总结了一套可视化调试方法步骤一确定采样周期先设置一个保守值如50ms观察串口输出的速度波动情况逐步缩短周期直到速度曲线不再明显改善步骤二试凑法调参流程先将Ki和Kd设为0逐渐增大Kp直到小车出现轻微振荡取此Kp值的50%作为初始值引入Ki从小值开始增加直到稳态误差消除但不过调最后加入Kd抑制超调常见问题与对策现象小车走走停停速度波动大可能原因Kp过大或Ki过小解决降低Kp或增大Ki现象响应迟缓加速无力可能原因Kp过小或采样周期过长解决增大Kp或缩短采样间隔现象遇到障碍后恢复缓慢可能原因Kd不足解决适当增大Kd5. 两种PID形式的对比与选型通过实际测试我们可以总结出位置式和增量式PID的适用场景位置式PID更适合需要精确位置控制的场合如机械臂系统响应速度要求不高计算资源充足的平台增量式PID更适合速度控制等对实时性要求高的场景资源有限的嵌入式系统存在外部干扰的环境性能对比实测数据基于同一小车平台指标位置式PID增量式PID达到稳态时间1.2s0.8s超调量15%5%抗干扰恢复时间0.5s0.2sCPU占用率18%12%在实际项目中我更喜欢增量式PID的稳定性。特别是在电池供电的小车上当电压逐渐下降时增量式算法能更平滑地适应这种缓慢变化。而位置式PID则需要重新调整积分项限幅值才能达到相同效果。

更多文章