精华内容
下载资源
问答
  • pid增量式和位置式算法源文件,文章介绍了这两种的优缺点,也贴了一部分代码,完整代码需下载,支持移植
  • 这是本人参考网上的资料,然后总结写下的PID控制算法,属于最基本的版本,对于后期的参数调节,算法使用可根据实际情况做调整。就是赚个辛苦费。
  • 位置PID增量式PID区别浅析

    万次阅读 多人点赞 2019-04-26 08:55:12
    PID 控制器以各种形式使用超过了 1 世纪,广泛应用在机械设备、气动设备 电子设备.在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法 PID 实指“比例 proportional”、“积分 integral...

    1PID控制算法

    什么是PID

    PID 控制器以各种形式使用超过了 1 世纪,广泛应用在机械设备、气动设备 和电子设备.在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法

    PID 实指“比例 proportional”、“积分 integral”、“微分 derivative”,这三项构 成 PID 基本要素。每一项完成不同任务,对系统功能产生不同的影响。它的结构简单,参数易 于调整,是控制系统中经常采用的控制算法。

    PID:比例单元(P)、积分单元(I)和微分单元(D)组成

    PID控制公式

     

    其中:u(t)为控制器输出的控制量;(输出)

    e(t)为偏差信号,它等于给定量与输出量之差;(输入)

    KP 为比例系数;(对应参数 P)

    TI 为积分时间常数;(对应参数I)

    TD 为微分时间常数。(对应参数 D) 

     

    数字 PID 控制算法通常分为位置式 PID 控制算法和增量式 PID 控制算法。  

    位置式 PID 算法 :

    pid算法中位置型和增量型有什么区别,分析两者优缺点

     e(k): 用户设定的值(目标值) -  控制对象的当前的状态值 

    比例P :    e(k)

    积分I :   ∑e(i)     误差的累加

    微分D :  e(k) - e(k-1)  这次误差-上次误差

    也就是位置式PID是当前系统的实际位置,与你想要达到的预期位置的偏差,进行PID控制

    因为有误差积分 ∑e(i),一直累加,也就是当前的输出u(k)与过去的所有状态都有关系,用到了误差的累加值;(误差e会有误差累加),输出的u(k)对应的是执行机构的实际位置,,一旦控制输出出错(控制对象的当前的状态值出现问题 ),u(k)的大幅变化会引起系统的大幅变化

    并且位置式PID在积分项达到饱和时,误差仍然会在积分作用下继续累积,一旦误差开始反向变化,系统需要一定时间从饱和区退出,所以在u(k)达到最大和最小时,要停止积分作用,并且要有积分限幅输出限幅

    所以在使用位置式PID时,一般我们直接使用PD控制

    而位置式 PID 适用于执行机构不带积分部件的对象,如舵机和平衡小车的直立和温控系统的控制

     

    结合代码可以很好理解

    typedef struct PID
    { 
      float P,I,D,limit;
    }PID;
    
    typedef struct Error
    {
      float Current_Error;//当前误差
      float Last_Error;//上一次误差
      float Previous_Error;//上上次误差
    }Error;
    
    /*! 
     *  @brief      位置式PID
     *  @since      v1.0
     *  *sptr :误差参数
     *  *pid:  PID参数
     *  NowPlace:当前位置
     *  Point:   预期位置  
     */
    
    // 位置式PID控制
    float PID_Realize(Error *sptr,PID *pid, int32 NowPlace, float Point)
    {
    
    	int32 iError,	// 当前误差
    		 Realize;   //实际输出	
    
    	iError = Point - NowPlace;	// 计算当前误差
    	sptr->Current_Error += pid->I * iError;	// 误差积分
          sptr->Current_Error = sptr->Current_Error > pid->limit?pid->limit:sptr->Current_Error;//积分限幅
          sptr->Current_Error = sptr->Current_Error <-pid->limit?-pid->limit:sptr->Current_Error;
    	Realize = pid->P * iError       //比例P
                + sptr->Current_Error   //积分I
    			+ pid->D * (iError - sptr->Last_Error);  //微分D
    	sptr->Last_Error = iError;		  	// 更新上次误差
    	return Realize;	// 返回实际值
    }

    增量式PID

     

    pid算法中位置型和增量型有什么区别,分析两者优缺点

    比例P :    e(k)-e(k-1)   这次误差-上次误差

    积分I :   e(i)     误差   

    微分D :  e(k) - 2e(k-1)+e(k-2)   这次误差-2*上次误差+上上次误差

     增量式PID根据公式可以很好地看出,一旦确定了 KP、TI  、TD,只要使用前后三次测量值的偏差, 即可由公式求出控制增量

    而得出的控制量▲u(k)对应的是近几次位置误差的增量,而不是对应与实际位置的偏差     没有误差累加

    也就是说,增量式PID中不需要累加。控制增量Δu(k)的确定仅与最近3次的采样值有关,容易通过加权处理获得比较好的控制效果,并且在系统发生问题时,增量式不会严重影响系统的工作

    总结:增量型 PID,是对位置型 PID 取增量,这时控制器输出的是相邻两次采样时刻所计算的位置值
    之差,得到的结果是增量,即在上一次的控制量的基础上需要增加(负值意味减少)控制量。
     

    typedef struct PID
    { 
      float P,I,D,limit;
    }PID;
    typedef struct Error
    {
      float Current_Error;//当前误差
      float Last_Error;//上一次误差
      float Previous_Error;//上上次误差
    }Error;
    
    /*! 
     *  @brief      增量式PID
     *  @since      v1.0
     *  *sptr :误差参数
     *  *pid:  PID参数
     *  NowPlace:实际值
     *  Point:   期望值
     */
    // 增量式PID电机控制
    int32 PID_Increase(Error *sptr, PID *pid, int32 NowPlace, int32 Point)
    {
    
    	int32 iError,	//当前误差
    		Increase;	//最后得出的实际增量
    
    	iError = Point - NowPlace;	// 计算当前误差
    
    	Increase =  pid->P * (iError - sptr->Last_Error)   //比例P
    			  + pid->I * iError      //积分I
    			  + pid->D * (iError - 2 * sptr->Last_Error + sptr->Previous_Error);  //微分D
    	
    	sptr->Previous_Error = sptr->Last_Error;	// 更新前次误差
    	sptr->Last_Error = iError;		  	// 更新上次误差
    	
    	return Increase;	// 返回增量
    }
    

    增量式与位置式区别:

    1增量式算法不需要做累加,控制量增量的确定仅与最近几次偏差采样值有关,计算误差对控制 量计算的影响较小。而位置式算法要用到过去偏差的累加值,容易产生较大的累加误差。 

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

    3增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。

    4在进行PID控制时,位置式PID需要有积分限幅输出限幅,而增量式PID只需输出限幅

    位置式PID优缺点:

    优点:

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

    缺点:

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

    增量式PID优缺点:

    优点:

    ①误动作时影响小,必要时可用逻辑判断的方法去掉出错数据。
    ②手动/自动切换时冲击小,便于实现无扰动切换。当计算机故障时,仍能保持原值。
    ③算式中不需要累加。控制增量Δu(k)的确定仅与最近3次的采样值有关。


    缺点:

    ①积分截断效应大,有稳态误差;

    ②溢出的影响大。有的被控对象用增量式则不太好;

     

    展开全文
  • 实验六 基于Simulink得位置式与增量式PID仿真 一实验目得: 用Matlab得仿真工具Simulink分别做出数字PID控制器得两种算法(位置式与增量式)进行仿真; 被控对象为一阶惯性环节 D(s) = 1 / (5s+1; 采样周期 T = 1 s; ...
  • 位置pid和增量式pid对比

    千次阅读 2020-04-02 14:43:12
    4在进行PID控制时,位置PID需要有积分限幅输出限幅,而增量式PID只需输出限幅 位置PID优缺点: 优点: ①位置PID是一种非递推式算法,可直接控制执行机构(如平衡小车),u(k)的值执行机构的实际位置(如...

    原文链接:

    https://www.baidu.com/link?url=412uspijfHfdbZm1yInQUK2_wF4Z9MgJR275NycDlmmPKq5N8QdzKL9uBk3xYd8iv1AOB2ZBVq6YHC7TpMuh8OoMyTS0qt3a_tPr8wPPTHW&wd=&eqid=e3ceb4c40016f199000000065e858771

     

     

    1PID控制算法
    什么是PID
    PID 控制器以各种形式使用超过了 1 世纪,广泛应用在机械设备、气动设备 和电子设备.在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法

    PID 实指“比例 proportional”、“积分 integral”、“微分 derivative”,这三项构 成 PID 基本要素。每一项完成不同任务,对系统功能产生不同的影响。它的结构简单,参数易 于调整,是控制系统中经常采用的控制算法。
     

    PID:比例单元(P)、积分单元(I)和微分单元(D)组成

    PID控制公式

     

     

    其中:u(t)为控制器输出的控制量;(输出)

    e(t)为偏差信号,它等于给定量与输出量之差;(输入)

    KP 为比例系数;(对应参数 P)

    TI 为积分时间常数;(对应参数I)

    TD 为微分时间常数。(对应参数 D)

     

    数字 PID 控制算法通常分为位置式 PID 控制算法和增量式 PID 控制算法。

    位置式 PID 算法 :

    pidç®æ³ä¸­ä½ç½®ååå¢éåæä»ä¹åºå«ï¼åæ两èä¼ç¼ºç¹

    e(k): 用户设定的值(目标值) -  控制对象的当前的状态值

    比例P :   e(k)

    积分I :   ∑e(i)     误差的累加

    微分D :  e(k) - e(k-1)  这次误差-上次误差

    也就是位置式PID是当前系统的实际位置,与你想要达到的预期位置的偏差,进行PID控制

    因为有误差积分 ∑e(i),一直累加,也就是当前的输出u(k)与过去的所有状态都有关系,用到了误差的累加值;(误差e会有误差累加),输出的u(k)对应的是执行机构的实际位置,,一旦控制输出出错(控制对象的当前的状态值出现问题 ),u(k)的大幅变化会引起系统的大幅变化

    并且位置式PID在积分项达到饱和时,误差仍然会在积分作用下继续累积,一旦误差开始反向变化,系统需要一定时间从饱和区退出,所以在u(k)达到最大和最小时,要停止积分作用,并且要有积分限幅和输出限幅

    所以在使用位置式PID时,一般我们直接使用PD控制

    而位置式 PID 适用于执行机构不带积分部件的对象,如舵机和平衡小车的直立和温控系统的控制
     

    结合代码可以很好理解

    typedef struct PID
    { 
      float P,I,D,limit;
    }PID;
     
    typedef struct Error
    {
      float Current_Error;//当前误差
      float Last_Error;//上一次误差
      float Previous_Error;//上上次误差
    }Error;
     
    /*! 
     *  @brief      位置式PID
     *  @since      v1.0
     *  *sptr :误差参数
     *  *pid:  PID参数
     *  NowPlace:当前位置
     *  Point:   预期位置  
     */
     
    // 位置式PID控制
    float PID_Realize(Error *sptr,PID *pid, int32 NowPlace, float Point)
    {
     
    	int32 iError,	// 当前误差
    		 Realize;   //实际输出	
     
    	iError = Point - NowPlace;	// 计算当前误差
    	sptr->Current_Error += pid->I * iError;	// 误差积分
          sptr->Current_Error = sptr->Current_Error > pid->limit?pid->limit:sptr->Current_Error;//积分限幅
          sptr->Current_Error = sptr->Current_Error <-pid->limit?-pid->limit:sptr->Current_Error;
    	Realize = pid->P * iError       //比例P
                + sptr->Current_Error   //积分I
    			+ pid->D * (iError - sptr->Last_Error);  //微分D
    	sptr->Last_Error = iError;		  	// 更新上次误差
    	return Realize;	// 返回实际值
    }

     

    增量式PID

    pidç®æ³ä¸­ä½ç½®ååå¢éåæä»ä¹åºå«ï¼åæ两èä¼ç¼ºç¹

    比例P :   e(k)-e(k-1)   这次误差-上次误差

    积分I :   e(i)     误差  

    微分D :  e(k) - 2e(k-1)+e(k-2)   这次误差-2*上次误差+上上次误差

    增量式PID根据公式可以很好地看出,一旦确定了 KP、TI 、TD,只要使用前后三次测量值的偏差, 即可由公式求出控制增量

    而得出的控制量▲u(k)对应的是近几次位置误差的增量,而不是对应与实际位置的偏差     没有误差累加

    也就是说,增量式PID中不需要累加。控制增量Δu(k)的确定仅与最近3次的采样值有关,容易通过加权处理获得比较好的控制效果,并且在系统发生问题时,增量式不会严重影响系统的工作

    总结:增量型 PID,是对位置型 PID 取增量,这时控制器输出的是相邻两次采样时刻所计算的位置值
    之差,得到的结果是增量,即在上一次的控制量的基础上需要增加(负值意味减少)控制量。

     

    typedef struct PID
    { 
      float P,I,D,limit;
    }PID;
    typedef struct Error
    {
      float Current_Error;//当前误差
      float Last_Error;//上一次误差
      float Previous_Error;//上上次误差
    }Error;
     
    /*! 
     *  @brief      增量式PID
     *  @since      v1.0
     *  *sptr :误差参数
     *  *pid:  PID参数
     *  NowPlace:实际值
     *  Point:   期望值
     */
    // 增量式PID电机控制
    int32 PID_Increase(Error *sptr, PID *pid, int32 NowPlace, int32 Point)
    {
     
    	int32 iError,	//当前误差
    		Increase;	//最后得出的实际增量
     
    	iError = Point - NowPlace;	// 计算当前误差
     
    	Increase =  pid->P * (iError - sptr->Last_Error)   //比例P
    			  + pid->I * iError      //积分I
    			  + pid->D * (iError - 2 * sptr->Last_Error + sptr->Previous_Error);  //微分D
    	
    	sptr->Previous_Error = sptr->Last_Error;	// 更新前次误差
    	sptr->Last_Error = iError;		  	// 更新上次误差
    	
    	return Increase;	// 返回增量
    }

    增量式与位置式区别:
    1增量式算法不需要做累加,控制量增量的确定仅与最近几次偏差采样值有关,计算误差对控制 量计算的影响较小。而位置式算法要用到过去偏差的累加值,容易产生较大的累加误差。

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

    3增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。

    4在进行PID控制时,位置式PID需要有积分限幅和输出限幅,而增量式PID只需输出限幅

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

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

    增量式PID优缺点:
    优点:
    ①误动作时影响小,必要时可用逻辑判断的方法去掉出错数据。
    ②手动/自动切换时冲击小,便于实现无扰动切换。当计算机故障时,仍能保持原值。
    ③算式中不需要累加。控制增量Δu(k)的确定仅与最近3次的采样值有关。


    缺点:
    ①积分截断效应大,有稳态误差;

    ②溢出的影响大。有的被控对象用增量式则不太好;
     

    展开全文
  • PID算法:位置PID和增量式PID

    千次阅读 2020-06-27 23:32:15
    口诀 参数整定找最佳, 从小到大顺序查。 先是比例后积分, 最后再把微分加。 曲线振荡很频繁, 比例度盘要放大。 曲线漂浮绕大弯, 比例度盘往小扳。... 曲线波动周期长, ... C语言实现PID算法:位置PID和增量式PID

    口诀

    参数整定找最佳, 从小到大顺序查。
    先是比例后积分, 最后再把微分加。
    曲线振荡很频繁, 比例度盘要放大。
    曲线漂浮绕大弯, 比例度盘往小扳。
    曲线偏离回复慢, 积分时间往下降。
    曲线波动周期长, 积分时间再加长。
    曲线振荡频率快, 先把微分降下来。
    动差大来波动慢, 微分时间应加长。
    理想曲线两个波, 前高后低四比一。
    一看二调多分析, 调节质量不会低。

    ————————————————
    版权声明:本文为CSDN博主「苏守坤」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/u014453443/article/details/100573722

    位置式PID/增量型 PID

    位置式PID是当前系统的实际位置,与你想要达到的预期位置的偏差,进行PID控制;
    增量型 PID,是对位置型 PID 取增量,这时控制器输出的是相邻两次采样时刻所计算的位置值之差,得到的结果是增量,即在上一次的控制量的基础上需要增加(负值意味减少)控制量。

    位置式与增量式

    PID各自作用

    P - 比例部分

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

    /*
    */
    曲线振荡很频繁, 比例度盘要放大。//
    曲线漂浮绕大弯, 比例度盘往小扳。
    

    I - 积分部分

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

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

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

    /*Ti越小,积分累积能力越强
    消除偏差所需的时间也较长*/
    曲线偏离回复慢, 积分时间往下降。
    曲线波动周期长, 积分时间再加长。
    

    D - 微分部分

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

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

    /*偏差变化的越快,微分控制器的输出就越大,
    并能在偏差值变大之前进行修正
    */
    曲线振荡频率快, 先把微分降下来。
    动差大来波动慢, 微分时间应加长。
    

    C语言实现PID算法:位置式PID和增量式PID

    展开全文
  • 利用Verilog语言实现PID增量式控制,输出占空比
  • 位置式与增量式PID

    千次阅读 多人点赞 2019-09-06 09:58:20
    1PID控制算法-----什么是PIDPID 控制器以各种形式使用超过了 1 世纪,广泛应用在机械设备、气动设备 电子设备.在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法 PID 实指“比例 ...

    1PID控制算法-----什么是PID
    PID 控制器以各种形式使用超过了 1 世纪,广泛应用在机械设备、气动设备 和电子设备.在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法

    PID 实指“比例 proportional”、“积分 integral”、“微分 derivative”,这三项构 成 PID 基本要素。每一项完成不同任务,对系统功能产生不同的影响。它的结构简单,参数易 于调整,是控制系统中经常采用的控制算法。

    PID:比例单元(P)、积分单元(I)和微分单元(D)组成

                                                 PID控制公式

                                 

    其中:u(t)为控制器输出的控制量;(输出)

    e(t)为偏差信号,它等于给定量与输出量之差;(输入)

    KP 为比例系数;(对应参数 P)

    TI 为积分时间常数;(对应参数I)

    TD 为微分时间常数。(对应参数 D) 

     

    数字 PID 控制算法因时间离散化不同,通常分为位置式 PID 控制算法和增量式 PID 控制算法。  

    位置式 PID 算法 :

                        


     e(k): 用户设定的值(目标值) -  控制对象的当前的状态值 

    比例P :    e(k)

    积分I :   ∑e(i)     误差的累加(包括e(k))

    微分D :  e(k) - e(k-1)  这次误差-上次误差

    也就是位置式PID是当前系统的实际位置,与你想要达到的预期位置的偏差,进行PID控制

    因为有误差积分 ∑e(i),一直累加,也就是当前的输出u(k)与过去的所有状态都有关系,用到了误差的累加值;(误差e会有误差累加),输出的u(k)对应的是执行机构的实际位置,,一旦控制输出出错(控制对象的当前的状态值出现问题 ),u(k)的大幅变化会引起系统的大幅变化

    并且位置式PID在积分项达到饱和时,误差仍然会在积分作用下继续累积,一旦误差开始反向变化,系统需要一定时间从饱和区退出,所以在u(k)达到最大和最小时,要停止积分作用,并且要有积分限幅和输出限幅

    所以在使用位置式PID时,一般我们直接使用PD控制

    而位置式 PID 适用于执行机构不带积分部件的对象,如舵机和平衡小车的直立和温控系统的控制

    根据公式结合代码可以很好理解

    //pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]
    typedef struct PID
    { 
      float kp;
      float ki;
      float kd;
      float ek;     //当前误差
      float ek_1;   //上一次误差
      float ek_sum; //误差总和
      float limit;  //限幅
    }PID;
    
    static PID pid;
    
    void PID_Init()
    {
        pid.kp = 0.1;
        pid.ki = 0.2;
        pid.kd = 0.3;
        pid.limit = 1000;
        pid.ek = 0;
        pid.ek_1 = 0;
        pid.ek_sum = 0;
    }
    
    // 位置式PID控制
    float PID_Postion(int Encoder,int Target)
    {
        float pwm = 0;
        pid.ek = Target - Encoder; // 计算当前误差
        pid.ek_sum += pid.ek;      //求出偏差的积分
        pwm = pid.kp*pid.ek + pid.ki*pid.ek_sum + pid.kd*(pid.ek - pid.ek_1);   //位置式PID控制器
        pid.ek_1 = pid.ek;   //保存上一次偏差 
        if(pwm > pid.limit)
        {
          pwm =  pid.limit;
        }
        else if(pwm < -pid.limit)
        {
          pwm =  -pid.limit;
        }
        return pwm;
    }
    

    有不明所以然的小朋友会问,在将PID用于电机控制时,我这个PID的输入参数是编码器的数值、目标位置,我的输出PWM是个什么东西呢?这个PWM可以是-1---+1的占空比,也可以是比较寄存器的数值,例如ARR是3000,PWM这个可以是1500,代表PWM占空比50%,那有的会问,例如我的encoder是1000,target是2000,那么pid.ek = 1000,按照pid.kp = 10计算,那么pid.kp*pid.ek = 10000,也就是说这个输出pwm如果代表占空比-1--+1的话,远远大于它的范围,那是不是这个计算或者公式有问题呢?或者是不是pwm代表的意义不对呢?其实是没有关系的,因为按照计算10000大于1,PWM=1,那么完全按照占空比1运行,等到encoder=target时,pwm=0,电机就不再运动了,到达了目标位置;但是这里要提醒大家,encoder与target代表编码器数值,二者的差值肯定是整数,乘以pid.kp=10之后,肯定大于1,所以PWM始终是100%占空比,这样有可能时钟无法找到目标位置,所以pid.kp=10这个参数设置就不合理,比如设置pid.kp=0.001,则encoder与target差值如果在1000以内,PWM就可能在-1--+1之间,这样才能真正的起到调节作用,所以kp的值并不是大家随意乱设,要根据控制量的实际情况、输出值的实际意义,设定参数,脱离实际意义的盲目瞎设参数反而适得其反。

    增量式PID

    比例P :    e(k)-e(k-1)   当前误差 - 上次误差

    积分I :   e(i)     当前误差   

    微分D :  e(k) - 2e(k-1)+e(k-2)   当前误差 - 2*上次误差 + 上上次误差

     增量式PID根据公式可以很好地看出,一旦确定了 KP、TI  、TD,只要使用前后三次测量值的偏差, 即可由公式求出控制增量

    而得出的控制量

    u(k)对应的是近几次位置误差的增量,而不是对应与实际位置的偏差 没有误差累加

    也就是说,增量式PID中不需要累加。控制增量Δu(k)的确定仅与最近3次的采样值有关,容易通过加权处理获得比较好的控制效果,并且在系统发生问题时,增量式不会严重影响系统的工作

    总结:增量型 PID,是对位置型 PID 取增量,这时控制器输出的是相邻两次采样时刻所计算的位置值
    之差,得到的结果是增量,即在上一次的控制量的基础上需要增加(负值意味减少)控制量。

    代码实现效果如下:

    //根据增量式离散PID公式 
    //pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
    //e(k)代表本次偏差 
    //e(k-1)代表上一次的偏差  以此类推 
    //e(k-2)代表上上次的偏差
    //pwm代表增量输出
    
    typedef struct PID
    { 
      float kp;
      float ki;
      float kd;
      float ek;     //当前误差
      float ek_1;   //上一次误差
      float ek_2;   //上上一次误差
      float limit;  //限幅
    }PID;
    
    static PID pid;
    
    void PID_Init()
    {
        pid.kp = 0.1;
        pid.ki = 0.2;
        pid.kd = 0.3;
        pid.limit = 1000;
        pid.ek = 0;
        pid.ek_1 = 0;
        pid.ek_2 = 0;
    }
    
    // 增量式PID控制
    float PID_Increase(int Encoder,int Target)
    {
        float pwm = 0;
        pid.ek = Target - Encoder; // 计算当前误差
        pid.ek_sum += pid.ek;      //求出偏差的积分
        pwm = pid.kp*(pid.ek - pid.ek_1) + pid.ki*pid.ek + pid.kd*(pid.ek - 2*pid.ek_1 + pid.ek_2);   //增量式PID控制器
        pid.ek_1 = pid.ek;   //保存上一次偏差 
        pid.ek_2 = pid.ek_1; //保存上上一次的偏差
        if(pwm > pid.limit)
        {
          pwm =  pid.limit;
        }
        else if(pwm < -pid.limit)
        {
          pwm =  -pid.limit;
        }
        return pwm;
    }
    

    增量式与位置式区别:


    1 增量式算法不需要做累加,控制量增量的确定仅与最近几次偏差采样值有关,计算误差对控制 量计算的影响较小。而位置式算法要用到过去偏差的累加值,容易产生较大的累加误差。 

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

    3 增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。

    4 在进行PID控制时,位置式PID需要有积分限幅和输出限幅,而增量式PID只需输出限幅

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

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

    增量式PID优缺点:
    优点:
    ①误动作时影响小,必要时可用逻辑判断的方法去掉出错数据。
    ②手动/自动切换时冲击小,便于实现无扰动切换。当计算机故障时,仍能保持原值。
    ③算式中不需要累加。控制增量Δu(k)的确定仅与最近3次的采样值有关。


    缺点:
    ①积分截断效应大,有稳态误差;

    ②溢出的影响大。有的被控对象用增量式则不太好;

    参数整定


    首先我们需要明确我们的控制目标,也就是满足控制系统的 3 个要求:

    稳定性
    快速性
    准确性
    具体的评估指标有最大超调量、上升时间、静差等。 
    最大超调量是响应曲线的最大峰值与稳态值的差,是评估系统稳定性的一个重要指标;上升时间是指响应曲线从原始工作状态出发,第一次到达输出稳态值所需的时间,是评估系统快速性的一个重要指标;静差是被控量的稳定值与给定值之差,一般用于衡量系统的准确性,具体可以参考前文的讲解。 
    在实践生产工程中,不同的控制系统对控制器效果的要求不一样。比如平衡车、倒立摆对系统的快速性要求很高,响应太慢会导致系统失控。智能家居里面的门窗自动开合系统,对快速性要求就不高,但是对稳定性和准确性的要求就很高,所以需要严格控制系统的超调量和静差。所以 PID 参数在不同的控制系统中是不一样的。只要我们理解了每个 PID 参数的作用,我们就可以应对工程中的各种项目的 PID 参数整定了。 
    一般而言,一个控制系统的控制难度,一般取决于系统的转动惯量和对响应速度的要求等。转动惯量越小、对响应速度要求越低,PID 参数就越不敏感。比如现在我们控制电机转 90°,需要严格控制超调量、和静差。但是对响应速度无要求。因为电机处于轻载的情况下,转动惯量很小,这是一个很容易完成的工作。根据上面的理论分析和实践,因为响应速度无要求,一般 P 应该给小一点,然后加大系统的阻尼防止超调,也就是 D 参数尽量大,另外因为 P 值较小,应该加入I 控制减小静差。
     

    参数调节口诀

                       参数整定找最佳, 从小到大顺序查。
                        先是比例后积分, 最后再把微分加。
                        曲线振荡很频繁, 比例度盘要放大。
                        曲线漂浮绕大弯, 比例度盘往小扳。
                        曲线偏离回复慢, 积分时间往下降。
                        曲线波动周期长, 积分时间再加长。
                        曲线振荡频率快, 先把微分降下来。
                        动差大来波动慢, 微分时间应加长。
                        理想曲线两个波, 前高后低四比一。
                        一看二调多分析, 调节质量不会低。
     

    展开全文
  • 位置和增量式PID.pdf

    2020-07-22 11:17:55
    pid的一些介绍,希望对大家有帮助,这个资源是网上的,分享给大家供参考学习,非商业使用,希望大家一起学习进步
  • 位置和增量式PID算法

    千次阅读 2018-11-01 21:33:05
    一、PID框图: 模拟的PID公式 u(t)=Kp[e(t)+1Ti∫0te(t)dt+Tdde(t)dt]u(t) = Kp [e(t) + \frac{1}{Ti} \int ^t_0 e(t) dt + Td \frac {de(t)}{dt} ]u(t)=Kp[e(t)+Ti1​∫0t​e(t)dt+Tddtde(t)​] 将PID...
  • 本文从数字化实现的角度理解PI(proportional integral, PI)环节,为数字化实现PI打下基础。... 参考文献 [1] PID控制器参数整定方法及其应用研究, 浙江大学硕士, 何芝强, 2005 扩充材料 增量式PID控制——百度百科
  • 位置PID增量式PID代码实现(python一、PID控制器简介二、一阶惯性环节三、位置PID3.1 简介3.2 python程序四、增量式PID4.1简介4.2 python程序五、几种控制效果对比 一、PID控制器简介 PID(P比例,I积分,D微分)...
  • 位置PID增量式PID的介绍代码实现

    千次阅读 多人点赞 2019-12-22 11:26:30
    PID分为位置PID增量式PID。 一、位置PID 1、表达式为: 2、缺点: 1)、由于全量输出,所以每次输出均与过去状态有关,计算时要对ek进行累加,工作量大; 2)、因为计算机输出的uk对应的是执行机构的...
  • /************************************************************************** 函数功能:增量PI控制器 ...根据增量式离散PID公式 pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)] e(k)代表本次偏差 e(...
  • C语言实现的PID控制器,包含位置和增量式C语言实现方式,文件包含头文件和源文件,添加到自己工程里就可以调用使用了。
  • 包含了delphi源码,pid自动控制水箱水位。可以查看实时曲线。包含了两种pid的算法.在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握PID算法的设计与实现过程,对于一般...
  • PID控制分类 一、位置式离散PID 公式:PWM=Kpe(k)+KiΣe...位置式PID,通俗易懂就是控制系统位置的,而位置式PID的输出也是同样是时时根据你的实际位置输出的量,也就是说你的pwm输出是对应执行机构的实际位置的 位...
  • PID-增量式PID和位置PID算法实现和PID库(51单片机+STM32+arduino完成).zip 分别用51单片机+STM32+arduino写的
  • 增量式PID的matlab实现,是simulinks仿真实现,网上的一般为位置式的PID增量式PID的simulinks仿真我自己也找了很久,最终自己做了一个能用的
  • 增量式PID和位置PID控制算法及各自的离散表达式及两者算法的区别。
  • PID控制及位置式与增量式区别

    千次阅读 2017-08-10 14:54:37
  • 1.增量式PID Error=Set_Value - Current_Value; result= p * (Error- LastError) + i * Error + d * (Error- 2*LastError+ PrevError); PrevError= LastError; La...
  • 数字 PID 控制算法通常分为位置PID 控制算法和增量式 PID 控制算法 一、位置PID 算法 : e(k): 用户设定的值(目标值) - 控制对象的当前的状态值 比例P : e(k) 积分I : ∑e(i) 误差的累加 微分D : e(k) -...
  • Matlab增量式PID算法仿真 ,包含m文件simulink仿真文件,希望对大家有帮助
  • 位置PID控制和增量式PID控制仿真

    热门讨论 2009-04-26 20:47:45
    这个是“计算机控制”课上的一些仿真,是用simulink做的。希望可以帮助到大家。 我要说明一下,这个是MATLAB7.0版本的。低版本(6.5)可能会打不开……
  • 通过PWM输入调整,进行滤波的源程序,只需自行添加头文件
  • 增量式PID-STM32实现,介绍了整个增量式PID功能实现过程,主要包括PWM输出捕获、增量式PID实现代码。 结合51单片机arduino完成步进电机,通过PID算法控制步进电机。附件内容包括:PID控制步进电机代码库文件、...
  • PID算法及原理详解,包含增量式PID位置PID,梯度PID,专家PID,模糊算法等,从普通PID原型到专家PID逐步优化原理及代码,包含初级到高阶算法
  • 描述了位置PID控制与增量式PID控制的比较,根据比较结果,增量式PID控制较适合于执行机构带积分部件的对象,如步进电机,充电机等

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,318
精华内容 3,327
关键字:

pid位置式和增量式