zoukankan      html  css  js  c++  java
  • PID控制_位置式

    位置式:

    1. 位置式:

    pid.c:

    float PID_calculate( float dT_s,            //周期(单位:秒)
                        float in_ff,				//前馈值
                        float expect,				//期望值(设定值)
                        float feedback,			//反馈值()
                        _PID_arg_st *pid_arg, //PID参数结构体
                        _PID_val_st *pid_val,	//PID数据结构体
                        float inte_d_lim,//积分误差限幅
                        float inte_lim,			//integration limit,积分限幅				
    										float err_lim     //误差死区
                          )	
    {
      float hz;
      hz = safe_div(1.0f,dT_s,0);
      pid_val->err = (expect - feedback);
      
      if( ( pid_val->err <=  err_lim) && ( pid_val->err > 0 ) )   //误差死区
      {
        pid_val->err = 0;
      }
      else if( ( pid_val->err >=  -err_lim) && ( pid_val->err < 0 ) )
      {
        pid_val->err = 0;
      }
      
      pid_val->exp_d = (expect - pid_val->exp_old) *hz;
      
      if(pid_arg->fb_d_mode == 0)
      {
        pid_val->fb_d = (feedback - pid_val->feedback_old) *hz;
      }
      else
      {
        pid_val->fb_d = pid_val->fb_d_ex;
      }	
      pid_val->differential = (pid_arg->kd_ex *pid_val->exp_d - pid_arg->kd_fb *pid_val->fb_d);
      
      pid_val->err_i += pid_arg->ki *LIMIT((pid_val->err ),-inte_d_lim,inte_d_lim )*dT_s;//)
      pid_val->err_i = LIMIT(pid_val->err_i,-inte_lim,inte_lim);
      pid_val->out = pid_arg->k_ff *in_ff 
        + pid_arg->kp *pid_val->err  
          +	pid_val->differential
        	+ pid_val->err_i;
      pid_val->feedback_old = feedback;
      pid_val->exp_old = expect; 
      return (pid_val->out);
    }
    

    pid.h:

    #define LIMIT( x,min,max ) ( ((x) <= (min)) ? (min) : ( ((x) > (max))? (max) : (x) ) )
    
    typedef struct
    {
    	int exp;
    	int fb;
    	int error;
    	int out;
    } _ctrl_st;
    
    typedef struct
    {
    	uint8_t fb_d_mode;
    	float kp;			 //比例系数
    	float ki;			 //积分系数
    	float kd_ex;		 	 //微分系数
    	float kd_fb; //previous_d 微分先行
    //	float inc_hz;  //不完全微分低通系数
    //	float k_inc_d_norm; //Incomplete 不完全微分 归一(0,1)
    	float k_ff;		 //前馈 
    
    }_PID_arg_st;
    
    
    
    
    typedef struct
    {
    	float err;
    	float exp_old;
    	float feedback_old;
    	
    	float fb_d;
    	float fb_d_ex;
    	float exp_d;
    //	float err_d_lpf;
    	float err_i;
    	float ff;
    	float pre_d;
    
    	float out;
    	float differential;
    }_PID_val_st;
    
    typedef struct
    {
      _ctrl_st      *ctrl_st;
      _PID_arg_st   *arg_st;
      _PID_val_st   *val_st;
    }_PID_DATA;
    
    
    float PID_calculate( float T,            //周期
    										float in_ff,				//前馈
    										float expect,				//期望值(设定值)
    										float feedback,			//反馈值
    										_PID_arg_st *pid_arg, //PID参数结构体
    										_PID_val_st *pid_val,	//PID数据结构体
    										float inte_d_lim,
    										float inte_lim,			//integration limit,积分限幅
    										float err_lim	   //误差死区
    										   );			//输出
    

    使用:

    static _PID_arg_st arg_st;//实例化
    static _PID_val_st val_st;//实例化
    static _ctrl_st    ctrl_st;//实例化
    arg_st->kp = 1.2f;
    arg_st->ki = 3.2f;
    arg_st->kd_fb = 0.05f;
    
  • 相关阅读:
    ruby **option作为函数参数,map的key必须是符号
    计算2..n的素数
    css,世界上没有绝对简单的事情
    modernizr的介绍和使用
    图解HTTP
    px、em、rem区别介绍
    web开发规范文档
    iscroll API
    sulime text 常用快捷键总结
    a href="javascript:void(0)"
  • 原文地址:https://www.cnblogs.com/penuel/p/14313876.html
Copyright © 2011-2022 走看看