pid

一、pid概述

1.p为比例(大幅度的调节),i为积分,d为微分

2.闭环系统,输入当前状态、要达到的状态,返回输出变化量(配合反馈输出当前状态使用)

例:智能车电机 输入当前值、要达到的值,根据增量式pid公式算出一个输出变化量

       当前值由编码器脉冲获得,要达到的值根据赛道的判断(直道,弯道,斜坡)自己设的值,根据公式算出电机变化量返回

3.增量式pid公式:out=Kp*e0-Ki*e1+Kd*e2;(e(t)为差值)

   代码

int32_t MotorPidCal(int16_t count,uint16_t SpeedSet,float Speed_Kp,float Speed_Ki,float Speed_Kd)         
{    
    
MotorPID.Kp = Speed_Kp;
MotorPID.Ki = Speed_Ki;
MotorPID.Kd = Speed_Kd;
        MotorPID.e2=MotorPID.e1;
MotorPID.e1=MotorPID.e0;
        MotorPID.e0 =SpeedSet-count;


       MotorPID.DefaultSum = MotorPID.Kp* MotorPID.e0- MotorPID.Ki *  MotorPID.e1 +MotorPID.Kd *  MotorPID.e2; 

       MotorPID.Sum+=MotorPID.DefaultSum;
       
        if(MotorPID.Sum>MotorMax)
  MotorPID.Sum=MotorMax;
if(MotorPID.Sum<MotorMin)
  MotorPID.Sum=MotorMin;        
 return MotorPID.Sum;
}      

优点:只需要当前和上一个的偏差即可得出结果,不需要存储每一拍的偏差,因此占内存空间小

4.位置式pid公式

int32_t MotorPidCal(int16_t count,uint16_t SpeedSet,float Speed_Kp,float Speed_Ki,float Speed_Kd)         
{    
    
MotorPID.Kp = Speed_Kp;//12.0;
MotorPID.Ki = Speed_Ki;//0.5;
MotorPID.Kd = Speed_Kd;//7.0;
        MotorPID.e2=MotorPID.e1;
MotorPID.e1=MotorPID.e0;
        MotorPID.e0 =SpeedSet-count;
      Err_sum2+=MotorPID.e0;
     
   MotorPID.DefaultSum = MotorPID.Kp* MotorPID.e0+ MotorPID.Ki * Err_sum2 - MotorPID.Kd * (MotorPID.e0-MotorPID.e1);   位置 
MotorPID.Sum+=MotorPID.DefaultSum;
       
        if(MotorPID.Sum>MotorMax)
  MotorPID.Sum=MotorMax;
if(MotorPID.Sum<MotorMin)
  MotorPID.Sum=MotorMin;        
 return MotorPID.Sum;
}    

优点:  位置式PI调节器的结构清晰,P和I两部分作用分明,参数调整简单明了。

相比较缺点:占用内存大,浪费程序跑的时间


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值