热度 16
2014-6-22 14:41
1200 次阅读|
0 个评论
详细用法请联系我 作者: 单片机老兵 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); }