void setup() {
}
void loop() {
}
/********************************************************************
函 數 名:void Init_PID_uint(PID_uint *p)
功 能:初始化PID參數
說 明:調用本函數之前,應該先對Kp,Ti,Td做設置 ,簡化了公式
入口參數:PID單元的參數結構體 地址
返 回 值:無
***********************************************************************/
void Init_PID_uint(PID_Uint *p)
{
p->k1 = (p->Kp) + (p->Kp) * 1024 / (p->Ti) + (p->Kp) * (p->Td) / 1024;
p->k2 = (p->Kp) + 2 * (p->Kp) * (p->Td) / 1024;
p->k3 = (p->Kp) * (p->Td) / 1024;
}
/********************************************************************
函 數 名:void reset_Uk(PID_Uint *p)
功 能:初始化U_kk,ekk,ekkk
說 明:在初始化時調用,改變PID參數時有可能需要調用
入口參數:PID單元的參數結構體 地址
返 回 值:無
***********************************************************************/
void reset_Uk(PID_Uint *p)
{
p->U_kk = 0;
p->ekk = 0;
p->ekkk = 0;
}
/********************************************************************
函 數 名:int PID_commen(int set,int jiance,PID_Uint *p)
功 能:通用PID函數
說 明:求任意單個PID的控制量
入口參數:期望值,實測值,PID單元結構體
返 回 值:PID控制量
***********************************************************************/
int PID_common(int set, int jiance, PID_Uint *p)
{
int ek, U_k = 0;
ek = jiance - set;
if ((ek > (p->Un)) || (ek < -(p->Un))) //積分不靈敏區
U_k = (p->U_kk) + (p->k1) * ek -
(p->k2) * (p->ekk) + (p->k3) * (p->ekkk);
p->U_kk = U_k;
p->ekkk = p->ekk;
p->ekk = ek;
if (U_k > (p->Ur)) //限制最大輸出量,
U_k = p->Ur;
if (U_k < -(p->Ur))
U_k = -(p->Ur);
return U_k / 1024;
}
|