zoukankan      html  css  js  c++  java
  • 增量式pid和位置式PID参数整定过程对比

    //增量式PID
    float IncPIDCalc(PID_Typedef* PIDx,float SetValue,float MeaValue)//err»ý·Ö·ÖÀë³£Êý
    {
    	
    	PIDx->Error = SetValue - MeaValue;
    
    	PIDx->PWM_Inc = (PIDx->P * (PIDx->Error - PIDx->PreError)) 
    			+ (PIDx->I * PIDx->Error) 
    			+ (PIDx->D * ((PIDx->Error - PIDx->PreError) - (PIDx->PreError - PIDx->PrePreError)));
    	PIDx->PrePreError = PIDx->PreError;
    	PIDx->PreError = PIDx->Error;
    	
    	return PIDx->PWM_Inc ;
    }
    
    //位置式PID
    float LocPIDCalc(PID_Typedef* PIDx,float SetValue,float MeaValue) { u8 Index=1; PIDx->Error = SetValue - MeaValue; Intergral_Error+=PIDx->Error; if(abs(PIDx->Error)>250)//积分分离 { Index=0; } else{ Index=1; } PIDx->PWM_Inc = (PIDx->P * PIDx->Error) + (Index * PIDx->I * Intergral_Error) + (PIDx->D * (PIDx->Error - PIDx->PreError)); PIDx->PrePreError = PIDx->PreError; PIDx->PreError = PIDx->Error; return PIDx->PWM_Inc ; }

      

    首先先要明确,增量式pid和位置式pid本质是一样的,本次增量式pid的输出是由本次位置式pid的输出减去上次位置式的输出得到的。对比一下

    位置式:u(k) =Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]

    增量式:Δu(k) =Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]

    可以看出增量式的KP和位置式的kd一样,增量式的ki和位置式的kp一样。所以对于增量式的参数整定,应该先整定KI,它反映了响应的速度,再整定KP,它反映了对超调量的限制,也就是缓减增量式KI参数过大时候的抖动

    位置式PID:

    比例项只考虑现在有没有偏差,现在有偏差就开始控制,现在偏差越大,控制效果越明显。

    积分项根据历史数据输出控制信号,如果历史总体超标就要减小输出信号,如果历史不达标那要大量输出控制信号

    微分项只关注偏差有没有变化趋势,偏差有了变化趋势才开始控制(而不是偏差存不存在),即偏差的变化率。

    增量式PID:Δu(k) =Kp[e(k)-e(k-1)] + Ki*e(k) + Kd[e(k)-2e(k-1)+e(k-2)]

    Kp项是误差变化率

    Ki项是误差,

    Kd项是变化率的变化率 : e(k)-2e(k-1)+e(k-2)= [e(k)-e(k-1)] - [e(k-1)-e(k-2)]

  • 相关阅读:
    使用可跨平台的函数执行命令
    linux查看及修改文件权限以及相关
    php 文件缓存类
    秒杀抢购思路以及高并发下数据安全
    php 无限分类
    isset ,empty,is_null 区别
    phpstorm 在线激活码
    phpstorm 不能提示代码tp 3.2 $this->display等 解决办法
    laravel-ide-helper 遇到There are no commands defined问题怎么解决
    NFS共享服务
  • 原文地址:https://www.cnblogs.com/prayer521/p/7270631.html
Copyright © 2011-2022 走看看