开环控制

开环控制,全称开环控制系统(Open Loop Control System),又称为无反馈系统。即系统的输入可以影响输出,但是 输入不受输出影响 的系统。输入到输出的信号是单向传递的。
PID控制理论 - 图1
以下为生活中的例子:

控制系统 输入量 控制器 受控对象 输出量
风扇调速 设置档位 控制电路 风扇电机 风扇转速
红外感应门 人体热辐射 控制电路 自动门电机 门打开
洗衣机 设置洗衣时间 控制电路 水阀&电机 洁净衣服
电饭煲 电源开关 控制电路 锅底加热器 锅内温度
水箱注水 水龙头开关 进水阀门 水流 水箱水位

闭环控制

闭环控制,全称闭环控制系统(Closed Loop Control System):系统的输出可以通过 反馈回路 对输入造成影响,进而影响控制过程的系统。

PID控制理论 - 图2
我们以变频空调为例,我们最常见的就是温度的控制:

我们给定设定目标温度为 25摄氏度,此时控制器将之转换成空调电机(受控对象)所需PWM方波数量(控制量);
空调电机接收到信号开始转动,但是由于外界环境的不可控,往往结果温度也就是 输出量 不能准确等于目标设定温度,要么过高,要么过低;
此时,空调内部的温度计(传感器)收集到实际的外界温度 作为 反馈量 ;
求和节点将 误差信号 = 输入量 - 反馈量 作为 控制器 的输入(可用使用多种算法)
不断循环 2-4 此过程,以保证 输出量 可以接近并等于 输入量
总结来说,闭环控制系统比开环控制系统多了 传感器(反馈装置) 和 比较器 (求和节点),两个装备分别用于收集数据,利用收集到的数据。

同样的,我们可以给为电饭煲加个 温度传感器,为水箱加个 水位传感器(浮球),将这些开环系统转成闭环系统

常见闭环控制系统场景:

  • 车道线校正
  • 车速控制
  • 四轴飞行器高度控制
  • 变频空调温控
  • 锅炉温控

    PID控制

    介绍

    PID(Proportional-Integral-Derivative)控制器是一种广泛应用于工程领域的控制算法,它包含三个主要部分:比例(P)、积分(I)和微分(D)。通过调整这三个部分来使系统的实际输出更接近期望输出。
  1. 比例(P)

比例控制根据误差(期望输出与实际输出之差)的大小来调整控制量。误差越大,控制量越大;误差越小,控制量越小。比例控制有助于快速减小误差,但可能导致稳态误差(静态误差)。

  1. 积分(I)

积分控制对误差进行积分,累积误差值。这有助于消除稳态误差,提高系统的精确度。但积分环节可能导致系统响应过慢和超调(当实际输出超过期望输出时)。

  1. 微分(D)

微分控制根据误差变化的速度来调整控制量。微分环节有助于减小超调现象,提高系统响应速度和稳定性。

实际应用中,通过调整PID控制器中的比例、积分和微分系数,可以使系统在不同场景下达到更好的控制效果。PID控制器被广泛应用于各种领域,如工业过程控制、航天器姿态控制、机器人运动控制等。

在实际运用中我们常用位置式PID和增量式PID,是两种不同的PID控制器实现方式。这两种方法都能实现PID控制的目标,但它们的计算方法和实际应用中的性能有所不同。

两者的主要区别在于计算方法:位置式PID直接根据误差值计算控制量,而增量式PID根据误差的变化计算控制量的变化。在实际应用中,增量式PID的性能通常更稳定,因为它可以避免积分饱和现象。此外,增量式PID在离散系统中更容易实现。然而,增量式PID对系统的采样时间和计算精度要求较高。在选择具体的实现方法时,需要根据实际应用场景和系统需求来权衡。

PID分类

位置式PID

位置式PID控制器是一种常见的实现方式,也称为绝对式PID。它直接根据误差值(期望输出与实际输出之差)计算控制量。位置式PID的输出控制量由比例、积分和微分三部分的和组成,如下所示:

  1. u(t) = Kp * e(t) + Ki * e(t)dt + Kd * de(t)/dt

其中,u(t) 是控制量,e(t) 是误差值,Kp、Ki 和 Kd 分别是比例、积分和微分系数。

下面我们来看一下PID的流程图
image.png

增量式PID

增量式PID控制器,顾名思义,是根据误差的增量计算控制量的变化。增量式PID的输出控制量由比例、积分和微分三部分的增量和组成,如下所示:

  1. Pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
  2. Pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[[ e(k) - e(k-1) ] - [ e(k-1) - e(k-2) ]]

相关参数说明如下:
e(k):本次偏差
e(k-1):上一次的偏差
e(k-2):上上次的偏差
Kp:比例项参数
Ki:积分项参数
Kd:微分项参数
Pwm:代表增量输出

image.png

串级PID

串级PID控制是一种将多个PID控制器连接在一起的控制策略,通常用于提高控制性能或解决复杂系统的控制问题。在串级PID控制系统中,有两个或更多的PID控制器分别负责不同的控制目标或子系统,其中一个控制器的输出作为另一个控制器的输入。这种结构使得控制器能够在不同的层次上对系统进行调节,从而实现更精确和稳定的控制效果。

串级PID的结构

串级PID通常包含一个主控制器(外环)和一个或多个从控制器(内环)。主控制器负责调节系统的主要输出,而从控制器负责调节次要输出或系统内部的状态变量。这种结构可以使得从控制器对系统内部的扰动或不确定性进行快速响应,而主控制器则负责保持系统的整体性能。
image.png

串级PID的优势

串级PID控制具有以下优势:

  1. 更好的控制性能:通过分层控制,串级PID可以在不同的层次上对系统进行调节,实现更精确和稳定的控制效果。
  2. 快速响应:从控制器可以对系统内部的扰动或不确定性进行快速响应,从而提高系统的稳定性。
  3. 灵活性:串级PID可以根据系统的特性和需求灵活地设计和调整控制策略。
  4. 适用于复杂系统:串级PID控制适用于具有多个输入和输出的复杂系统,可以解决传统单环PID控制难以应对的控制问题。
    实际应用
    级PID控制被广泛应用于各种领域,如工业过程控制、汽车动力系统控制、航空航天器姿态控制等。在实际应用中,需要根据系统的特性和需求来设计和调整串级PID控制策略。

PID参考表

PID控制理论 - 图6

系数 Rise Time(上升时间) Overshot(过冲距离) Setting Time(稳定时间)
Kp 减少 增加 增加(微弱)
Ki 减少(微弱) 增加 增加
Kd 有影响(微弱) 减少 减少

自动控制系统的性能指标主要有三个方面: 稳定性,快速性,准确性
稳定性: 系统在受到外作用后,若控制系统使其被控变量随时间的增长而最终 与给定期望值一致,则称系统是稳定的,我们一般称为系统收敛。如果被控量随时 间的增长,越来越偏离给定值,则称系统是不稳定的,我们一般称为系统发散。稳 定的系统才能完成自动控制的任务,所以,系统稳定是保证控制系统正常工作的必 要条件。一个稳定的控制系统其被控量偏离给定值的初始偏差应随时间的增长逐渐 减小并趋于零。
快速性: 快速性是指系统的动态过程进行的时间长短。
过程时间越短,说明系统快速性越好,过程时间持续越长,说明系统响应迟钝, 难以实现快速变化的指令信号。 稳定性和快速性反映了系统在控制过程中的性能。系统在跟踪过程中,被控量 偏离给定值越小,偏离的时间越短,说明系统的动态精度偏高。
准确性: 是指系统在动态过程结束后,其被控变量(或反馈量)对给定值的偏差而言,这一偏差即为稳态误差,它是衡量系统稳态精度的指标,反映了动态过程 后期的性能

平衡小车

平衡原理

小时候我们玩过一个游戏, 拿一根筷子或者一根笔放在手心上, 我们想方设法不让筷子倒下.
大家还记得是如何做到的吗? 如下图所示, 大圆表示的是轮子, 小圆表示的棍子末端, 为了方便大家理解, 我们假设木板始终是水平的, 并且棍子的一端固定在木板上面.
现在我们看到棍子已经有倾斜的趋势了, 棍子与竖直方向的夹角是θ, 那大家还记得大明湖畔的受力分析吗?
image.png

在该图中, m表示质量, g表示重力加速度. 我们沿着棍子的垂直的方向分解棍子的重力,也就是棍子末端倒下时受到的力, 我们可以得出棍子倒下去的力为: mgsin(θ)
现在我们只需要找到一个力,能够抵消掉mg
sin(θ)即可将棍子扭正. 让我们来思考一下, 如何才能不让棍子倒下呢?
image.png

答案是我们需要一个与mg*sin(θ)反向的作用力, 在当前情况下,我们只需要让轮子向右边加速运动, 棍子在反向作用力的情况下就可以得到一个水平方向上的力: -ma (因为a表示的是轮子向右运动的加速度用a表示,所以反作用力就是-ma)

image.png
我们再向棍子的垂线方向上分解这个反向作用力:-ma, 我们可以得出垂直棍子方向上的分力为: -macos(θ), 结合物理知识我们可以很容易得出在棍子锤子方向上,棍子所受到的合力F = mgsin(θ) - macos(θ).
image.png
在当前的案例中, m质量,g是重力加速度, θ是变化量, 通过我们合力公式F = mgsin(θ) - macos(θ), 我们可以得出只要a
cos(θ) > g*sin(θ) 我们就可以得到一个反向的作用力让棍子立起来.

这个分析结论与我们小时候在手心上玩竹竿或者筷子的原理是一样的, 当棍子向右边倒下的时候, 我们控制电机向右加速, 当棍子向左边倒下的时候, 我们控制电机向左边加速.
当然,仅仅这样是不够的, 因为我们需要让棍子稳定的直立起来, 如果仅仅是考虑加速度, 很容易就导致棍子在直立位置附近来回震荡, 为了减少震荡, 尽快稳定到平衡位置,我们需要考虑增加阻尼力, 阻尼力与角速度成正比, 方向相反. 加上阻尼力之后, 回复力为: F = mgsin(θ) - macos(θ) - mkw . 其中w表示角速度, k表示系数

直立环

示例代码

  1. float Balance(float Med, float Angle, float gyro) {
  2. // Med - Angle 角度误差
  3. return Balance_Kp * (Med - Angle) + Balance_Kd * gyro;
  4. }

速度环

  1. float Velocity(int Encoder_left, int Encoder_right, float pitch) {
  2. static float Encoder, Encoder_Integral;
  3. float Encoder_deviation, Velocity;
  4. Encoder_deviation = (Encoder_left + Encoder_right) - Target_Speed; // 获取速度偏差
  5. Encoder *= 0.8F; // 一阶低通滤波
  6. Encoder += Encoder_deviation * 0.1F; // 一阶低通滤波
  7. Encoder_Integral += Encoder; // 积分出位移 积分时间10ms
  8. CLIP_VALUE(Encoder_Integral, -10000, 10000); // 积分限幅
  9. Velocity = Encoder * Velocity_Kp + Encoder_Integral * Velocity_Ki; // 速度控制
  10. if (pitch < -40 || pitch > 40) // 电机关闭清除积分
  11. Encoder_Integral = 0;
  12. return Velocity;
  13. }