#include "bsp_pid.h"
|
#include "bldc_ctrl.h"
|
|
//¶¨ÒåÈ«¾Ö±äÁ¿
|
pid_t pid;
|
|
/**
|
* @brief PID²ÎÊý³õʼ»¯
|
* @note ÎÞ
|
* @retval ÎÞ
|
*/
|
void PID_param_init()
|
{
|
/* ³õʼ»¯²ÎÊý */
|
pid.target_val = 0.0;
|
pid.actual_val = 0.0;
|
pid.err = 0.0;
|
pid.err_last = 0.0;
|
pid.integral = 0.0;
|
|
pid.Kp = 0.07; //24
|
pid.Ki = 0.03;
|
pid.Kd = 0.0;
|
|
#if defined(PID_ASSISTANT_EN)
|
float pid_temp[3] = {pid.Kp, pid.Ki, pid.Kd};
|
set_computer_value(SEND_P_I_D_CMD, CURVES_CH1, pid_temp, 3); // ¸øÍ¨µÀ 1 ·¢ËÍ P I D Öµ
|
#endif
|
}
|
|
/**
|
* @brief ÉèÖÃÄ¿±êÖµ
|
* @param val Ä¿±êÖµ
|
* @note ÎÞ
|
* @retval ÎÞ
|
*/
|
void set_pid_target(float temp_val)
|
{
|
pid.target_val = temp_val; // ÉèÖõ±Ç°µÄÄ¿±êÖµ
|
}
|
|
/**
|
* @brief »ñȡĿ±êÖµ
|
* @param ÎÞ
|
* @note ÎÞ
|
* @retval Ä¿±êÖµ
|
*/
|
float get_pid_target(void)
|
{
|
return pid.target_val; // ÉèÖõ±Ç°µÄÄ¿±êÖµ
|
}
|
|
/**
|
* @brief ÉèÖñÈÀý¡¢»ý·Ö¡¢Î¢·ÖϵÊý
|
* @param p£º±ÈÀýϵÊý P
|
* @param i£º»ý·ÖϵÊý i
|
* @param d£ºÎ¢·ÖϵÊý d
|
* @note ÎÞ
|
* @retval ÎÞ
|
*/
|
void set_p_i_d(float p, float i, float d)
|
{
|
pid.Kp = p; // ÉèÖñÈÀýϵÊý P
|
pid.Ki = i; // ÉèÖûý·ÖϵÊý I
|
pid.Kd = d; // ÉèÖÃ΢·ÖϵÊý D
|
}
|
|
/**
|
* @brief PIDË㷨ʵÏÖ
|
* @param actual_val:ʵ¼ÊÖµ
|
* @note ÎÞ
|
* @retval ͨ¹ýPID¼ÆËãºóµÄÊä³ö
|
*/
|
float PID_realize(float actual_val)
|
{
|
/*¼ÆËãÄ¿±êÖµÓëʵ¼ÊÖµµÄÎó²î*/
|
pid.err = pid.target_val - actual_val;
|
pid.integral += pid.err;
|
|
/*PIDË㷨ʵÏÖ*/
|
pid.actual_val = pid.Kp * pid.err +
|
pid.Ki * pid.integral +
|
pid.Kd * (pid.err - pid.err_last);
|
|
/*Îó²î´«µÝ*/
|
pid.err_last = pid.err;
|
|
/*·µ»Øµ±Ç°Êµ¼ÊÖµ*/
|
return pid.actual_val;
|
}
|