一、簡介
續(xù)上文,電機(jī)驅(qū)動(dòng)、MPU6050驅(qū)動(dòng)均已完成,接下來我們給他加上PID讓它站起來
二、PID控制
我們將小車PID控制函數(shù)放到MPU6050中斷函數(shù)中,每當(dāng)MPU6050有數(shù)據(jù)輸出時(shí),引腳INT有相應(yīng)的電平輸出。依次來觸發(fā)外部中斷作為控制周期。保持MPU6050數(shù)據(jù)的實(shí)時(shí)性。
2.1直立環(huán)控制
通過傳入的KP、KD參數(shù),讓平衡車的pitch軸保持在水平位置。
直立環(huán)是用于控制機(jī)械系統(tǒng)中垂直方向運(yùn)動(dòng)的一種控制器。在這些應(yīng)用中,垂直方向的運(yùn)動(dòng)通常是非常穩(wěn)定的,因此I控制器的積分作用并不是必需的。而PD控制器可以提供足夠的控制性能,同時(shí)避免了可能出現(xiàn)的積分飽和問題,因此在直立環(huán)中通常只使用PD控制器,而不使用I控制器。
/**************************************************************************
函數(shù)功能:直立PD控制
入口參數(shù):角度、機(jī)械平衡角度(機(jī)械中值)、角速度
返回 值:直立控制PWM
**************************************************************************/
int balance_UP(float Angle,float Mechanical_balance,float Gyro)
{
float Bias;
int balance;
Bias=Angle-Mechanical_balance; //求出平衡的角度中值和機(jī)械相關(guān)
balance=balance_UP_KP*Bias+balance_UP_KD*Gyro; //計(jì)算平衡控制的電機(jī)PWM PD控制 kp是P系數(shù) kd是D系數(shù)
return balance;
}
2.2速度環(huán)控制
這里我們只用到了PI的控制參數(shù),如果有微分環(huán)(D)在里面的,系統(tǒng)會(huì)響應(yīng)波動(dòng)太快,微分對極小的速度波動(dòng)都會(huì)有反應(yīng),而速度的微微波動(dòng)又太多了,什么電機(jī)微抖,轉(zhuǎn)速檢測裝置的不穩(wěn)定??偨Y(jié),微分太靈敏了,所以我們只用到了PI作為調(diào)節(jié)參數(shù)
/**************************************************************************
函數(shù)功能:速度PI控制
入口參數(shù):電機(jī)編碼器的值
返回 值:速度控制PWM
**************************************************************************/
int velocity(int encoder_left,int encoder_right,int Target_Speed)
{
static float Velocity,Encoder_Least,Encoder;
static float Encoder_Integral;
//=============速度PI控制器=======================//
Encoder_Least=(Encoder_Left+Encoder_Right); //獲取最新速度偏差==測量速度(左右編碼器之和)-目標(biāo)速度
Encoder *= 0.8; //===一階低通濾波器
Encoder += Encoder_Least*0.2; //===一階低通濾波器
Encoder_Integral +=Encoder; //===積分出位移 積分時(shí)間:10ms
Encoder_Integral=Encoder_Integral-Target_Speed; //接收遙控器數(shù)據(jù),控制前進(jìn)后退
if(Encoder_Integral>10000) Encoder_Integral=10000; //===積分限幅
if(Encoder_Integral<-10000)?????? Encoder_Integral=-10000; //===積分限幅??????
????? Velocity=Encoder*velocity_KP+Encoder_Integral*velocity_KI; //===速度控制????
?if(pitch<-40||pitch>40) Encoder_Integral=0; //===電機(jī)關(guān)閉后清除積分
return Velocity;
}
2.3轉(zhuǎn)向環(huán)控制
在轉(zhuǎn)向控制中,PD控制器代表的是比例-微分控制器,它根據(jù)當(dāng)前的偏差和偏差的變化率來調(diào)整控制參數(shù),以實(shí)現(xiàn)快速響應(yīng)和穩(wěn)定性。
相比之下,積分控制器(I控制器)會(huì)根據(jù)偏差的積分來調(diào)整控制參數(shù),以減小系統(tǒng)的穩(wěn)態(tài)誤差。然而,在轉(zhuǎn)向控制中,由于小車的動(dòng)態(tài)響應(yīng)和環(huán)境的不確定性,I控制器容易出現(xiàn)積分飽和的問題,從而導(dǎo)致系統(tǒng)不穩(wěn)定和震蕩。
因此,為了保證轉(zhuǎn)向控制的穩(wěn)定性和可靠性,通常只使用PD控制器,而不使用I控制器。同時(shí),還可以通過其他控制策略,如模糊控制、自適應(yīng)控制等來進(jìn)一步提高控制性能。
/**************************************************************************
函數(shù)功能:轉(zhuǎn)向PD控制
入口參數(shù):電機(jī)編碼器的值、Z軸角速度
返回 值:轉(zhuǎn)向控制PWM
**************************************************************************/
int Turn_UP(int gyro_Z, int RC)
{
int PWM_out;
/*轉(zhuǎn)向約束*/
if(RC==0)Turn_Kd=TURN_KD;//若無左右轉(zhuǎn)向指令,則開啟轉(zhuǎn)向約束
else Turn_Kd=0;//若左右轉(zhuǎn)向指令接收到,則去掉轉(zhuǎn)向約束
PWM_out=Turn_Kd*gyro_Z + Turn_KP*RC;
return PWM_out;
}
2.4 PID參數(shù)的調(diào)節(jié)
通過調(diào)節(jié)PID的參數(shù),使小車達(dá)到穩(wěn)定狀態(tài),該數(shù)據(jù)僅供參考,具體調(diào)節(jié)還得從實(shí)際中得來
//直立環(huán)
#define BLC_KP 300
#define BLC_KD 0.6
//速度環(huán)
#define SPD_KP -80
#define SPD_KI -0.40
//轉(zhuǎn)向環(huán)
#define TURN_KP -30
#define TURN_KD -0.3
-
控制器
+關(guān)注
關(guān)注
112文章
16411瀏覽量
178701 -
STM32
+關(guān)注
關(guān)注
2270文章
10914瀏覽量
356712 -
PID
+關(guān)注
關(guān)注
35文章
1473瀏覽量
85644 -
平衡小車
+關(guān)注
關(guān)注
1文章
39瀏覽量
12516
發(fā)布評(píng)論請先 登錄
相關(guān)推薦
評(píng)論