精华内容
下载资源
问答
  • 增量式pid调参
    千次阅读
    2021-10-21 21:46:50

    本文只展示部分代码,完整代码请访问我的github

    一、PID控制器简介

    PID(P比例,I积分,D微分)是一种model free的控制器,使用该控制器,无需对控制系统进行建立模型,只需对P、I 、D这三个参数进行调整即可,使用起来十分方便,因此在控制系统中被广泛使用。

    水温PID控制系统
    u ( t ) = K p e ( t ) + K i ∫ 0 t e ( t ) d t + K d d e ( t ) d t (1) u(t) = K_pe(t) + K_i\int_{0}^{t} e(t)dt +K_d\frac{de(t)}{dt} \tag{1} u(t)=Kpe(t)+Ki0te(t)dt+Kddtde(t)(1)

    • 积分项有助于消除稳态误差
    • 微分项有助于加快系统相应
    • PD控制:提高稳定性,改善瞬态响应
    • PI控制:改善稳态误差

    二、一阶惯性环节

    以下的代码中将用一阶惯性环节作为被控对象来进行展开。此处简单介绍一下一阶惯性系统。
    一阶惯性环节(系统)比较常见,如单容水箱、电容等含有储存元件或容量的元件系统,该系统输出一开始并不与输入同步按比例变化,直到过渡过程结束输出 y ( t ) y(t) y(t)才与输入 x ( t ) x(t) x(t)保持比例关系。

    • 运动方程:
      T d y ( t ) d t + y ( t ) = K x ( t ) T\frac{dy(t)}{dt} + y(t) = Kx(t) Tdtdy(t)+y(t)=Kx(t)
    • 传递函数
      G ( s ) = Y ( s ) X ( s ) = K T s + 1 G(s)= \frac{Y(s)}{X(s)} =\frac{K}{Ts +1} G(s)=X(s)Y(s)=Ts+1K
      其中T是时间常数,K是比例常数
    • 在数字控制系统中通常写为:
      T [ y ( k ) − y ( k − 1 ) ] + y ( k ) = K x ( k ) T\left[y(k)-y(k-1) \right]+ y(k) = Kx(k) T[y(k)y(k1)]+y(k)=Kx(k) ⇒ \Rightarrow y ( k ) = K x ( k ) + T y ( k − 1 ) 1 + T y(k)= \frac{Kx(k)+Ty(k-1)}{1+T} y(k)=1+TKx(k)+Ty(k1)

    三、位置式PID

    3.1 简介

    在计算机控制系统中往往使用位置式PID算法与增量式PID算法。下面给出位置式PID的公式。
    u ( k ) = K p e ( k ) + K i ∑ i = 0 e ( i ) + K d [ e ( k ) − e ( k − 1 ) ] (2) u(k) = K_pe(k) + K_i\sum_{i=0} e(i) +K_d\left[e(k)-e(k-1) \right] \tag{2} u(k)=Kpe(k)+Kii=0e(i)+Kd[e(k)e(k1)](2)
    从公式可以看出,这就是对式(1)的直接数字化,容易理解,输出u(k)便是PID控制器的输出位置。
    该控制器存在的缺点
    由于积分饱和带来的影响,控制器需要相当一段长的时间退出饱和区,由此引起系统产生大幅度超调。这里如果想继续了解积分饱和,请点击链接查看matlab官方的讲解。

    3.2 python程序

    #位置式PID系统
    class PositionalPID:
        def __init__(self, P: float, I: float, D: float):
            self.Kp = P
            self.Ki = I
            self.Kd = D
    
            self.PIDOutput = 0.0  # PID控制器输出
            self.SystemOutput = 0.0  # 系统输出值
            self.LastSystemOutput = 0.0  # 系统的上一次输出
    
            self.PIDErrAdd = 0.0
            self.ResultValueBack = 0.0
            self.Error = 0.0
            self.LastError = 0.0
    
        def SetStepSignal(self, StepSignal):
            self.Error = StepSignal - self.SystemOutput
    
            KpWork  = self.Kp *self.Error
            KiWork = self.Ki* self.PIDErrAdd
            KdWork = self.Kd * (self.Error- self.LastError)
            self.PIDOutput = KpWork + KiWork + KdWork
            self.PIDErrAdd += self.Error
            self.LastError = self.Error
    
            # 以一阶惯性环节为例子演示控制效果
    
        def SetInertiaTime(self, IntertiaTime, SampleTime):
            self.SystemOutput = (IntertiaTime * self.LastSystemOutput + SampleTime * self.PIDOutput) / (
                        SampleTime + IntertiaTime)
            self.LastSystemOutput = self.SystemOutput
    

    四、增量式PID

    4.1简介

    Δ u ( k ) = u ( k ) − u ( k − 1 ) = \Delta u(k) = u(k)-u(k-1)= Δu(k)=u(k)u(k1)=
    K p [ e ( k ) − e ( k − 1 ) ] + K i e ( k ) + K d [ e ( k ) − 2 e ( k − 1 ) + e ( k − 2 ) ] (3) K_p\left[e(k)-e(k-1) \right] + K_i e(k) +K_d\left[e(k)-2e(k-1)+e(k-2) \right] \tag{3} Kp[e(k)e(k1)]+Kie(k)+Kd[e(k)2e(k1)+e(k2)](3)
    增量式PID只求取控制量的变化量,一旦确定了 KP、TI 、TD,只要使用前后三次测量值的偏差, 即可由公式求出控制增量,而得出的控制量▲u(k)对应的是近几次位置误差的增量,而不是对应与实际位置的偏差,因此没有误差累加,容易通过加权处理获得比较好的控制效果,并且在系统发生问题时,增量式不会严重影响系统的工作
    最后的输出要加上上一时刻的输出u(k-1),即:
    u ( k ) = Δ u ( k ) + u ( k − 1 ) (4) u(k)= \Delta u(k)+u(k-1)\tag{4} u(k)=Δu(k)+u(k1)(4)

    4.2 python程序

    #增量式PID系统
    class IncrementalPID:
        def __init__(self, P:float ,I:float ,D:float ):
            self.Kp = P
            self.Ki = I
            self.Kd = D
    
            self.PIDOutput =0.0         #PID控制器输出
            self.SystemOutput = 0.0     #系统输出值
            self.LastSystemOutput = 0.0 #系统的上一次输出
    
            self.Error = 0.0
            self.LastError = 0.0
            self.LastLastError = 0.0
    
        #设置PID控制器参数
        def SetStepSignal(self,StepSignal):
            self.Error = StepSignal - self.SystemOutput
            #计算增量
            IncrementalValue = self.Kp*(self.Error - self.LastError)\
                + self.Ki * self.Error +self.Kd *(self.Error -2*self.LastError +self.LastLastError)
            #计算输出
            self.PIDOutput += IncrementalValue
            self.LastLastError = self.LastError
            self.LastError = self.Error
    
        #以一阶惯性环节为例子演示控制效果
        def SetInertiaTime(self,IntertiaTime,SampleTime):
            self.SystemOutput = (IntertiaTime*self.LastSystemOutput + SampleTime *self.PIDOutput)/(SampleTime + IntertiaTime)
            self.LastSystemOutput = self.SystemOutput
    

    五、几种控制效果对比

    上图!图中红色为增量式PID,蓝色为位置式PID,黑色是不加控制器的效果。
    在这里插入图片描述

    更多相关内容
  • 增量式pid调节

    2017-05-09 22:14:46
    pid学习
  • 在分析增量式数字 PID基本算法的基础上,讨论了PID调节器参数对控制性能的影响及PID调节器控制参数的整定,并利用具有积分分离和消除设定值变化冲击的PID控制算法来实现具有最佳组合的PID控制。仿真实验结果表明,经...
  • PID调参过程详解(包括增量式和位移式)

    万次阅读 多人点赞 2017-07-30 16:03:57
    位置式PID调参步骤: 预设目标值是11000 1.首先,我们进行PID参数整定的时候,先设I D为0,然后把P值从0逐渐增大,直到系统震荡.如下图(P值设的500,这是因为P值过大,出现了震荡.这时我们就需要调整P值大小,让...

    位置闭环控制就是根据编码器的脉冲累加测量电机的位置信息,并与目标预设值做比较,得到控制偏差,然后通过对偏差的P比例,I积分,D微分进行控制,使偏差趋于零的过程

    位置式PID调参步骤:

    预设目标值是11000

    1.首先,我们进行PID参数整定的时候,先设I D为0,然后把P值从0逐渐增大,直到系统震荡.如下图(P值设的500,这是因为P值过大,出现了震荡.这时我们就需要调整P值大小,让曲线出现静态,而静态一般实在P值较小而且I值为0情况下才出现,如第二个图,我将P设置为50即)

    ps:(我使用的是串口打印出实际值和预测值,然后word打印的表格 未使用串口波形助手,也可百度收缩串口波形助手 原理一样 这里注重调参过程)

     

     

     

    由上图可以看出,我们提高了P的值一定程度上消除了静差,提高了响应速度,但是会导致系统震荡,故我们加入微分D可以有效抑制震荡.

    故我们加入KD试试效果

     

     

     

    可以确定KD的值即为500了,然后我们就调整KPKI,调试电机,一般KI的值都很小或者根本不需要.

    调试KP,一般应该把P给小一点,然后KD应该尽可能大点,I值一般都是0.

     

     

    总结:一开始先加大比例Pp小了会达不到目标速度,会差很多,所以再加大p,知道电机出现嗒嗒嗒的抖动或者观察上位机的波形剧烈抖动的时候,这时候p就过大了,实际上p可以不是很大,比如400,调试时候增加幅值可以设为20I稍微来点就可以,平衡车的工程经验是ki=kp/200,但是这里我给的是0.2,还要看具体情况,积分参数过大,实际速度和目标速度的静差会很大。

     

    电机速度闭环控制使用增量式PI调参  和上面的方法一样的,只是步骤稍微有点不一样

    增量式pid调节目标速度时候参数整定:

    先加大KI,这时候会越来越接近实际速度,当KI过大的时候,在切换目标速度的时候,就会抖动,这时候就是KI大了响应速度高了,但导致超调量增加,这时候就加大增量式的KP,来缓减抖动,减小超调量。

    展开全文
  • 这是本人参考网上的资料,然后总结写下的PID控制算法,属于最基本的版本,对于后期的参数调节,和算法使用可根据实际情况做调整。就是赚个辛苦费。
  • PID控制能满足相当多的工业对象的控制要求,尤其适用于可建立精确模型的确定性控制系统。由于其算法简单,鲁棒性强和可靠性高适合多数控制系统中,可以结合采用自适应、模糊、滑模、神经网络等智能控制以增强控制性能...

            PID控制能满足相当多的工业对象的控制要求,尤其适用于可建立精确模型的确定性控制系统。由于其算法简单,鲁棒性强和可靠性高适合多数控制系统中,可以结合采用自适应、模糊、滑模、神经网络等智能控制以增强控制性能和适应环境的能力。

             首先从理论原则出发:通过实际运行,由液晶屏观察输出曲线与给定曲线之间相似度,根据各种参数对系统的影响,反复调节试凑。

            1.整定比例部分:先将比例系数Kp由小调到大,直到得到超调小,反应快的响应曲线,当没有静差或者静差已经小到允许范围,确定最优比例系数。

            2.积分环节,先将积分常数Ti为最大值,比例系数略微缩小,然后减少积分时间常数,保持良好的情况下消除静差。

            3.加入微分环节:当使用比例积分控制器能消除静差,但动态过程不满意,再加入微分环节,构成PID控制器,逐步地增大微分时间常数,逐步试凑。

            比例作用:迅速消除误差,加大比例系数,可以减少静差,但不能消除稳态误差,过大容易引起不稳定。

            积分作用:消除静差,但容易引起超调,甚至出现振荡。

            微分作用:减小超调,克服振荡,提高稳定性,改善系统动态特性。

     

    增量式PID公式:

    算法流程图:

     

    PID具体调参方面:

    1. 起初通过按键进行对调参,根据调参原则手动调参,并尝试看看我们采用的驱动方式是否合适
    2. 通过在程序上对参数进行调整。                    

            采用位置方式?PID算法控制流程:初始设定目标转速(对应左右轮子的转速),PID开始响应时将采集电机实际转速与目标转速,比较后得出偏差值E,进而代入PID计算公式得到调整量,即更新后的PWM的占空比,再进行不断调节处理,直至电机转速稳定在一个小范围上下波动。

            为什么采用增量式PID而不选择位置式PID呢?

            增量式PID算法的无需累积增加,控制增量△Uk与最新三次采样值相关;每次只输出控制增量△Uk,则当发生故障时排除故障点范围大大缩小;当控制手动与自动相互切换时其冲击小,基本上可以做到无干扰切换。

     

    展开全文
  • 之前章节已经把PID从理论到时间基本上讲完了,剩下一个位置式PID就能收尾了。赶紧更完,就开始平衡小车下一步制作了。最近也是比较忙,更贴慢了很多。不过,这个零基础教程我还是要坚持写完的。 位置式PID部分主要...

    之前章节已经把PID从理论到时间基本上讲完了,剩下一个位置式PID就能收尾了。赶紧更完,就开始平衡小车下一步制作了。最近也是比较忙,更贴慢了很多。不过,这个零基础教程我还是要坚持写完的。

    位置式PID部分主要代码

    /********************位置式 PID 控制设计************************************/
    unsigned int LocPIDCalc(int NextPoint)
    {
      int iError,dError;
      iError = SetPoint - NextPoint; //求出当前偏差
      SumError += iError; //对偏差进行积分
      dError = iError - LastError; //对偏差求微分
      LastError = iError;		//转换赋值
      
      //返回位置式PID计算结果
      return(Proportion * iError //比例项
      + Integral * SumError //积分项
      + Derivative * dError); //微分项
    }
    

    注释已经很详细了,看了之前我的帖子应该能看的懂代码的。推导过程不明白的在往前看看吧。

    之后在中断中直接调用公式即可,计算出来的结果直接赋值给PWM(计算结果既是PWM,计算出来是0,PWM就是0)

    count=(short)(TIM2 -> CNT/4);   
    TIM2 -> CNT=0;
    /* 计数得到增量式PID的增量数值 */
    PWM_Duty=LocPIDCalc(count); 
    
    //将计算的PWM送入寄存器
    TIM_SetCompare1(TIM3,PWM_Duty);
    

    完事了,是不是很简单。

    位置式PID调参

    位置式PID和增量式PID调参还是有点区别的。下面说下具体调参过程和思路。

    思路还是将ID系数设为0,先调节单独的P。

    1. 当P = 2时,如下图:

    在这里插入图片描述

    是不是有点懵逼,怎么趋近一条直线了?不应该是越来越靠近目标值吗?
    如果你这样想的,那真是还没理解公式呀。仔细看看公式,当ID为0,只有一个P时,是不是应该就是一条直线?下面说下为啥是直线。
    第一次采样:
    假设初始化目标值为100个脉冲,第一次采样测得脉冲为0个,此时误差为100,在乘上系数2,最终占空比为200。
    第二次采样:
    假设采样50个脉冲,误差为50,乘上系数,2,最终得占空比为100.
    第三次采样:
    假设采样脉冲为25,误差为75,乘上系数2,最终占空比为150

    以此循环得出结果:
    误差越大,占空比越大,误差越小,占空比越小,也就是说误差越大输出越大,误差越小,输出越小。在经过N次采样后,会得到一个平衡值、平衡的条件是计算出来的占空比1所对应的编码器输出值被目标值减去之后再乘上P,得出来的占空比2和占空比相同。本例程实际测得当占空比为146,使得编码器输出28个脉冲, 目标值100-28=72,72乘上P系数2=144,144和146非常接近,也就相当于平衡了。因此只有P项时,会输出一条直线。

    1. 当P = 5时,如下图:
      在这里插入图片描述
      此时抖动比较大,不过最终还会趋近直线。这里抖动大,也说明响应速度快,对比增量式PID调节方法,增量式PID调节P时,是将系统在目标值附近抖动两三下之后迅速稳定下来为最佳,我们这里也可以这样来调节,只不过增量式是趋近于目标值,而位置式是趋近于一条直线。

    这里我们选择P=3,如下图:

    在这里插入图片描述

    我们看上图抖动两三下就可以趋近于一条直线,说明这个P差不多可以了。

    1. 当P = 3时,调节I,当P = 3 ,I = 1时如下图:

    在这里插入图片描述

    你会发现曲线会越过目标值,因为加入了历史误差,在第一次未达到目标值期间,累积误差都是为正的,再加上P,使得系统超过目标值。当采样值超过目标之后,累积误差就会出现负值,将会抵消一部分前面的正值误差,因此会出现不对称的情况。之前只有P时,直线上下震动的赋值是对称的,加入累积误差之后,图中横线是目标值,在目标值上方的误差值都为正(因为都是小于目标值,误差=目标值-当前值>0),说明大多数情况都是未能达到目标值。因此系统会慢慢将这些正的误差值加起来代入到系统,会使得系统慢慢趋近于目标值,而不是像上面一样形成一条直线。

    1. 当P = 3 ,I = 2时如下图:

    在这里插入图片描述

    你会发现,斜线更抖了,因为I的作用增强了,响应更快了。

    1. 加入D,当P = 3 ,I = 2,D = -0.1时如下图:
      在这里插入图片描述
      曲线变得很平顺了,没有上一张图中的抖动了,这个效果还是不错的。

    2. 加入D,当P = 3 ,I = 2,D = -2时如下图:
      在这里插入图片描述
      D大了会出现回弹,说明D抑制的太过了。

    因此当P = 3 ,I = 2,D = -0.1使得整体效果最佳。至此,PID完结。

    关注公众号回复
    “位置式PID”
    获取源码。
    在这里插入图片描述

    展开全文
  • 21-2-17 PID调试——增量式PID

    千次阅读 2021-02-17 13:44:00
    21-2-17 PID调试——增量式PID速度PID测试数据 速度PID 速度PID采用增量式PI控制 源码: 内联代码片。 void Motor_Speed_PI(motor_parameter_st *Motorx) { (*Motorx).PID_speed.bias = (*Motorx).actual_speed-(*...
  • 调试增量式PID时遇到的问题

    千次阅读 多人点赞 2020-11-03 22:02:41
    最近因为项目需求,需要用到PID,然后就在网络上翻PID算法,然后就随便找了一个直接用,调试的时候才发现不对劲啊,怎么网上流传的PID参数整定都不管用,然后去深入理解PID算法,才发现掉坑了。 下面是我翻到的源码...
  • 经典PID原理解析,PID参数整定工具书。涵盖了PI、PD、PID等位置式和增量式PID的调试方法。并且结合波形解说,十分适合初学者理解和进一步学习。
  • 当我们给小车设定速度时,自然是希望它能够按照预设的速度运行,但因为外界阻力...谈到闭环控制算法,最经典的当然是PID了,rt-robot 中提供了PID的算法,其中有增量式PID和位置式PID,对于电机的控制,增量式P...
  • 增量式pid分析 及 参数整定

    万次阅读 多人点赞 2017-01-16 14:19:13
    /************************************************************************** 函数功能:增量PI控制器 1.入口参数:编码器测量值,目标...根据增量式离散PID公式 pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k
  • 1、增量PID的原理、增量PID的最后公式 2、增量PID的代码; 3、stm32F4实现调节电机的速度。 1、增量PID 代码 //定义PID结构体 typedef struct { __IO int SetPoint; //设定目标 Desired Value __IO float ...
  • //增量式PID float IncPIDCalc(PID_Typedef* PIDx,float SetValue,float MeaValue,float err)//err»ý·Ö·ÖÀë³£Êý { float index; PIDx->Error = SetValue - MeaValue; if(fabs(PIDx->...
  • 增量式PID控制算法

    万次阅读 2017-05-25 13:52:57
    原转载 blog.ednchina.... 1. 当执行机构需要的不是控制量的绝对值,而是控制量的增量(例如去驱动步进电动机)时,需要用PID的“增量算法”。    增量式PID控制算法可以通过(2-4)式推导出。由(2-4)可以得到
  • 请问所有PID算法的调参过程都是一样的吗,比如增量式PID和位置式PID都是从P开始调吗
  • PID参数理解及调参方法(附典型PID算法程序)

    万次阅读 多人点赞 2019-04-05 22:51:36
    调PID步骤 (1) 确定比例系数Kp 确定比例系数Kp 时,首先去掉PID 的积分项和微分项,可以令Ti=0、Td=0,使之成为 纯比例调节。输入设定为系统允许输出最大值的60%~70%,比例系数Kp 由0 开始逐渐增 大,直至...
  • STM32cubeMX--增量式PID调节电机速度(霍尔编码器)

    万次阅读 多人点赞 2021-05-08 10:32:22
    //当前PWM数值加上增量式PID计算所得 //限制PWM最大范围 if(speed>100)speed = 100; else if(speed)speed = 1; //将PID计算后的PWM写入系统 SetMotorVoltageAndDirection(speed); /* 每隔(5*100...
  • PID增量式算法

    千次阅读 2021-10-13 12:24:02
    ​     这里先提供博主的学习资源:PID算法从理论到实践 小游戏让你秒懂调参技巧 - 软件调参 - FPV帮 - 分享飞行的技巧与乐趣 (fpvbang.com) ​     PID是我们最常见的控制算法之一,全名为(Proportion ...
  • 增量式PID的两种计算方式及C代码

    万次阅读 2019-05-05 09:55:04
    最近笔者在项目中需要使用到增量式PID进行电机控制,参考网上增量式PID算法,发现有两类算法的代码,便产生疑惑,究竟是哪 一种算法是正确的?——最终发现两种表达方式均为正确的! 从原理出发,分析如下: 位置...
  • STM32直流电机PID速度单闭环编程实现PID动态参数调整和运动状态实时显示(增量式PID算法) 1、STM32编程 2、增量式PID算法 3、PID系统构成要件 4、C#上位机编程实现 5、通讯协议解析 6、PID算法编程解析 7、通讯算法...
  • 位置式PID和增量式PID

    2021-05-18 17:21:53
    #1.位置式PID typedef struct { float Kp; //比例系数Proportional float Ki; //积分系数Integral float Kd; //微分系数Derivative float Ek; //当前误差 float Ek1; //前一次误差 e(k
  • 关于增量式PID的代码(C语言)实现的详细说明网上可以找到很多关于增量式PID的一些解释说明;最终都可以得到如下的公式:Δu=Kp·{e(n)-e(n-1)}+Ki·e(n)+Kd·{e(n)-2·e(n-1)+e(n-2)} ;最终转换成代码有很多是...
  • PID介绍 PID调参 串级PID

    万次阅读 多人点赞 2019-06-19 13:44:38
    鉴于串级PID在pixhawk系统中的重要性,无论是误差的补偿,如姿态解算;还是控制的实现,如姿态控制,位置控制,靠的都是串级的pid,这里我们先对串级pid做一个介绍,后面会再接着分析,姿态的控制以及位置的解算和...
  • C语言实现PID算法:位置式PID和增量式PID

    万次阅读 多人点赞 2018-06-26 11:00:30
    大学参加过电子竞赛的朋友都应该玩过电机(或者说循迹小车),我们要控制电机按照设定的速度运转,PID控制在其中起到了关键的作用。 说来惭愧,大学这门课程学的不咋滴,老师讲的课基本没听进去过。直到后面接触...
  • 1、PID算法离散化 在采样周期足够小时,可以作如下近似: u(t)≈u(k)u_{(t)}\approx u_{(k)}u(t)​≈u(k)​ ;e(t)≈e(k)e_{(t)}\approx e_{(k)}e(t)​≈e(k)​ ∫0te(t)dt=∑i=0ke(i)Δt=∑i=0kTe(i)\int_{0}^{t}e_{...
  • 上篇介绍了连续系统的PID算法,但是计算机控制是一种采样控制,他只能根据采样时刻的偏差来计算控制量,因此计算机控制系统中,必须对公式进行离散化,具体就是用求和代替积分,用向后差分来代替微分,使模拟PID离散...
  • 在程序上是跟增量式PID相近的,不同的是PID的参数和PID算法的实现. 1、STM32位置单闭环实现 2、位置式PID算法控制 3、C#上位机调参 4、运行过程上位机同步仿真 一、实现功能 通过上位机观察STM32下位机运行过程...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 969
精华内容 387
关键字:

增量式pid调参

友情链接: jaevmyy3.rar