提示:本文章的串級(jí)PID位置速度控制,是在前兩篇文章速度控制,位置控制的基礎(chǔ)上實(shí)現(xiàn)的,這一章節(jié)中不需要額外的cubemx的配置,只需要寫簡(jiǎn)單的代碼即可,復(fù)雜的地方在于串級(jí)pid的調(diào)試過程。
前言
pid是我們?cè)趯W(xué)習(xí)單片機(jī)中首先要學(xué)會(huì)的控制算法,而串級(jí)pid又是在單pid的基礎(chǔ)上衍生出來的,他能更好的控制系統(tǒng),這篇文章主要介紹stm32如何編寫串級(jí)pid的代碼,沒有對(duì)pid進(jìn)行分析和解釋,要想了解串級(jí)原理的可以參考這篇文章。
一、代碼
在之前的基礎(chǔ)上我們已經(jīng)能分別對(duì)電機(jī)的位置和電機(jī)的速度進(jìn)行相應(yīng)的控制了 ,那么現(xiàn)在的問題是當(dāng)電機(jī)轉(zhuǎn)到指定位置的過程中電機(jī)的速度不可控,所以我們就需要通過串級(jí)pid來進(jìn)行速度的調(diào)節(jié),我么把電機(jī)的位置環(huán)作為外環(huán),電機(jī)的轉(zhuǎn)速我們作為內(nèi)環(huán)。
1.pid
和前面一節(jié)的區(qū)別就是多了一個(gè)Double_Loop_Control()
函數(shù),其實(shí)這個(gè)函數(shù)就是簡(jiǎn)單的把兩個(gè)串在一起而已,代碼閱讀起來很簡(jiǎn)單,就不多說了。
pid.c
int Double_Loop_Control(int position, int target_position, int current_speed, int desired_speed)
{
int target_speed;
int pwm_output;
// 位置環(huán)控制
target_speed = Position_PID(position, target_position);
/* 目標(biāo)速度上限處理 */
if (target_speed > desired_speed)// 目標(biāo)速度的最大值
{
target_speed = desired_speed;
}
else if (target_speed < -desired_speed)
{
target_speed = -desired_speed;
}
// 速度環(huán)控制
pwm_output = Incremental_PI(current_speed, target_speed);
return pwm_output;
}
/* 多環(huán)控制 */
/*
* 函數(shù)功能:位置式PID控制器
* 入口參數(shù):編碼器測(cè)量位置信息,目標(biāo)位置
* 返回 值:電機(jī)PWM
* 根據(jù)位置式離散PID公式
* pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]
* e(k)代表本次偏差
* e(k-1)代表上一次的偏差
* ∑e(k)代表e(k)以及之前的偏差的累積和;其中k為1,2,,k;
* pwm代表輸出
**************************************************************************/
int Position_PID (int position,int target)
{
float Kp=0.5,Ki=0.005,Kd=1;
static float Bias,Pwm,Integral_bias,Last_Bias;
Bias=target-position; //計(jì)算偏差
Integral_bias+=Bias; //求出偏差的積分
if(Integral_bias>400)Integral_bias=400; //對(duì)積分 限幅
if(Integral_bias<-400)Integral_bias=-400; //積分限幅 防止到達(dá)目標(biāo)位置后過沖
Pwm=Kp*Bias+Ki*Integral_bias+Kd*(Bias-Last_Bias); //位置式PID控制器
Last_Bias=Bias; //保存上一次偏差
return Pwm; //增量輸出
}
/**************************************************************************
函數(shù)功能:增量PI控制器
入口參數(shù):編碼器測(cè)量值,目標(biāo)速度
返回 值:電機(jī)PWM
根據(jù)增量式離散PID公式
pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
e(k)代表本次偏差
e(k-1)代表上一次的偏差 以此類推
pwm代表增量輸出
在我們的速度控制閉環(huán)系統(tǒng)里面,只使用PI控制
pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)
**************************************************************************/
int Incremental_PI (int Encoder,int Target)
{
float Kp=30,Ki=10;
static int Bias,Pwm,Last_bias;
Bias=Target-Encoder; //計(jì)算偏差
Pwm+=Kp*(Bias-Last_bias)+Ki*Bias; //增量式PI控制器
Last_bias=Bias; //保存上一次偏差
return Pwm; //增量輸出
}
/**************************************************************************
函數(shù)功能:限制PWM賦值
入口參數(shù):無
返回 值:無
**************************************************************************/
int Xianfu_Pwm(int moto) //限制幅度的函數(shù)
{
int Amplitude=7000; //===PWM滿幅是8400 限制7000
if(moto<-Amplitude) moto = -Amplitude;
if(moto>Amplitude) moto = Amplitude;
return moto;
}
pid.h
#ifndef __PID_H
#define __PID_H
#include "main.h"
#include "moto.h"
int Double_Loop_Control(int position, int target_position, int current_speed, int desired_speed);
int Position_PID (int position,int target);
int Incremental_PI (int Encoder,int Target);
int Xianfu_Pwm(int moto) ;//限制幅度的函數(shù)
#endif
2.it.c文件
就是簡(jiǎn)單的得到的速度值和位置值進(jìn)行賦值。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//雙環(huán)
{
if(htim==(&htim9))//因?yàn)槲也捎玫氖嵌〞r(shí)器6
{
int target_position=20000;
int desired_speed=70;
int moto_pwm;
int Encoder;
int CurrentPosition_;
Encoder=Read_Encoder();
CurrentPosition_=Read_CurrentPosition();
moto_pwm=Double_Loop_Control(CurrentPosition_, target_position, Encoder, desired_speed);
moto_pwm=Xianfu_Pwm(moto_pwm);
Set_Pwm(moto_pwm);
printf("samples: %d ,%d ,%d ,%d ,%d \n",CurrentPosition_,target_position, Encoder, desired_speed,moto_pwm);
}
}
二、串級(jí)調(diào)參的方法
其中位置環(huán)采用的是位置式PID控制器,速度環(huán)采用的是增量式PI控制器。在這種情況下,您需要分別調(diào)整位置環(huán)和速度環(huán)的PID參數(shù),以下是一些基本的參考步驟:
調(diào)整位置環(huán)的PID參數(shù):
a. 將Ki和Kd參數(shù)設(shè)為0,僅保留Kp參數(shù)。
b. 將目標(biāo)位置值設(shè)置為一個(gè)較小的值(例如10),逐步增加Kp,直到系統(tǒng)開始出現(xiàn)持續(xù)振蕩。記錄此時(shí)的Kp值,稱為臨界增益Ku2。同時(shí),記錄振蕩周期,稱為臨界周期Tu2。
c. 使用Ziegler-Nichols方法設(shè)置位置式PID控制器的參數(shù)。例如,可以使用以下參數(shù):
Kp2 = 0.6 * Ku2
Ki2 = 2 * Kp2 / Tu2
Kd2 = Kp2 * Tu2 / 8
d. 應(yīng)用調(diào)整后的位置環(huán)參數(shù),并觀察系統(tǒng)性能。如果仍然需要改進(jìn),請(qǐng)微調(diào)參數(shù),直到獲得滿意的位置控制性能。
調(diào)整速度環(huán)的PID參數(shù):
a. 將Kd參數(shù)設(shè)為0,僅保留Kp和Ki參數(shù)。
b. 將目標(biāo)速度值設(shè)置為一個(gè)較小的值(例如50),逐步增加Kp,直到系統(tǒng)開始出現(xiàn)持續(xù)振蕩。記錄此時(shí)的Kp值,稱為臨界增益Ku1。同時(shí),記錄振蕩周期,稱為臨界周期Tu1。
c. 使用Ziegler-Nichols方法設(shè)置增量式PI控制器的參數(shù)。例如,可以使用以下參數(shù):
Kp1 = 0.6 * Ku1 / 20
Ki1 = 2 * Kp1 * 20 / Tu1
d. 應(yīng)用調(diào)整后的速度環(huán)參數(shù),并觀察系統(tǒng)性能。如果仍然需要改進(jìn),請(qǐng)微調(diào)參數(shù),直到獲得滿意的速度控制性能。
需要注意的是,在實(shí)際調(diào)試過程中,根據(jù)系統(tǒng)的實(shí)際需求和工作條件,可能需要在Ziegler-Nichols建議的參數(shù)基礎(chǔ)上進(jìn)行微調(diào)。您可以嘗試修改各個(gè)參數(shù),觀察系統(tǒng)對(duì)其的敏感程度,并據(jù)此進(jìn)行優(yōu)化。同時(shí),調(diào)整參數(shù)的過程中也需要密切關(guān)注系統(tǒng)的響應(yīng)和性能,避免引起系統(tǒng)不穩(wěn)定或控制性能不佳等問題。
下面介紹一下我的方法:
1.內(nèi)環(huán)的參數(shù)整定
由于內(nèi)環(huán)是速度環(huán),要是前面你的速度環(huán)已經(jīng)整定完畢以后你就可以直接使用那個(gè)值了,這時(shí)候千萬不要讓外環(huán)接入。
最簡(jiǎn)答的方法就是Double_Loop_Control()
函數(shù)中的
// 速度環(huán)控制
pwm_output = Incremental_PI(current_speed, target_speed);
將其中的target_speed
直接寫成一個(gè)固定的值例如設(shè)置為15文章來源:http://www.zghlxwxcb.cn/news/detail-633623.html
// 速度環(huán)控制
pwm_output = Incremental_PI(current_speed, 15);
由此去整定速度環(huán)中p和i的值(因?yàn)橛玫氖莗i增量式所以沒有d)。
2.外環(huán)的參數(shù)整定
當(dāng)內(nèi)環(huán)的整定完畢以后就可以把剛剛修改成15的那個(gè)改回原來的target_speed
這時(shí)候就先設(shè)置p為0.005,id都為0,這個(gè)時(shí)候來觀察圖像。
例如p為0.5時(shí)候圖像
然后有些抖動(dòng)我們就縮小p的值
這時(shí)候看來就好了很多,然后就需要對(duì)i的值進(jìn)行整定
開的時(shí)候我把i設(shè)置為1,圖像有明顯的抖動(dòng)
這種大的抖動(dòng)就需要?2或者?10,接著我設(shè)定為0.5抖動(dòng)沒有絲毫的變化,接著我又設(shè)置為0.05
抖動(dòng)基本消除,但是依然還有幾個(gè)波動(dòng),接著減小為0.005
這個(gè)時(shí)候的基本沒有抖動(dòng)了大致已經(jīng)是我么需要的樣子了。
還需要調(diào)整一下d的值以次來抵御外部的干擾,我將其設(shè)置為1。文章來源地址http://www.zghlxwxcb.cn/news/detail-633623.html
總結(jié)
文件下載地址
到了這里,關(guān)于STM32CubeMX 直流電機(jī)串級(jí)PID位置速度控制、HAL庫、cubemx、PID、串級(jí)PID、位置控制、速度控制、雙環(huán)控制的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!