PID算法学习笔记

本文探讨了位置式PID算法和增量式PID算法的基本原理,包括各自的公式、数据结构和实现方式。重点比较了两种算法在误差处理、适用对象、实时性以及优点与缺点。对于控制系统工程师,理解这两种PID形式至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1位置式PID算法

公式

在这里插入图片描述积分环节替换为累计的形式实现

数据结构

typedef struct
{ 
	float target_val; //目标值
	float actual_val; //实际值
	float err; //定义偏差值
	float err_last; //定义上一个偏差值
	float Kp,Ki,Kd; //定义比例、积分、微分系数
	float integral; //定义积分值
}_pid;
/**
  * @brief  PID算法实现
  * @param  actual_val:实际值
	*	@note 	无
  * @retval 通过PID计算后的输出
  */
float PID_realize(float actual_val)
{
		/*计算目标值与实际值的误差*/
    pid.err=pid.target_val-actual_val;
    /*误差累积*/
    pid.integral+=pid.err;
		/*PID算法实现*/
    pid.actual_val=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);
		/*误差传递*/
    pid.err_last=pid.err;
		/*返回当前实际值*/
    return pid.actual_val;
}

2增量式PID算法

公式

在这里插入图片描述

在这里插入图片描述增量式 PID 的输出与近三次的偏差有很大关系;

代码实现

数据结构

typedef struct
{
	float target_val; //目标值
	float actual_val; //实际值
	float err; //定义当前偏差值
	float err_next; //定义下一个偏差值
	float err_last; //定义最后一个偏差值
	float Kp, Ki, Kd; //定义比例、积分、微分系数
}_pid;
/**
  * @brief  PID算法实现
  * @param  actual_val:实际值
	*	@note 	无
  * @retval 通过PID计算后的输出
  */
float PID_realize(float actual_val)
{
	/*计算目标值与实际值的误差*/
  pid.err=pid.target_val-actual_val;
	/*PID算法实现*/
	pid.actual_val += pid.Kp*(pid.err - pid.err_next) 
                 + pid.Ki*pid.err 
                 + pid.Kd*(pid.err - 2 * pid.err_next + pid.err_last);
	/*传递误差*/
	pid.err_last = pid.err_next;
	pid.err_next = pid.err;
	/*返回当前实际值*/
	return pid.actual_val;
}

3 算法对比

对比区别

  1. 增量式算法不需要对积分项累加,控制量增量只与近几次的误差有关,计算误差对控制量
    计算的影响较小。而 位置式算法要对近几次的偏差的进行积分累加,容易产生较大的累加
    误差;

  2. 增量式算法得出的是控制量的增量,例如在阀门控制中,只输出阀门开度的变化部分,误
    动作影响小,必要时还可通过逻辑判断限制或禁止本次输出,不会严重影响系统的工作;而
    位置式的输出直接对应对象的输出,因此对系统影响较大;

  3. 增量式算法控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分
    部件的对象,如步进电机等,而 位置式算法适用于执行机构不带积分部件的对象,如电液
    伺服阀;
    • 在进行 PID 控制时,位置式 PID 需要有积分限幅和输出限幅,而 增量式 PID 只需输出限

位置式 PID 优缺点:

优点:: 位置式 PID 是一种非递推式算法,可直接控制执行机构(如平衡小车),u(k) 的值和执行
机构的实际位置(如小车当前角度)是一一对应的,因此在执行机构不带积分部件的对象中可以
很好应用;

缺点:: 每次输出均与过去的状态有关,计算时要对 e(k) 进行累加,运算工作量大。

增量式 PID 优缺点:

优点::

  1. 误动作时影响小,必要时可用逻辑判断的方法去掉出错数据。
  2. 手动/自动切换时冲击小,便于实现无扰动切换。
  3. 算式中不需要累加。控制增量 Δu(k) 的确定仅与最近 3 次的采样值有关。在速度闭环控制
    中有很好的实时性。

缺点:

  1. 积分截断效应大,有稳态误差;
  2. 溢出的影响大。有的被控对象用增量式则不太好;
### PID控制器中的限幅功能 #### 一、基本概念 PID 控制器是一种广泛应用的自动控制系统组件,其核心在于比例 (P)、积分 (I) 和微分 (D) 的组合来调整输出信号。然而,在实际应用场景中,为了防止某些极端情况的发生以及优化性能表现,通常会对 PID 输出施加一定的限制条件——即所谓的“限幅”。这种机制能够有效避免因过度调节而导致系统不稳定或者硬件损坏等问题。 #### 二、具体作用 1. **保护执行机构** 当 PID 调节的结果超出了物理设备所能承受的最大能力时(比如阀门全开或电机满功率运转),如果不加以约束可能会造成机械损伤甚至安全事故。因此设置了上下界限以确保操作安全可靠[^1]。 2. **改善动态响应特性** 对于一些快速变化的过程变量而言,如果允许任意大小的动作量,则可能导致频繁大幅度波动从而影响整体稳定性;相反适当范围内的变动有助于维持较为平滑过渡状态并加快收敛速度[^3]. 3. **处理饱和现象** 积分项容易累积误差形成过冲效应,特别是在存在持续偏差的情况下尤为明显。引入限幅措施可以在一定程度上缓解此类问题带来的负面影响,使得恢复至目标值更加迅速精准[^4]. 4. **适应不同工况需求** 不同的工作环境可能对应着各异的操作区间要求,灵活配置这些边界值可以让同一个装置适用于更多样化的任务场景之中[^2]. ```python def pid_controller_with_clamp(error, prev_error, integral, Kp, Ki, Kd, min_output=-100, max_output=100): proportional = error * Kp derivative = (error - prev_error) * Kd integral += error * Ki output = proportional + integral + derivative # Clamp the output to ensure it stays within specified limits. clamped_output = max(min(output, max_output), min_output) return clamped_output, integral ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Car12

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

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

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

打赏作者

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

抵扣说明:

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

余额充值