# pid_controller **Repository Path**: catleeee/pid_controller ## Basic Information - **Project Name**: pid_controller - **Description**: 程序主要是加深对pid的学习,完整程序将应用在对校内赛的车代码重构版本中。主要学习了pid改进的方法,以及改进的作用。代码实现参考了华南虎21年英雄车电控开源。 - **Primary Language**: C - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-02-11 - **Last Updated**: 2023-02-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PID控制器 ## PID概述 PID是一种闭环控制算法,适用于二阶以内的线性系统。由于一般适用pid时,输入的信号分为连续和离散,所以PID的公式也对应两种形式。在这里,不过多的进行理论推导,而是对其如何适用,参数影响,以及优化措施进行记录。 ## PID基本公式(位置式) 这里的公式是在程序使用时所使用,与理论推导出来的公式有所偏差 位置式PID基本公式如下 $$ u(k)=Kp*e(k)+Ki*\sum_{i=0}^ne(i)+Kd*[e(k)-e(k-1)] $$ 其中Kp为比例系数,e(k)是当前测量值与目标值的误差,是对系统当前状态做出快速反应。但如果只有Kp项,系统会存在稳态误差,也叫静态误差。也就是系统一直无法达到目标值,只能很接近于目标。这个时候就需要引入积分项来消除这个静态误差。 Ki为积分项系数。乘上的是系统启动到当前时间累积的误差值。积分项除了可以消除稳态误差外,还可以让系统更快达到稳定,并且抑制系统的震荡。这个项的系数一般很小。 Kd为微分项系数。微分项是当前误差值与上一次误差值之差。微分项实际上起到一个超前预测的作用。根据当前误差和上一次的误差,来预测需要多大的补偿。有时候可能不会引入Kd项。kd一定程度上加剧系统的震荡。 ## PID的改进方法 #### 积分限幅:可以限制积分失控。因为累积误差可能很大,导致系统会产生超调,引起震荡。加入积分限幅,可以减少系统调节的时间,减少积分饱和对系统的负面影响。 #### 积分分离:当误差比较大时,积分项的作用会很大,导致系统超调,引起震荡。这是不希望看到的。所以,加分积分分离,当误差比较大时,只使用PD或者P控制,来使系统快速接近稳定。当误差比较小时,再启用I项,消除静态误差。 #### 变速积分:一个理想的控制系统中,我们希望当误差比较大时,积分项作用减弱,而误差小时,积分项作用增强,这就引入变速积分的概念。利用误差值的不同,调整I项的权重。实际上感觉可以理解为是积分分离的升级版。 ###### 此时系数与|e(k)|值的关系是线性或者非线性的,可以设为 $$ f(e(k))=\begin{cases} 1,&|e(k)|\leq B \\ \frac{A-|e(k)+B|}{A},&B\leq|e(k)|\leq A+B \\ 0&|e(k)|>A+B \end{cases} $$ ###### 引入变速积分后,PID的公式变成 $$ u(k)=Kp*e(k)+Ki*(\sum_{i=0}^{n-1}e(i)+f(e(k))*e(k))+Kd*[e(k)-e(k-1)] $$ #### 不完全微分:对微分项计算的结果进行低通滤波,或者对PID输出值进行低通滤波。可以过滤掉过大误差值带来的干扰,减少系统的震荡。 ###### 低通滤波 $$ Y(n)=\alpha X(n)+(1-\alpha)Y(n-1)\\ \text{Y(n):本次滤波值 X(n):本次采样值 Y(n-1): 上一次滤波值}\\\alpha:是滤波器系数 $$ ###### 如果采用对微分项进行低通滤波,公式将变化成 $$ U_d=K_d\alpha[e(k)-e(k-1)]+(1-\alpha)U_{d-1} $$ #### 微分先行:就是直接用测量值与上一次测量值之差来进行计算,排除掉目标值的影响。主要是避免当目标值频繁发生改变或者突然发生很大的变化,造成系统的震荡 $$ d(k)=Kd[X(n)-X(n-1)]\\ X(n)为本次采样值 X(n-1)为上一次采样值 $$ #### 死区:有输出量,但不想让它起作用。利用精度来换稳定性。因为由于各种因素的影响,系统会有误差,所以当误差很小的时候,就不要让它进行调节,减少系统震荡,保持稳定。