news 2026/5/22 17:52:22

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再死记硬背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有三大特点值得关注:

  1. 全量输出:每次计算都基于从开始到当前的所有误差累积(积分项),这使得:

    • 系统能精确消除稳态误差
    • 但计算量大,对异常值敏感
  2. 参数敏感度对比

参数响应速度超调风险抗干扰性计算量
Kp↑↑↑↑↑
Ki↑↑↑↑↑↑↑
Kd↓↓↓↑↑↑
  1. 实战现象:当用手轻推运行中的小车时:
    • 如果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的独特优势体现在:

  1. 抗干扰性强:由于只关注最近几次误差变化,单个异常采样值不会造成输出剧烈波动
  2. 无积分饱和:不会因为长期误差累积导致控制量超出合理范围
  3. 手动/自动切换平滑:在需要人工干预的系统中,模式切换不会产生冲击

注意:增量式PID需要初始output值。通常可以先让电机以中等速度运行一段时间,再开启PID控制。

4. 参数整定实战技巧

调参是PID控制中最考验经验的部分。基于小车平台,我们总结了一套可视化调试方法:

步骤一:确定采样周期

  1. 先设置一个保守值(如50ms)
  2. 观察串口输出的速度波动情况
  3. 逐步缩短周期,直到速度曲线不再明显改善

步骤二:试凑法调参流程

  1. 先将Ki和Kd设为0,逐渐增大Kp直到小车出现轻微振荡
  2. 取此Kp值的50%作为初始值
  3. 引入Ki,从小值开始增加,直到稳态误差消除但不过调
  4. 最后加入Kd抑制超调

常见问题与对策:

  • 现象:小车走走停停,速度波动大

    • 可能原因:Kp过大或Ki过小
    • 解决:降低Kp或增大Ki
  • 现象:响应迟缓,加速无力

    • 可能原因:Kp过小或采样周期过长
    • 解决:增大Kp或缩短采样间隔
  • 现象:遇到障碍后恢复缓慢

    • 可能原因:Kd不足
    • 解决:适当增大Kd

5. 两种PID形式的对比与选型

通过实际测试,我们可以总结出位置式和增量式PID的适用场景:

位置式PID更适合:

  • 需要精确位置控制的场合(如机械臂)
  • 系统响应速度要求不高
  • 计算资源充足的平台

增量式PID更适合:

  • 速度控制等对实时性要求高的场景
  • 资源有限的嵌入式系统
  • 存在外部干扰的环境

性能对比实测数据(基于同一小车平台):

指标位置式PID增量式PID
达到稳态时间1.2s0.8s
超调量15%5%
抗干扰恢复时间0.5s0.2s
CPU占用率18%12%

在实际项目中,我更喜欢增量式PID的稳定性。特别是在电池供电的小车上,当电压逐渐下降时,增量式算法能更平滑地适应这种缓慢变化。而位置式PID则需要重新调整积分项限幅值才能达到相同效果。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/1 16:29:02

Scroll Reverser终极指南:让Mac触控板和鼠标滚动方向完美共存

Scroll Reverser终极指南:让Mac触控板和鼠标滚动方向完美共存 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 你是否在Mac上同时使用触控板和鼠标时感到困惑&#xf…

作者头像 李华
网站建设 2026/4/1 16:27:49

新手零基础入门:利用快马AI生成你的第一个可运行博客项目

作为一个刚接触编程的新手,想要自己搭建一个博客系统听起来像是个遥不可及的目标。传统的学习路径可能需要先掌握HTML、CSS、JavaScript,再学习后端语言和数据库,整个过程漫长而复杂。但最近我发现了一个特别适合新手的解决方案——利用InsCo…

作者头像 李华
网站建设 2026/4/1 16:27:48

NaViL-9B图文理解效果实测:文字提取+颜色分析+布局描述三合一

NaViL-9B图文理解效果实测:文字提取颜色分析布局描述三合一 1. 模型能力概览 NaViL-9B作为一款原生多模态大语言模型,在图文理解领域展现出独特优势。不同于传统视觉模型仅能完成单一任务,它实现了文字提取、颜色分析和布局描述的三合一能力…

作者头像 李华
网站建设 2026/4/1 16:27:12

Redis和 Redisson 集成踩坑日记

异常报错报错信息:关键报错:ERR Client sent AUTH, but no password is setRedis和 Redisson 集成,如果 Redis 没有设置密码,必须注释掉,不然Redisson就会主动发起验证spring:redis:host: 127.0.0.1port: 6379# passwo…

作者头像 李华
网站建设 2026/4/1 16:25:38

卡梅德生物技术快报|慢病毒质粒包装标准化流程与难转染细胞感染实践

在细胞与基因工程开发中,慢病毒质粒包装是实现外源基因高效递送、稳定表达的关键技术。针对马胚胎成纤维细胞等难转染原代细胞,传统方案存在效率低、稳定性差等痛点。本期卡梅德生物技术快报基于实验优化,输出慢病毒质粒包装标准化流程&#…

作者头像 李华