原创 适用于 STM32F4xx PID 函数

2014-6-22 14:41 1198 16 16 分类: MCU/ 嵌入式

详细用法请联系我 作者: 单片机老兵  QQ号: 123904022

/**********************  声明结构变量 ************************/
struct PID
{
 float SetSpeed;   
 float ActualSpeed;   
 float err;            
 float err_last;       
 float Kp , Ki , Kd;     
 float voltage;        
 float integral;          
};

/*** 初始化 ***/

void PID_init(void)
{
 Ud.SetSpeed = 0.0;
 Ud.ActualSpeed = 0.0;
 Ud.err = 0.0;
 Ud.err_last = 0.0;
 Ud.voltage = 0.0;
 Ud.integral = 0.0;

 Ud.Ep = 0.25;
 Ud.Ei = 0.15; 
 Ud.Ed = 0.0;
 
}

 

/*******************************************************************************
* Function Name  : UD ¿ØÖƺ¯Êý
* Description    : UD ÎÞ¹¦·ÖÁ¿
* Input          : Ud.ActualSpeed = id_Park; ÎÞ¹¦·ÖÁ¿±Õ»·¼ì²âÖµ
* Output         : Êä³ö = 0
* Return         : None   
*******************************************************************************/
float Set_Potential(float speed)
{
Ud.SetSpeed = speed;
arm_sub_f32(&Ud.SetSpeed , &Ud.ActualSpeed , &Ud.err , 1); // DSP ¼ÆËã
Ud.integral += Ud.err;
Ud.voltage = Calculation(Ud.Ep , Ud.Ei , Ud.Ed , Ud.integral , Ud.err , Ud.err_last); // DSP ¼ÆËã
Ud.err_last = Ud.err;
Ud.ActualSpeed = (float)Ud.voltage * (float)1.0;
return Ud.ActualSpeed;
}

/***************************** DSP PID 函数**********************************************************
* Function Name  : Calculation浮点通用STM32F4xx ARM-DSP-PID 计算函数
* Description    : 详细用法请联系我  拥有者: 单片机老兵  QQ号: 123904022
* Input          : Kp  比例   Ki  积分  Kd  微分
* Input          : Err 本次偏差 , Integral 积分偏差 , Err_last 上一次偏差 
* Output         : Adjust_the 调整值
* Return         : μ÷???μ
*****************************************************************************************************/
float Calculation(float Kp ,float Ki , float Kd , float Integral , float Err , float Err_last)
{  
float Temp1;    // 临时变量
float Temp2;     // Adjust_the 调整值
  
arm_mult_f32(&Kp , &Err , &Temp1 , 1); 
arm_mult_f32(&Ki , &Integral , &Temp2 , 1); 
arm_add_f32(&Temp1 , &Temp2 , &Temp1 , 1);    

arm_sub_f32(&Err , &Err_last , &Temp2 , 1);
arm_mult_f32(&Kd , &Temp2 , &Temp2 , 1); 
 
arm_add_f32(&Temp1 , &Temp2 , &Temp2 , 1);
return(Temp2);

文章评论0条评论)

登录后参与讨论
我要评论
0
16
关闭 站长推荐上一条 /2 下一条