PID算法(一)基础知识

1.PID算法连续公式

请添加图片描述

  • Kp——比例增益,Kp与比例度成倒数关系

  • Tt——积分时间常数

  • TD——微分时间常数

  • u(t)——PID控制器的输出信号

  • e(t)——给定值r(t)与测量值误差

2.PID算法的一般形式

请添加图片描述

PID控制其实就是对偏差的控制过程,如果偏差为0,则比例环节不起作用,只有存在偏差时,比例环节才起作用;积分环节主要是用来消除静差,所谓静差,就是系统稳定之后输出值和设定值之间的差值,积分环节实际上就是偏差积累的过程,把积累的误差加到原有系统上以抵消系统造成的静差;而微分信号则反应了偏差信号的变化规律,也可以说是变化趋势,根据偏差信号的变化趋势来进行超前调节,从而增加了系统的预知性。

①连续公式:

请添加图片描述

②离散公式:(位置式PID算法公式——全量式PID)

请添加图片描述
请添加图片描述

③增量式PID

根据前面的位置式公式:

第一步,将k-1带入到k得:
请添加图片描述

第二步,由△u=u(k)-u(k-1)得:

请添加图片描述

上述公式则为增量式PID,从公式看出增量式PID的输出与近三次的偏差有很大关系。

3.位置式PID和增量式PID对比

  • 增量式算法不需要对积分项累加,控制量增量只与进几次的误差有关,计算误差对控制量计算的影响较小。而位置式算法要对进几次的偏差进行积分累加,容易产生较大的累加误差。
  • 增量式算法得出的是控制量的增量,例如在阀门控制中,只输出阀门开度的变化部分,误动作影响比较小,必要时还可通过逻辑判断限制或禁止本次输出,不会严重影响系统的工作;而位置式的输出直接对应对象的输出,因此对系统影响较大。
  • 增量式算法控制输出的是控制量增量,并无积分作用,因此该方式用于执行机构带积分部件的对象,如步进电机等,而位置式算法适用于在执行机构不带积分部件的对象,如电液伺服阀;
  • 在进行PID控制时,位置式PID需要有积分限幅和输出限幅,而增量式PID只需输出限幅
①位置式PID优缺点
  • 优点:位置式PID是一种非递推式算法,可直接控制执行机构(如平衡小车),u(k)的值和执行机构的实际位置是一一对应的,因此在执行结构不带积分部件的对象中可以很好应用。
  • 缺点:每次输出均与过去的状态有关,计算时要对e(k)进行累加,运算工作量大。
②增量式PID优缺点
  • 优点:误动作时影响小,必要时可用逻辑判断的方法去掉出错数据;手动/自动切换时冲击小,便于实现无扰动切换;算式中不需要累加,控制增量△u(k)的确定仅与最近3次的采样值有关,在速度闭环控制中有很好的实时性。
  • 缺点:积分截断效应大,有稳态误差;溢出的影响大,有的被控对象用增量式则不太好。

4.位置式离散PID公式

请添加图片描述

  • 比例项(P)

    成比例的反应控制系统中输入和输出的偏差信号,只要偏差一旦产生,就立即产生控制的作用来减小产生的误差。

    一般情况增大比例系数可以加快系统的响应,增大比例系数有助于减小静差。

  • 积分项(I)

​ 在比例控制环节中产生了静态误差,在积分环节中,主要用于消除静态误差提高系统的无差度。

​ 一般情况下增加积分时间有利于减小超调,系统稳定性增加,但是会增长消除静差的时间

  • 微分项(D)

​ 微分环节的作用是反应系统偏差的一个变化趋势,可以在误差来临之前提前引入一个有效的修正信号。

​ 一般情况下微分项具有超前调节的作用,抑制震荡。
分项(D)

​ 微分环节的作用是反应系统偏差的一个变化趋势,可以在误差来临之前提前引入一个有效的修正信号。

​ 一般情况下微分项具有超前调节的作用,抑制震荡。

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是一个带积分限幅的电压电流双闭环PID程序的示例代码: ``` // 定义PID结构体 typedef struct { float SetPoint; // 设定值 float Kp; // 比例系数 float Ki; // 积分系数 float Kd; // 微分系数 float lastError; // 上一次误差 float integral; // 积分误差 float integralLimit; // 积分限幅 } PID; // 定义电压和电流PID结构体 PID voltagePID = {0, 0.1, 0.01, 0.001, 0, 0, 10}; PID currentPID = {0, 0.5, 0.05, 0.005, 0, 0, 5}; // 输入电压和电流 float inputVoltage = 0; float inputCurrent = 0; // 输出PWM信号 float outputPWM = 0; // 采样时间 float sampleTime = 0.001; // 控制器计算函数 void calcPID(PID *pid, float input, float setpoint) { float error = setpoint - input; // 计算误差 pid->integral += error * sampleTime; // 累计积分误差 // 积分限幅 if (pid->integral > pid->integralLimit) { pid->integral = pid->integralLimit; } else if (pid->integral < -pid->integralLimit) { pid->integral = -pid->integralLimit; } float derivative = (error - pid->lastError) / sampleTime; // 计算微分误差 pid->lastError = error; // 保存上一次误差 float output = pid->Kp * error + pid->Ki * pid->integral + pid->Kd * derivative; // 计算PID输出 pid->SetPoint = output; // 更新PID设定值 } // 主函数 int main() { while (1) { // 读取电压和电流 inputVoltage = readVoltage(); inputCurrent = readCurrent(); // 计算电压和电流PID输出 calcPID(&voltagePID, inputVoltage, 220); // 设定电压为220V calcPID(&currentPID, inputCurrent, 5); // 设定电流为5A // 计算PWM输出 outputPWM = voltagePID.SetPoint + currentPID.SetPoint; // 输出PWM信号 writePWM(outputPWM); // 等待采样时间 delay(sampleTime); } } ``` 该程序在原有的电压电流双闭环PID程序的基础上,增加了积分限幅的功能。积分限幅的作用是当积分误差达到一定的值时,将积分误差限制在一定范围内,避免积分饱和导致系统不稳定。在计算PID输出时,首先判断积分误差是否超过了积分限幅,如果超过则将积分误差限制在限幅范围内。其中,积分限幅值可以根据具体应用进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

anthony-36

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值