位置型PID增量PID調節直流電機
一、思路:
無論是位置型還增量型的PID都是爲了調節PWM波,使電機的轉速達到設定值。這次實驗目的主要是實現用機智雲app控制電機並使電機的轉速達到設定值後保持穩定。
二、實現過程:
- 材料:正點原子stmf4探索板及其配套的esp8266、0~6v直流電機、L9110s芯片的驅動模塊,對射光計數芯片。
- 接下來要實現一個閉環的,主要的思路是將,通過計數器的算成對應的速度,通過pid公式調節,反饋回去,調節PWM波自至速度達到設定值。
- 我是通過TIM4_CH1輸出PWM波,控制電機轉速;通過短時間定時器和對射管計數器傳過來的信號,高低電平來測量速度的。
- 這是我的pid筆記
PID算法重要知識點:一種可以自我調節,穩定輸出,實現實際值十分接近設定值的方法。
一、類型
(1).位置型pid
實現的步驟:
1.建立一個結構體其中包括:
比例係數(Kp)Proportion,
積分系數(Ki)Integral,
微分系數(Kd)Derivative,
當前誤差current_error,
上次誤差S_error,
累計誤差Sum_error,
設定目標SetValue
實際數值actualValue
2.位置型PID的公式:increment=(Pid->Kp)*(Pid->error)+(Pid->Ki)*(Pid
->SUM_error)+(Pid->Kd)*(Pid->error-Pid->S_error);
3.初始化函數,調整函數:
/*------------------------------------------
函數功能:位置型pid參數初始化min~max
函數說明:
------------------------------------------*/
void PositionPid_Init(PID Pid)
{
Pid->Kp=0.8;
Pid->Ki=0.1;
Pid->Kd=0.1;
Pid->error=0.0;
Pid->S_error=0.0;
Pid->SUM_error=0.0;
Pid->actualvalue=0.0;
Pid->setvalue=0.0;
}
/*------------------------------------------
函數功能:位置型PID調整
函數說明:利用本次誤差和上次誤差進行反饋調節
------------------------------------------*/
float PositionPid_adjust(PID Pid,float setpoint)
{
float increment;
Pid->setvalue=setpoint;
Pid->error=setpoint-Pid->actualvalue;
Pid->SUM_error+=Pid->error;
/*採用的是位置型pid*/
increment=(Pid->Kp)*(Pid->error)+(Pid->Ki)*(Pid->SUM_error)+(Pid->Kd)* (Pid->error-Pid->S_error);//這個是位置式PID的靈魂
Pid->S_error=Pid->error;
return (318-increment);//這裏318是根據實際需要增加的。
}
4.思路及要點:位置型PID首先要解決的問題是閉環反饋的事,就是要有測量反饋給單片 機結構體變量Pid->actualvalue,然後在調整中會根據不斷更新的實際值,帶入公式進行不斷調節,以達到目標。
(2)增量型PID
1.建立結構體
/*------------------------------------------
結構體說明:這是位置式、增量式PID的結構體,包括基本的
PID調節參數.
------------------------------------------*/
typedef struct node
{
/*1.比例係數Kp 2.積分系數Ki 3.微分系數Kd
4.本次的誤差error 5.上次的誤差S_error
6.用於積分的誤差和SUM_error
7.設定的值setvalue 8.實際的值actualvalue
*/
/*下沒有特別說明就代表是共同變量*/
float Kp;
float Ki;
float Kd;
float error;
float S_error;
float SS_error; //上上次誤差,增量型PID需要
float SUM_error; //累計誤差,位置型PID需要
float setvalue;
float actualvalue;
}PIDN,*PID;
2.初始化函數 ,調整函數:
/*------------------------------------------
函數功能:增量型PID初始化
函數說明:
------------------------------------------*/
void IncrementPid_Init(PID Pid)
{
Pid->Kp=0.1;
Pid->Ki=0.85;
Pid->Kd=0.15;
Pid->error=0.0;
Pid->S_error=0.0;
Pid->SS_error=0.0;
Pid->actualvalue=0.0;
Pid->setvalue=0.0;
}
/*------------------------------------------
函數功能:增量型PID調整
函數說明:
------------------------------------------*/
float IncrementPid_adjust(PID Pid,float setpoint)
{
float increment;
float fanhuizhi;
Pid->setvalue=setpoint;
Pid->error=setpoint-Pid->actualvalue;
increment=(Pid->Kp)*((Pid->error)-(Pid->S_error))+(Pid->Ki)*(Pid->error)*i+(Pid->Kd)*(Pid->error-2*Pid->S_error+Pid->SS_error);//這個是增量式PID的靈魂
adjust_shuzhi-=increment;//根據實際應用的時候adjust_shuzhi的值太大了,所以有點像下降型pid調節。
Pid->SS_error=Pid->S_error;
Pid->S_error=Pid->error;
}
一、實際使用PID的經驗
a.有些變量只能初始化一次,注意看
b.對於直流電機調速的結果看,增量型越接近越慢
c.實際值->公式-> =? 設定值,否則返回。
d.在調節pid參數的時候,最好設置一個些printf用觀察數字的變化。
4.這是我參考的pid算法的資料:
鏈接:https://pan.baidu.com/s/1bYmddMa1DavPCMzIDd9E1g
提取碼:5lga
四、總結:首先聲明我這裏並沒有將我這個項目的所有的資料,只是將其中對pid的資料及相關思路寫了下來。