1. 程式人生 > >直流電機PID調節——P

直流電機PID調節——P

其實要用PID調節的話,最好是使用帶有編碼器的比較高階一點的直流減速電機,但是因為它價格有點貴,所以我們一般做智慧小車就會選用普通的直流電機,但是普通的直流電機也是可以使用PID調節的,雖然它的效果沒有帶編碼器得到直流減速電機的好,但是我們也可以在調節的過程中慢慢地深刻的理解PID調節的含義。今天先來分享一下我剛剛涉及的PID中的P調節。

P就是比例:Proportion
它直接影響的是我們整個系統的響應速度,P引數越大,系統對外界的響應速度越快,P引數越小,系統對外界的響應速度越慢,當然P也不是越大越好,P大的話,就會讓我們的系統產生比較大的超調量,這當然不是我們想要的結果,所以說任何事物都要適度才好。

我們都知道,PID調節中的一個很重要的引數就是誤差,誤差顧名思義就是我們目標值和實際值的差值,而這個P就是直接作用於這個差值上的,我們來看下部分程式碼

void SetLeftSpeed(u16 LeftSet,u16 LeftReal)//入口引數:目標值,實際值
{
    static int  LeftMotorPWM=0;
    int  LeftError=0,LeftIncPWM=0;

    LeftError=LeftSet-LeftReal;//本次偏差等於目標值減去實際值

    LeftIncPWM=(int)(LeftPID_Kp*LeftError);
    LeftMotorPWM+=LeftIncPWM;

    if
(LeftMotorPWM>=90) LeftMotorPWM=90; else if(LeftMotorPWM<=10) LeftMotorPWM=10; SetLeftPWM(LeftMotorPWM); }

上面這個子函式就是我小車上左輪子的PID調節(裡面只有P調節)。
我們需要注意的是裡面的幾個變數:
1、LeftMotorPWM:通過PID調節出來的要賦給電機的PWM,它是本次PID調節和前面所有的PID調節共同積累出來的數值,所以它需要用static來進行修飾,把它變成靜態變數,並且它的值有正有負,所以我們定義成int,而不是unsigned int。
2、LeftIncPWM:本次通過PID調節算出來的PWM值,他不是直接賦給電機的PWM,它只是本次PWM算出來的值,這也就是它和LeftMotorPWM的區別了。LeftIncPWM也是有正有負,我們同樣需要定義成int,但它不是靜態變數。
3、LeftError:本次PID調節中目標值與實際值的差值,這是一個很重要的引數。同樣他也是有正有負,我們把它也定義成int,它也不是靜態的。

然後我們來看一條重要的語句

LeftIncPWM=(int)(LeftPID_Kp*LeftError);

這個說白了就是PID調節中的P調節,沒錯就這麼簡單的一條語句。
他其實就是在我們的本次目標值與實際值的差值上面乘上了一個引數,這個引數就是Kp,回想一下我開頭說的那句話,P引數越大,系統的響應速度就越快,仔細想一下是不是這個道理,我們要給電機的PWM就是由目標值與實際值的差值來實時決定的,誤差越大,計算出來的PWM就越大,誤差越小計算出來的PWM就越小,而P引數就相當於一條直線的斜率,斜率越大,縱座標對於橫座標的變化就越敏感,也就是系統對於外界的變化的響應速度越快。

接下來看一下除錯資料

其中Kp*100就是我設定的P引數,為了顯示方便,我是讓真正的P引數乘以100之後再用串列埠打印出來,也就是說,此時真正的P引數是0.12,左輪值是測速模組(測速光耦)返回來的電機實際速度值(其實不是電機的實際速度,只是測速模組觸發的外部中斷次數,在這裡我就先稱它為電機實際速度,它是可以代表電機速度變化的一個數值,所以說我們現在沒有必要再去用公式計算電機的物理實際速度),這個電機實際速度是統計週期是100ms,即我是統計100ms測速模組觸發的外部中斷的次數。
設定值就是我們的目標值,就是我們想要電機達到的速度值,這裡我同樣是用相對於測速模組觸發外部中斷的次數來進行設定的,然後PWM值就是PID調節之後要賦給電機實際的PWM數值。
從串列埠列印的資料我們可以看出,剛開始電機的速度是0,設定值時3,因為實際值沒有達到設定值,所有PID調節中P調節就會使PWM值一直在增加,增加到我們測到了電機實際值最大為12,我們設定值時5,他現在加速到了12,這個12-5=7就是所謂的超調量。繼續往後看串列埠的資料,我們就會發現,電機的實際值慢慢地又降下來了,最終穩定在了設定值(也就是5)的附近,這就說明達到了PID調節中P的效果。

然後我簡單的用matlab畫了一下速度的大概曲線,雖然不是很專業,但是將就著看看效果吧

從曲線上我們可以看到,最終速度會穩定在設定值5附近,當然他不會一直穩定在5,他會一直在5附近上下波動。

接下來我把P引數調大,再來看一下效果

從串列埠打出來的資料就可以看出來,P調大之後,系統的響應速度變得快了,即它現在可以花很少的時間就可以把速度調到我們的目標值,但是隨之而來的缺點就是,它現在對於外界的變化過於敏感,以至於它調節出來的PWM值會不停地波動,或者我們來看左輪值,也就是電機的實際值,它沒有像剛才那樣基本穩定在我們的設定值5附近,而是變化很大,這就是所謂的抖動現象,造成抖動的原因就是P引數太大,這個時候我們就應該再把P引數調小一點,直到達到我們想要的效果。然後看一下matlab畫出來的曲線

我們發現,我們把P調大之後,電機的實時速度和我們設定的速度的差值就變得大了,即曲線波形的振幅變得更大了。

在串列埠列印的資料中,由於我設定的目標值有點小,所以可能只通過資料看的不是很清楚,但是整體上可以大概反映出PID調節的效果,具體引數是個人情況而定。

PID中的P調節就說到這吧。