智能車調速部分

下載本文:http://pan.baidu.com/s/1qWAW49m

【雜談】本文是自己在整理智能車項目相關心得時所作,與大家分享。如需轉載請註明出處,謝謝!

【1.1】 智能車簡單調速

測速 : 要實現閉環控制,先要進行測速

根據一個穩定可靠的測速值,纔能有實現有效的速度控制

/* 定時中斷測速 */
void PIT0_IRQHandler(void)
{
    PIT_Flag_Clear(PIT0);              //清中斷標誌位
    speedValue=speedCounter/6;    //讀取所測值,除以6是平均濾波,使得測速值穩定,去掉環境一般干擾造成的浮動
    speedCounter = 0;                   //清計數
    speedControl();
}

速度控制如何實現,首先大了要調小,小了要調大

void speedControl(void)
{
    static u32 duty;
    if(speedValue<speedSet) duty++;
    else if(speedValue>speedSet) duty--;
    SET_MOTOR_DUTY(duty);
}

這樣確實可行,但顯然調節的太慢了,我們改進一下,變化一下每次調整的幅度,根據什麼變化?

誤差越大,調整的幅度就越大,誤差小了,調整幅度也隨之減小,這樣與成比例K地調節:

void speedControl(void)
{
    static u32 duty;
    if(speedValue<speedSet) duty+=K*(speedValue-speedSet);
    else if(speedValue>speedSet) duty-=K*(speedSet-speedValue);
    SET_MOTOR_DUTY(duty);
}

把兩個式子合成一個:

void speedControl(void)
{
    static s32 duty;
    duty+=K*(speedSet-speedValue);
    SET_MOTOR_DUTY(duty);
}

 

當然,設置佔空比前還要先進行限幅。

K如何確定呢?

先進行測速,記錄佔空比對應的測速值,求出速度和佔空比的大致比例,就可以作爲初定的K值

實際建議採用高級調速,這種方法只是PID調速的I分量控制(不是P分量控制)。

不是P分量控制?比例項爲何不是和當前誤差成比例,當前誤差越小,調整量越小,這不是比例調節嗎?

對增量式的理解有誤。

比例項是對當前誤差加權作爲下次輸出值的一個分量,而不是作用於下次輸出和上次輸出的增量的。

脈衝計數器值除以6還是縮小速度採樣週期爲原來的六分之一?

前者相當於平均濾波,後者即時性更強。

【1.2】智能車高級調速 PID基礎知識

比例、積分和微分的線性組合,構成控制量u(t),稱爲:比例(Proportional)、積分(Integrating)和微分(Differentiation)控制,簡稱PID控制。比例作用P只與偏差成正比,積分作用I是偏差對時間的累積,而微分作用D是偏差的變化率。

根據上面的定義可以寫出公式:

比例P代表着現在,積分I代表着過去,而微分D則代表着未來 

(摘自http://www.cnblogs.com/pang123hui/archive/2010/08/16/2309974.html

爲什麼這麼說?

我們知道一個曲線上的一個點的

e(t)是誤差關於時間的函數,一個時刻t0的誤差爲e0,比例項就反映當前時刻的誤差值,積分項是求積分,反映之前誤差的累加值,微分項是求導,即斜率,是反映誤差的變化趨勢。我畫個圖:


反饋控制思想——利用誤差,消除誤差

假設要實現控制某量從A調整爲B,每一次控制都得到一個輸出,而反饋信息就是每次的輸出值,一個閉環的控制策略無非就是採用一種方法,利用這些反饋信息指導下一次控制。

PID控制相當於把全部誤差數據劃分爲歷史,當前,未來三個分量,並賦予不同權重後加和,得到下一時刻的控制量。

推導增量式PID

對PID基本式求導,就得到下面的式子

d_u=P*d_err+I*err+D*dd_err(dd表示2階導)

( pk += kp_motor * d_error + ki_motor * error + kd_motor * dd_error; 上面網址裏代碼的核心部分 )

這就是增量式PID控制,由於運算輸出的是增量,所以叫增量式。

離散化,求導就是求此刻與上一時刻的差值,編程就很容易了。

結合上一節,加深增量式PID的理解

首先,如果error越大,即設定值與測得當前值相差很大,則調整值越大,若error很小,則調整值也很小,所以,偏差值error和佔空比調整值成正比,可以寫出以下語句:

dutySet += K*err;//err= speedSet – currentSpeed;

這就是積分項(err),求導爲比例項(∆err),再求導爲微分項(∆∆err)(離散的求導即爲兩次差值,變化量)

當且僅當err=0時,積分項爲零,因此,積分項可以消除靜態的誤差;

而比例項爲兩次err的差值,爲誤差的變化率,如果按照積分調節,可以編程繪製一個曲線,曲線越接近設定值越平穩,開始非常抖,也就是說斜率由大變小,那麼如果大的斜率對應大的調節,小的斜率對應小的調節,則會進一步加快調節進程。

進一步加快調節進程,就是微分項。

【1.3】PID應用

PID應用

增量式是求導而得,積分即得到位置式 

位置式:輸出爲——固定位置值+偏移量,應用:舵機

增量式:輸出爲——上次輸出值+增量,應用:電機

PID調速的作用:

電池問題

路況問題 

上下坡 加PID保證勻速,上坡可以提速,下坡可以減速

障礙 華德車的例子,直道加速,遇到障礙猛地卡住,猛地加速,衝出賽道

改進

修改PID爲ABC型,提高效率

dutySet +=Kp(e0-e1)+Ki*e0+Kd*( (e0-e1)-(e1-e2) )

簡化爲ABC

dutySet +=A*e0-B*e1+C*e2

A=Kp+Ki+Kd

B=Kp+2Kd

C=Kd

其他:

修改代碼結構:數據結構改進,改爲結構體定義

提升代碼速度:算法改進,爲指針操作,指針循環移動

添加高階導數項,調節速度更快

分段控制:全bangbang加速,PID減速,直接置零,反轉的PID減速

高級控制思想——自適應控制、模糊控制、預測控制、神經網絡控制、專家智能控制等等

注意

寫程序

相關變量用static繼承或者全局變量、宏定義

數據類型:誤差有符號

PID參數整定

調試看什麼?改變期望值,看實際值和控制量的變化(控制量:僅僅看實際值不夠,還要看控制量是否平滑,控制量即電機佔空比。)

整定三個參數要注意:三個係數互補,不能簡單的採用控制變量法逐個調節。

 

[引用]打個比方,如果現在的輸出是1,目標輸出是100,那麼P的作用是以最快的速度達到100,把P理解爲一個係數即可;而I呢?大家學過高數的,0的積分才能是一個常數,I就是使誤差爲0而起調和作用;D呢?大家都知道微分是求導數,導數代表切線是吧,切線的方向就是最快到至高點的方向。這樣理解,最快獲得最優解,那麼微分就是加快調節過程的作用了。

按照PID調好參數後,簡化公式爲本次誤差,上次誤差,和上上次誤差的線性組合,即可加快PID算法的速度。 

【1.4】對PID的理解

[引用]打個比方,如果現在的輸出是1,目標輸出是100,那麼P的作用是以最快的速度達到100,把P理解爲一個係數即可;而I呢?大家學過高數的,0的積分才能是一個常數,I就是使誤差爲0而起調和作用;D呢?大家都知道微分是求導數,導數代表切線是吧,切線的方向就是最快到至高點的方向。這樣理解,最快獲得最優解,那麼微分就是加快調節過程的作用了。

按照PID調好參數後,簡化公式爲本次誤差,上次誤差,和上上次誤差的線性組合,即可加快PID算法的速度。

爲何採用增量式

【引用】 PID一般有兩種:位置式PID和增量式PID。在小車裏一般用增量式,爲什麼呢?位置式PID的輸出與過去的所有狀態有關,計算時要對e(每一次的控制誤差)進行累加,這個計算量非常大,而明沒有必要。而且小車的PID控制器的輸出並不是絕對數值,而是一個△,代表增多少,減多少。換句話說,通過增量PID算法,每次輸出是PWM要增加多少或者減小多少,而不是PWM的實際值。

 

【嵌入式小家】PID控制算法的C語言實現四增量型PID的C語言實現_嵌入式小家_百度空間

【比喻有些牽強】飛思卡爾智能車PID算法的通俗理解(轉)_小橋流水_新浪博客



發佈了27 篇原創文章 · 獲贊 24 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章