精华内容
下载资源
问答
  • 位置式pid
    2021-05-19 11:40:16

    描述

    位置式PID的C语言写法详解

    PID调节口诀:

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

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

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

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

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

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

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

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

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

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

    143e6b1b7d2b4c70d0796ec306e8afe9.png

    e8e18c86b811c49fe2cee209bff1dc57.png

    908297d16da1516e72603783a5aacd49.png

    下面以PID调节器为例,具体说明经验法的整定步骤:

    A.、让调节器参数积分系数S0=0,实际微分系数k=0,控制系统投入闭环运行,由小到大改变比例系数S1,让扰动信号作阶跃变化,观察控制过程,直到获得满意的控制过程为止。

    B、取比例系数S1为当前的值乘以0.83,由小到大增加积分系数S0,同样让扰动信号作阶跃变化,直至求得满意的控制过程。

    C、积分系数S0保持不变,改变比例系数S1,观察控制过程有无改善,如有改善则继续调整,直到满意为止。否则,将原比例系数S1增大一些,再调整积分系数S0,力求改善控制过程。如此反复试凑,直到找到满意的比例系数S1和积分系数S0为止。

    D、引入适当的实际微分系数k和实际微分时间TD,此时可适当增大比例系数S1和积分系数S0。和前述步骤相同,微分时间的整定也需反复调整,直到控制过程满意为止。

    PID参数是根据控制对象的惯量来确定的。大惯量如:大烘房的温度控制,一般P可在10以上,I=3-10,D=1左右。小惯量如:一个小电机带一台水泵进行压力闭环控制,一般只用PI控制。P=1-10,I=0.1-1,D=0,这些要在现场调试时进行修正的。

    PID参数的设置的大小,一方面是要根据控制对象的具体情况而定;另一方面是经验。P是解决幅值震荡,P大了会出现幅值震荡的幅度大,但震荡频率小,系统达到稳定时间长;I是解决动作响应的速度快慢的,I大了响应速度慢,反之则快;D是消除静态误差的,一般D设置都比较小,而且对系统影响比较小。对于温度控制系统P在5-10%之间;I在180-240s之间;D在30以下。对于压力控制系统P在30-60%之间;I在30-90s之间;D在30以下。

    这里介绍一种经验法。这种方法实质上是一种试凑法,它是在生产实践中总结出来的行之有效的方法,并在现场中得到了广泛的应用。

    这种方法的基本程序是先根据运行经验,确定一组调节器参数,并将系统投入闭环运行,然后人为地加入阶跃扰动(如改变调节器的给定值),观察被调量或调节器输出的阶跃响应曲线。若认为控制质量不满意,则根据各整定参数对控制过程的影响改变调节器参数。这样反复试验,直到满意为止。

    经验法简单可靠,但需要有一定现场运行经验,整定时易带有主观片面性。当采用PID调节器时,有多个整定参数,反复试凑的次数增多,不易得到最佳整定参数。

    PID是比例,积分,微分的缩写。

    比例调节作用:是按比例反应系统的偏差,系统一旦出现了偏差,比例调节立即产生调节作用用以减少偏差。比例作用大,可以加快调节,减少误差,但是过大的比例,使系统的稳定性下降,甚至造成系统的 不稳定。

    积分调节作用:是使系统消除稳态误差,提高无差度。因为有误差,积分调节就进行,直至无差,积分调节停止,积分调节输出一常值。积分作用的强弱取决与积分时间常数Ti,Ti越小,积分作用就越强。反之Ti大则积分作用弱,加入积分调节可使系统稳定性下降,动态响应变慢。积分作用常与另两种调节规律结合,组成PI调节器或PID调节器。

    微分调节作用:微分作用反映系统偏差信号的变化率,具有预见性,能预见偏差变化的趋势,因此能产生超前的控制作用,在偏差还没有形成之前,已被微分调节作用消除。因此,可以改善系统的动态性能。在微分时间选择合适情况下,可以减少超调,减少调节时间。微分作用对噪声干扰有放大作用,因此过强的加微分调节,对系统抗干扰不利。此外,微分反应的是变化率,而当输入没有变化时,微分作用输出为零。微分作用不能单独使用,需要与另外两种调节规律相结合,组成PD或PID控制器。

    位置式PID算法的C语言代码

    typedef struct{

    float limit; //输出限幅

    float target; //目标量

    float feedback; //反馈量

    float Kp;

    float Ki;

    float Kd;

    float eSum;

    float e0; //当前误差

    float e1; //上一次误差

    }PIDType;

    #define max(a, b) (a〉b? a:b)

    #define min(a, b) (a《b? a:b)

    #define range(x, a, b) (min(max(x, a), b))

    float pid_pos_update(PIDType *p)

    {

    float pe, ie, de;

    float out=0;

    //计算当前误差

    p-〉e0 = p-〉target - p-〉feedback;

    //误差积分

    p-〉eSum += p-〉e0;

    //误差微分

    de = p-〉e0 - p-〉e1;

    pe = p-〉e0;

    ie = p-〉eSum;

    p-〉e1 = p-〉e0;

    out = pe*(p-〉Kp) + ie*(p-〉Ki) + de*(p-〉Kd);

    //输出限幅

    out = range(out, -p-〉limit, p-〉limit);

    return out;

    }

    打开APP阅读更多精彩内容

    点击阅读全文

    更多相关内容
  • 数字位置式PID算法,,,,,,,,,
  • 位置式PID控制算法讲解,讲解非常简单易懂,明确。 PID控制是一种在工业生产中应用最广泛的控制方法,其最大的优点是不需要了解被控对象精确的数学模型,进行复杂的理论计算。只需要在线根据被控变量与给定值之间的...
  • PID-增量式PID和位置式PID算法实现和PID库(51单片机+STM32+arduino完成).zip 分别用51单片机+STM32+arduino写的
  • 位置式PID控制算法流程  (1)包含必要的头文件及定义程序需要的结构。  : window._bd_share_config = { "common": { "bdSnsKe
  • 参数的PID计算_pid结构*。这个函数使用pid位置形式方程,并合并一个积分预防算法。用了矩形积分,所以这个函数必须在一致的时间基础上重复,以确保准确控制。为pid循环返回新的输出值。
  • 位置式PID算法实现,C语言实现,源码来自老外。 增量式PID-STM32实现,介绍了整个增量式PID功能实现过程,主要包括PWM输出和捕获、增量式PID实现代码。 结合51单片机arduino完成步进电机,通过PID算法控制步进电机。...
  • PID算法程序—位置式PID控制算法.pdf
  • 位置式PID的C语言实现

    2018-03-13 09:40:17
    用C语言实现了PID位置式算法,并进行简单的测试。该算法可直接应用于温度控制或者各种非线性滞后式系统
  • Pid调控代码 使用位置式PID 来进行电机转速的调控
  • 位置式PID与增量式PID区别浅析

    万次阅读 多人点赞 2019-04-26 08:55:12
    1PID控制算法 什么是PID PID 控制器以各种形式使用超过了 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 算法 :

    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算法
  • 连续控制系统中的PID控制规律是:  其中,Kp为比例系数,Ti为积分时间常数,Td为微分时间常数,u0是边差为O时的控制作用,是控制量的...为书写方便,将e(k)简化成e(k)得到位置式算式:  k:采样信号\uff0ck=
  • 增量式PID和位置式PID控制算法及各自的离散表达式及两者算法的区别。
  • 一、PID控制算法概述 PID 实指“比例 proportional”、“积分 integral”、“微分 derivative”,这三项构 成 ...一、增量式PID 比例P : e(k)-e(k-1) 这次误差-上次误差 积分I : e(i) 误差 微分D : e(k) - 2e(k-1)+e(k

    一、PID控制算法概述
    PID 实指“比例 proportional”、“积分 integral”、“微分 derivative”,这三项构 成 PID 基本要素。每一项完成不同任务,对系统功能产生不同的影响。它的结构简单,参数易 于调整,是控制系统中经常采用的控制算法。
    PID:比例单元(P)、积分单元(I)和微分单元(D)组成
    在这里插入图片描述
    一、增量式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 取增量,这时控制器输出的是相邻两次采样时刻所计算的位置值
    之差,得到的结果是增量,即在上一次的控制量的基础上需要增加(负值意味减少)控制量。

    struct inc_pid_controller
    {
        struct controller   controller;
        
        float               kp;
        float               ki;
        float               kd;
    
        float               minimum;
        float               maximum;
    
        float               p_error;
        float               i_error;
        float               d_error;
    
        float               error;
        float               error_l;
        float               error_ll;
    
        float               last_out;
        rt_tick_t           last_time;
    };
    
    static rt_err_t inc_pid_controller_update(void *pid, float current_point)
    {
        inc_pid_controller_t inc_pid = (inc_pid_controller_t)pid;
        // TODO
        if((rt_tick_get() - inc_pid->last_time) < rt_tick_from_millisecond(inc_pid->controller.sample_time))
        {
            LOG_D("PID waiting ... ");
            return RT_EBUSY;
        }
        inc_pid->last_time = rt_tick_get();
    
        inc_pid->error = inc_pid->controller.target - current_point;
    
        inc_pid->p_error = inc_pid->kp * (inc_pid->error - inc_pid->error_l);
        inc_pid->i_error = inc_pid->ki * inc_pid->error;
        inc_pid->d_error = inc_pid->kd * (inc_pid->error - 2 * inc_pid->error_l + inc_pid->error_ll);
    
        inc_pid->last_out += inc_pid->p_error + inc_pid->i_error + inc_pid->d_error;
    
        if (inc_pid->last_out > inc_pid->maximum)
        {
            inc_pid->last_out = inc_pid->maximum;
        }
        if (inc_pid->last_out < inc_pid->minimum)
        {
            inc_pid->last_out = inc_pid->minimum;
        }
    
        inc_pid->error_ll = inc_pid->error_l;
        inc_pid->error_l = inc_pid->error;
    
        inc_pid->controller.output = inc_pid->last_out;
    
        return RT_EOK;
    }
    

    二、位置式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 适用于执行机构不带积分部件的对象,如舵机和平衡小车的直立和温控系统的控制

    struct pos_pid_controller
    {
        struct controller   controller;
        
        float               kp;
        float               ki;
        float               kd;
    
        float               minimum;
        float               maximum;
        float               anti_windup_value;
    
        float               p_error;
        float               i_error;
        float               d_error;
    
        float               integral;
        float               error;
        float               error_l;
    
        float               last_out;
        rt_tick_t           last_time;
    };
    
    static rt_err_t pos_pid_controller_update(void *pid, float current_point)
    {
        pos_pid_controller_t pos_pid = (pos_pid_controller_t)pid;
    
        if((rt_tick_get() - pos_pid->last_time) < rt_tick_from_millisecond(pos_pid->controller.sample_time))
        {
            LOG_D("PID waiting ... ");
            return RT_EBUSY;
        }
        pos_pid->last_time = rt_tick_get();
    
        pos_pid->error = pos_pid->controller.target - current_point;
    
        pos_pid->integral += pos_pid->ki * pos_pid->error;
    
        //Perform integral value capping to avoid internal PID state to blows up
        //when controllertuators saturate:
        if(pos_pid->integral > pos_pid->anti_windup_value) {
            pos_pid->integral = pos_pid->anti_windup_value;
        } else if (pos_pid->integral < -pos_pid->anti_windup_value) {
            pos_pid->integral = -pos_pid->anti_windup_value;
        }
    
        pos_pid->p_error = pos_pid->kp * pos_pid->error;
        pos_pid->i_error = pos_pid->integral;
        pos_pid->d_error = pos_pid->kd * (pos_pid->error - pos_pid->error_l);
    
        pos_pid->last_out = pos_pid->p_error + pos_pid->i_error + pos_pid->d_error;
        if (pos_pid->last_out > pos_pid->maximum)
        {
            pos_pid->last_out = pos_pid->maximum;
        }
        if (pos_pid->last_out < pos_pid->minimum)
        {
            pos_pid->last_out = pos_pid->minimum;
        }
    
        pos_pid->error_l = pos_pid->error;
    
        pos_pid->controller.output = pos_pid->last_out;
    
        return RT_EOK;
    }
    
    展开全文
  • 位置式PID源码
  • bengai.zip_位置式PID

    2022-07-14 15:56:53
    包含位置式PID算法、积分分离式PID,插值与拟合,解方程,数据分析,主要是基于mtlab的程序。
  • 包含了delphi源码,pid自动控制水箱水位。可以查看实时曲线。包含了两种pid的算法.在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握PID算法的设计与实现过程,对于一般...
  • 位置式PID与增量式PID区别浅析 Z小旋 2019-04-26 08:55:12 59882 收藏 713 分类专栏: NXP智能车学习 文章标签: 位置式PID PID 增量式PID 版权 1PID控制算法 什么是PID PID 控制器以各种形式使用超过了 1 世纪,...

    位置式PID与增量式PID区别浅析

    Z小旋 2019-04-26 08:55:12  59882  收藏 713
    分类专栏: NXP智能车学习 文章标签: 位置式PID 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)     误差的累加

    微分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
     

    比例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次的采样值有关。


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

    ②溢出的影响大。有的被控对象用增量式则不太好;
    ————————————————
    版权声明:本文为CSDN博主「Z小旋」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/as480133937/article/details/89508034

    增量式PID控制(百度百科)

     编辑 讨论 上传视频

    本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。

    增量式PID控制,数字PID控制算法的一种基本形式,是通过对控制量的增量(本次控制量和上次控制量的差值)进行PID控制的一种控制算法

    中文名

    增量式PID控制

    外文名

    Increment PID Control

    基本概念

    对控制量的增量进行PID控制

    相关概念

    位置式PID控制

    相关领域

    控制理论、自动化、计算机控制

    主要优点

    占用内存少、容错能力高

    目录

    1. 基本概念
    2. ▪ PID控制
    3. ▪ 模拟PID控制
    4. ▪ 数字PID控制
    5. ▪ 位置式PID控制
    6. ▪ 增量式PID控制
    1. 公式表示
    2. ▪ 连续PID控制
    3. ▪ 离散PID控制
    4. ▪ 增量式PID控制
    5. PID控制的特点
    1. ▪ P控制
    2. ▪ I控制
    3. ▪ D控制
    4. 增量式PID控制

    基本概念

    编辑

    PID控制

    PID控制,即比例-积分-微分控制,是自动控制原理中定义的一种控制方法,也可以称为是校正方法 [1]  

    PID控制主要是对系统偏差进行比例、积分、微分三种操作并线性组合成控制量,以减小系统误差,提高系统响应速度和响应效果。

    模拟PID控制

    传统的PID控制是模拟PID控制,即通过现场检测仪表、控制仪表、执行器等直接对模拟信号如液位、流速、温度、位置等物理量进行PID控制 [2]  

    数字PID控制

    数字PID控制是把现场的控制变量的模拟信号和对现场受控变量的输出信号均转换成了数字信号,PID的实现也是通过数字信号的设定来完成的。数字PID控制大多在DCSPLC等计算机系统内完成的 [3]  。

    数字PID控制的两种基本形式是位置式PID控制和增量式PID控制。

    位置式PID控制

    位置式PID控制是指在积分环节,对从0时刻到当前时刻的所有偏差进行积分,是非递推式的全局积分。

    增量式PID控制

    和位置式PID控制不同,增量式PID控制将当前时刻的控制量和上一时刻的控制量做差,以差值为新的控制量,是一种递推式的算法。

    公式表示

    编辑

    连续PID控制

    对模拟信号进行的模拟PID控制,也可以称作连续PID控制,微分表示为:

     

    式中,Kp为比例系数,Ti为积分时间常数,Td为微分时间常数。对上式进行拉氏变换:

     

    PID控制器的传递函数为:

     

    离散PID控制

    对连续PID控制以一定离散化方法离散后就可以得到数字PID控制,离散的本质是采样,假设采样为周期采样,采样周期为T,离散自变量为n,则离散PID控制可以表示为:

     

    上式也表示出了位置式PID控制算法。

    增量式PID控制

    根据位置式PID控制公式,写出n-1时刻的控制量:

     

     

    得到

     

     

    为积分系数;

    为微分系数,可以将上式简化为

     

    PID控制的特点

    编辑

    比例、积分、微分控制各有所长,根据实际需求对几种控制律加以结合,一般采用PI、PD或者PID控制 [1]  。

    P控制

    P(比例)控制实质上是一个可调增益放大器,只改变被调信号的幅值而不改变相位。加大增益可以提高系统开环增益,减小系统稳态误差,提高控制精度,但P控制不能消除稳态误差,且大增益会降低系统相对稳定性,甚至造成系统不稳定。

    I控制

    I(积分)控制可以消除稳态误差,但控制作用慢,有可能降低系统稳定性。

    D控制

    D(微分)控制可以超前控制,动作十分迅速,可以改善滞后的情况,但不能消除稳态误差,且当出现脉冲时容易有过激动作,而在恒差时不动作。

    增量式PID控制

    编辑

    增量式PID控制主要是通过求出增量,将原先的积分环节的累积作用进行了替换,避免积分环节占用大量计算性能和存储空间。

    增量式PID控制的主要优点为:

    ①算式中不需要累加。控制增量Δu(k)的确定仅与最近3次的采样值有关,容易通过加权处理获得比较好的控制效果;

    ②计算机每次只输出控制增量,即对应执行机构位置的变化量,故机器发生故障时影响范围小、不会严重影响生产过程;

    ③手动—自动切换时冲击小。当控制从手动向自动切换时,可以作到无扰动切换 [2]  。

    由于增量式需要对控制量进行记忆,所以对于不带记忆装置的系统,只能使用位置式PID控制方式进行控制。

    https://baike.baidu.com/item/%E5%A2%9E%E9%87%8F%E5%BC%8FPID%E6%8E%A7%E5%88%B6/20861314?fr=aladdin

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

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

    千次阅读 2021-10-21 21:46:50
    位置式PID与增量式PID代码实现(python一、PID控制器简介二、一阶惯性环节三、位置式PID3.1 简介3.2 python程序四、增量式PID4.1简介4.2 python程序五、几种控制效果对比 一、PID控制器简介 PID(P比例,I积分,D微分)...
  • 也就是位置式PID是当前系统的实际位置,与你想要达到的预期位置的偏差,进行PID控制 因为有误差积分 ∑e(i),一直累加,也就是当前的输出u(k)与过去的所有状态都有关系,用到了误差的累加值;(误
  • 连续控制系统中的PID控制规律是:  其中,Kp为比例系数,Ti为积分时间常数,Td为微分时间常数,u0是边差为O时的控制作用,是控制量的...为书写方便,将e(k)简化成e(k)得到位置式算式:  k:采样信号\uff0ck=
  • 课程设计时编写的matlab程序代码,包含位置式PID算法、积分分离式PID,给出接收信号眼图及系统仿真误码率。
  • 位置式PID控制原理

    2015-02-23 15:22:33
    位置式PID控制原理
  • 感应双馈发电机系统的仿真,包含位置式PID算法、积分分离式PID,LZ复杂度反映的是一个时间序列中。
  • 位置式pid的源代码,pid调节,抗积分饱和,专家pid
  • 增量式PID和位置式PID算法实现和PID库(51单片机+STM32+arduino)
  • 位置式PID控制算法

    2015-08-19 19:53:37
    struct PID_Data { struct { float uc; //输入命令值 float y; //实际测量值 float u; //实际控制器输出值 float v; //控制器输出的一个比较值 }Signals; struct { float P; //比例...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 49,719
精华内容 19,887
关键字:

位置式pid

友情链接: ImageDisaplay.rar