控制算法(一)-------PID算法

控制算法(一)-------PID算法

一、PID是什么?

比例积分微分控制,简称PID控制,其中P表示比例、I表示积分、D表示微分。

PID控制算法是最早发展起来的控制策略之一,由于其算法简单、鲁棒性好和可靠性高,被广泛应用于工业过程控制。

而且也衍生出多种相关的控制算法:P控制、PI控制、PD控制、增量式PID控制、抗饱和PID、微分先行PID、自适应PID、模糊PID控制等。

虽然这些算法各不相同,但都是基于最基本的PID控制算法为原型的。

二、PID原理

常规的模拟 PID 控制系统原理框图如下图所示:

在这里插入图片描述

PID控制算法的原理是基于负反馈控制理论的。当系统处于稳态时,PID算法通过不断测量系统的实际输出和期望输出之间的误差,并根据误差的大小来调整控制器的输出。PID算法可以通过三种不同的控制方式来实现这一目标:

环节参数
比例Kp
积分Ti
微分Td

比例环节

比例环节的作用是对偏差瞬间作出反应。偏差一旦产生控制器立即产生控制作用, 使控制量向减少偏差的方向变化。 控制作用的强弱取决于比例系数Kp, 比例系数Kp越大,控制作用越强, 则过渡过程越快, 控制过程的静态偏差也就越小; 但是Kp越大,也越容易产生振荡, 破坏系统的稳定性。 故而, 比例系数Kp选择必须恰当, 才能过渡时间少, 静差小而又稳定的效果。

积分环节

从积分部分的数学表达式可以知道, 只要存在偏差, 则它的控制作用就不断的增加; 只有在偏差e(t)=0时, 它的积分才能是一个常数,控制作用才是一个不会增加的常数。 可见,积分部分可以消除系统的偏差。

积分环节的调节作用虽然会消除静态误差,但也会降低系统的响应速度,增加系统的超调量。积分常数Ti越大,积分的积累作用越弱,这时系统在过渡时不会产生振荡; 但是增大积分常数Ti会减慢静态误差的消除过程,消除偏差所需的时间也较长, 但可以减少超调量,提高系统的稳定性。

当 Ti 较小时, 则积分的作用较强,这时系统过渡时间中有可能产生振荡,不过消除偏差所需的时间较短。所以必须根据实际控制的具体要求来确定Ti 。

微分环节

实际的控制系统除了希望消除静态误差外,还要求加快调节过程。在偏差出现的瞬间,或在偏差变化的瞬间, 不但要对偏差量做出立即响应(比例环节的作用), 而且要根据偏差的变化趋势预先给出适当的纠正。为了实现这一作用,可在 PI 控制器的基础上加入微分环节,形成 PID 控制器。

微分环节的作用使阻止偏差的变化。它是根据偏差的变化趋势(变化速度)进行控制。偏差变化的越快,微分控制器的输出就越大,并能在偏差值变大之前进行修正。微分作用的引入, 将有助于减小超调量, 克服振荡, 使系统趋于稳定, 特别对髙阶系统非常有利, 它加快了系统的跟踪速度。但微分的作用对输入信号的噪声很敏感,对那些噪声较大的系统一般不用微分, 或在微分起作用之前先对输入信号进行滤波。

方便记忆的顺口溜:
比例:

比例州节器,像个放大器;

一个偏差来,放大送出去;

放大是多少,旋钮看仔细;

比例度旋大,放大倍数低。

积分:

重定调节器,累积有本领;

只要偏差在,累积不停止;

累积快与慢,旋钮看仔细;

积分时间长,累积速度低。

微分:

说起微分器,一点不神秘;

阶跃输入来,输出跳上去;

下降快与慢,旋钮看仔细;

微分时间长,下降就慢些。

特点

环节特点
比例偏差一产生,控制器立即做出响应,产生控制作用,使控制量向减少偏差的方向变化
积分消除系统的静态误差;但同时会降低系统的响应速度,增加超调量;积分时间越长,积分的积累作用越弱,消除静态误差的时间会变长;但系统过渡时不会产生振荡,可以减少超调量,提高系统的稳定性
微分加快调节过程,阻止偏差的变化;有助于减少超调量,克服振荡,使系统趋于稳定

三、PID的分类

PID分为数字PID和模拟PID。

模拟PID

在这里插入图片描述

r(t)是给定输入,e(t)是偏差,u(t)是控制器的输出,y(t)是被控对象的输出。

模拟PID控制器的控制规律如下:

式1
1

数字PID

1.位置型PID算法:

将其离散化,以T作为采样周期,表达式1可变为表达式2:

式2
2

把表达式2中的参数整定后得到下面的表达式3:

式33

上面的表达式中:
k ―― 采样序号, k =0, 1, 2,……;
uk ―― 第 k 次采样时刻的计算机输出值;
e(k) ―― 第 k 次采样时刻输入的偏差值;
e(k-1) ―― 第 k -1 次采样时刻输入的偏差值;
Ki ――积分系数, Ki=Kp *T / Ti ;
Kd ――微分系数, Kd=Kp *Td / T ;

2.增量型PID算法

u(k)的表达式确定了,那么把u(k) 减去u(k-1)就可以得到控制量的增量,所以得到的数学表达式如下:

在这里插入图片描述

其中,

在这里插入图片描述

特点

特点位置型增量型
1位置式PID控制的输出与整个过去的状态有关,用到了误差的累加值增量式PID的输出只与当前拍和前两拍的误差有关,因此位置式PID控制的累积误差相对更大
2位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机
2位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀由于增量式PID输出的是控制量增量,如果计算机出现故障,误动作影响较小,而执行机构本身有记忆功能,可仍保持原位,不会严重影响系统的工作

四、PID代码实现

位置型PID算法

//位置型PID算法源码
typedef struct
{
  float Kp;                       //比例系数Proportional
  float Ki;                       //积分系数Integral
  float Kd;                       //微分系数Derivative
 
  float Ek;                       //当前误差
  float Ek1;                      //前一次误差 e(k-1)
  float Ek2;                      //再前一次误差 e(k-2)
  float LocSum;                   //累计积分位置
}PID_LocTypeDef;
 
/************************************************
函数名称 : PID_Loc
功    能 : PID位置(Location)计算
参    数 : SetValue ------ 给定值(期望值)
            ActualValue --- 实际值(反馈值)
            PID ----------- PID数据结构
返 回 值 : PIDLoc -------- PID位置
*************************************************/
float PID_Loc(float SetValue, float ActualValue, PID_LocTypeDef *PID)
{
  	float PIDLoc;                                  //位置
 
  	PID->Ek = SetValue - ActualValue;
  	PID->LocSum += PID->Ek;                         //累计误差
 
  	PIDLoc = PID->Kp * PID->Ek + (PID->Ki * PID->LocSum) + PID->Kd * (PID->Ek - PID->Ek1);
 
  	PID->Ek1 = PID->Ek;  
	return PIDLoc;
}

上面代码中的Kp是指比例系数;
Ki = Kp * T / Ti;
Kd = Kp * Td / T。

增量型PID算法

//增量型pid算法
typedef struct
{
  float Kp;                       //比例系数Proportional
  float Ki;                       //积分系数Integral
  float Kd;                       //微分系数Derivative
 
  float Ek;                       //当前误差
  float Ek1;                      //前一次误差 e(k-1)
  float Ek2;                      //再前一次误差 e(k-2)
}PID_IncTypeDef;
 
/************************************************
函数名称 : PID_Inc
功    能 : PID增量(Increment)计算
参    数 : SetValue ------ 设置值(期望值)
            ActualValue --- 实际值(反馈值)
            PID ----------- PID数据结构
返 回 值 : PIDInc -------- 本次PID增量(+/-)
*************************************************/
float PID_Inc(float SetValue, float ActualValue, PID_IncTypeDef *PID)
{
  	float PIDInc;                                  //增量
 
  	PID->Ek = SetValue - ActualValue;
  	PIDInc = (PID->Kp * PID->Ek) - (PID->Ki * PID->Ek1) + (PID->Kd * PID->Ek2);	//参数已做整定
 	
  	PID->Ek2 = PID->Ek1;
  	PID->Ek1 = PID->Ek;  
return PIDInc;
}

在上面代码中:(参数是经过整定的)
实际上:
Kp = KP + KI + KD;
Ki = KP + 2 * KD;
KD = KD;

而KP就是比例系数
KI = KP * T / Ti; //Ti是指积分时间
KD = KP * Td / Ti; //Td是指微分时间

注:

PID的代码有很多,本人只是为了更好方便讲解,使用此代码,在实际操作中此代码不具参考性。

五、调试方法

​ 参数调试是PID控制系统中非常重要的一步,调整合适的参数可以使系统响应速度更快、稳定性更高、超调量更小等。以下是一些常用的参数调试方法:

Ziegler-Nichols法

该方法通过实验获取系统的临界增益Kc和周期Tc,并根据这些参数计算出比例、积分和微分参数。具体步骤是在系统关闭环路的情况下,逐渐增大比例参数Kp,直到系统开始产生振荡,记录此时的增益Kc和周期Tc。然后根据Ziegler-Nichols法则计算比例、积分和微分参数。
Ziegler-Nichols法它的基本思想是通过试验获取系统的临界增益Kc和周期Tc,然后根据这些参数计算出合适的PID参数。

具体步骤如下:

1)将系统的控制器参数设置为Kp=0, Ki=0, Kd=0,即不带控制器。

2)逐渐增大比例参数Kp,直到系统开始产生振荡。

3)记录此时的增益Kc和周期Tc。

4)根据Ziegler-Nichols法则计算比例、积分和微分参数:

比例参数Kp = 0.6 * Kc
积分参数Ki = 1.2 * Kc / Tc
微分参数Kd = 0.075 * Kc * Tc
其中,Kc是系统的临界增益,Tc是系统的临界周期。

Ziegler-Nichols法的优点是简单易行,可以快速得到PID控制器的参数。但它的缺点是在试验过程中可能会对系统产生不必要的损坏,而且仅适用于一阶惯性系统和二阶振荡系统。

Cohen-Coon法

该方法通过实验获取系统的临界时间常数Tc和比例带宽R,根据这些参数计算出比例、积分和微分参数。具体步骤是在系统关闭环路的情况下,逐渐增大比例参数Kp,直到系统产生一次过渡过程(即超调量达到5%左右),记录此时的时间常数Tc和比例带宽R。然后根据Cohen-Coon法则计算比例、积分和微分参数。
它的基本思想是通过试验获取系统的临界时间常数Tc和比例带宽R,然后根据这些参数计算出合适的PID参数。

具体步骤如下:

1)将系统的控制器参数设置为Kp=0, Ki=0, Kd=0,即不带控制器。

2)逐渐增大比例参数Kp,直到系统产生一次过渡过程(即超调量达到5%左右)。

3)记录此时的时间常数Tc和比例带宽R。

4)根据Cohen-Coon法则计算比例、积分和微分参数:

比例参数Kp = (1.35 * Tc) / (R * Kc)
积分参数Ki = (0.54 * Tc) / (Kc * R)
微分参数Kd = (0.075 * Tc * R * Kc)
其中,Kc是系统的增益。

Cohen-Coon法的优点是简单易行,试验过程相对于Ziegler-Nichols法比较安全,而且适用于各种阶数的系统,但其结果可能比较粗糙。

频率响应法

该方法通过分析系统的频率响应特性,确定合适的比例、积分和微分参数。具体步骤是将系统置于正弦信号激励下,记录系统的频率响应曲线。根据曲线的特点确定合适的比例、积分和微分参数。该方法需要对系统的频率响应曲线有一定的理解和掌握。

在实际应用中,不同的参数调试方法可以结合使用,以达到更好的控制效果。同时,参数调试是一个迭代过程,需要反复试验和调整,直到达到满意的控制效果为止。

具体步骤如下:

将控制系统置于正弦信号激励下,记录系统的频率响应曲线;
根据曲线的特点,选择适当的参数。通常,如果系统的相位裕度(phase margin)较小,则需要增加比例参数Kp;如果系统的增益裕度(gain margin)较小,则需要增加积分参数Ti;如果系统存在高频噪声,则需要增加微分参数Td。
总之,频率响应法需要对系统的频率响应曲线进行分析,并结合PID控制器的工作原理和PID参数对系统的影响,确定合适的PID参数。与其他方法相比,频率响应法能够更好地考虑系统的动态特性,因此被广泛应用于实际工程中。但需要注意的是,频率响应法需要对系统进行一定的干扰或激励,因此在实际应用中需要谨慎选择适当的激励信号,以避免对系统造成不必要的损害。

经验法

即根据经验或试错法进行调整。该方法简单易行,但需要经过大量实验和经验积累,耗费时间较长。常见的经验法包括调整比例参数,使输出量达到目标值时误差的绝对值约为目标值的1/10;调整积分参数,使系统在稳态时误差的绝对值趋近于零;调整微分参数,使系统的超调量和振荡幅度达到最小值。

参数整定找最佳,从小到大顺序查,

先是比例后积分,最后再把微分加,

曲线振荡很频繁,比例度盘要放大,

曲线漂浮绕大湾,比例度盘往小扳,

曲线偏离回复慢,积分时间往下降,

曲线波动周期长,积分时间再加长,

曲线振荡频率快,先把微分降下来,

动差大来波动慢,微分时间应加长,

理想曲线两个波,前高后低4比1,

一看二调多分析,调节质量不会低。

六、实例

开环系统与闭环系统的概念

控制系统的输出量没有对系统的输入量有一定的控制作用,那么这个系统叫做开环控制系统。
控制系统的输出量能够对系统的输入量有一定的控制作用,那么这个系统叫做闭环控制系统(也叫反馈控制系统)。

开环控制系统是指在一个控制系统中,系统的输入量不受输出量影响的控制系统。
闭环控制系统就是把输出量检测出来,经过一定的转换,反馈到输入端进行比较,达到对输入量进行控制,从而使得输出量变化。

在这里插入图片描述

电机驱动

对于驱动编码器电机需要12v的电压,而tb6612在本人学习使用过程中很容易烧坏,因此我选择了使用l298n电机驱动。

工作原理

在这里插入图片描述

只需要在12V供电处接上7-12V电压,供电GND处与单片机共地即可,5V供电处会输出一个5V的电压,可以用于给单片机供电,做小车时最常用的就是这种方式。使用这种方式时,板载5V使能不用管。

控制引脚

  1. IN1 & IN2 电机驱动器A的输入引脚,控制电机A转动及旋转角度
    IN1输入高电平HIGH,IN2输入低电平LOW,对应电机A正转
    IN1输入低电平LOW,IN2输入高电平HIGH,对应电机A反转
    IN1、IN2同时输入高电平HIGH或低电平LOW,对应电机A停止转动
    调速就是改变IN1、IN2高电平的占空比(需拔掉ENA处跳帽)

  2. IN3 & IN4 电机驱动器B的输入引脚,控制电机B转动及旋转角度
    IN3输入高电平HIGH,IN4输入低电平LOW,对应电机B正转
    IN3输入低电平LOW,IN4输入高电平HIGH,对应电机B反转
    IN3、IN4同时输入高电平HIGH或低电平LOW,对应电机B停止转动
    调速就是改变IN3、IN4高电平的占空比(需拔掉ENB处跳帽)

输出引脚

  1. OUT1 & OUT2 电机驱动器A的输出引脚,接直流电机A或步进电机的A+和A-
  2. OUT3 & OUT3 电机驱动器B的输出引脚,接直流电机B或步进电机的B+和B-

调速控制引脚

  1. ENA 电机A调速开关引脚,拔掉跳帽,使用PWM对电机A调速,插上电机A高速运行
  2. ENB 电机B调速开关引脚,拔掉跳帽,使用PWM对电机B调速,插上电机B高速运行

控制

开环

开环控制一般来说就是没有反馈的控制。

我们可以通过调整PWM占空比(或脉宽)控制车轮转速。在直道处,占空比给高一点,弯道处占空比给小一点,这样就实现了转速控制。

但是车子是有惯性的。电机的加速减速也是需要时间反应的,很有可能在直道想要提速,加大了占空比,结果车子加速不及时,已经到了弯道速度才加起来。又到了弯道,需要减速,然后一个减速不及时冲了出去。

开环控制是属于能用,但不好用的情况,主要是因为惯性的存在,导致加速不及时,减速刹不住。

闭环

开环更多的是定性控制,闭环可以做到定量控制转速。

电机控制一般采用增量式。

测出电机转一圈脉冲数,PID计算出车速,占空比,PWM将使用这个占空比改变脉宽,从而控制电机转速。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值