<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

電機控制進階1——PID速度控制

fsdzdzy ? 來源:碼農愛學習 ? 作者:碼農愛學習 ? 2022-02-24 09:19 ? 次閱讀

之前的幾篇文章(電機控制基礎篇),介紹的電機編碼器原理、定時器輸出PWM、定時器編碼器模式測速等。

本篇在前幾篇的基礎上,繼續來學習電機控制,通過PID算法,來進行電機的速度控制,并進行實驗測試。

PID基礎

PID即:Proportional(比例)、Integral(積分)、Differential(微分)的縮寫。

PID是經典的閉環控制算法,具有原理簡單,易于實現,適用面廣,控制參數相互獨立,參數的選定比較簡單等優點。

凡是需要將某一個物理量“保持穩定”的場合(比如維持平衡,穩定溫度、轉速等),PID都會派上大用場。

pYYBAGEggEKAfj2eAACragCRL-Q543.png

PID算法分類

PID算法可分為位置式PID與增量式PID兩大類。

在實際的編程應用中,需要使用離散化的PID算法,以適用計算機的使用環境,下面以電機轉速控制為例,來看一下兩種PID算法的基本原理。

位置式PID

位置式PID是當前系統的實際位置,與想要達到的預期位置的偏差,進行PID控制

pYYBAGEggEaARBM0AACAU93Fqa8873.png

比例P:e(k) 此次誤差

積分I:∑e(i) 誤差的累加

微分D:e(k) - e(k-1) 此次誤差-上次誤差

因為有誤差積分 ∑e(i),一直累加,也就是當前的輸出u(k)與過去的所有狀態都有關系。

位置式PID算法的偽代碼如下

//位置式PID(偽代碼)
previous_err = 0;
integral = 0;
loop: //根據目標值與測量值(如電機的設定速度與讀到的編碼器轉后后的速度),循環計算更新輸出值(如PWM)
	error = setpoint - measured_value;          /*誤差項:目標值-測量值*/
	integral += error * dt;                     /*積分項:誤差項的累計*/
    derivative = (error - previous_error) / dt; /*微分項:誤差的變化率*/
	output = Kp*error + Ki*integral + Kd*derivative; /*三項分別乘以PID系數即為輸出*/
	previous_err = err; //更新誤差
	wait(dt); //等待固定的計算周期
	goto loop;

增量式PID

poYBAGEggEqAIA_fAACe3DBO0Gs621.png

比例P:e(k) - e(k-1) 此次誤差-上次誤差

積分I:e(k) 此次誤差d

微分D:e(k) - 2e(k-1)+e(k-2) 這次誤差-2×上次誤差+上上次誤差

注意增量式PID首先計算的是Δu(k),然后與上次的輸出相加,才是此次的輸出結果。增量式PID沒有誤差累加,控制增量Δu(k)的確定僅與最近3次的采樣值有關。

增量式PID算法的偽代碼如下

//增量式PID(偽代碼)
previous02_error = 0; //上上次偏差
previous01_error = 0; //上次偏差
integral = 0; //積分和
pid_out = 0; //pid增量累加和
loop:
    error = setpoint ? measured_value;  /*誤差項:目標值-測量值*/
    proportion = error - previous01_error;                            /*比例項:誤差項-上次偏差*/
    integral = error * dt;                                            /*積分項:誤差項的累計*/
    derivative = (error ? 2*previous01_error + previous02_error) / dt;/*微分項:上次誤差與上上次誤差的變化率*/
    /*或寫成:derivative = ( (error ? previous01_error)/dt - (previous01_error - previous02_error)/dt )*/
    pid_delta = Kp × error + Ki × integral + Kd × derivative; //計算得到PID增量
    pid_out = pid_out + pid_delta; //計算最終的PID輸出

    previous02_error = previous01_error; //更新上上次偏差
    previous01_error = error; //更新上次偏差
    wait(dt); //等待固定的計算周期
    goto loop;

PID各項的作用

以這個彈簧為例(假設沒有重力,只有空氣阻力),先是在平衡位置上(目標位置),拉它一下,然后松手,這時它會震蕩起來。

poYBAGEggE6Act70AADAgl8CBhc436.gif

P 比例

P就是比例的意思。這里就類比彈簧的彈力(回復力):F=k*Δx

當物塊距離平衡位置越遠時,彈力越大,反之,離平衡位置越近,力越小。

當物塊位于平衡位置上方時,彈性向下,當物塊位于平衡位置下方時,彈性向上,即彈力總是使物塊朝平衡位置施力。

D 微分/求導/變化率

只有P控制,物塊一直在上下震蕩,整個系統不是特別穩定。

這是因為空氣阻力太小,想象一下整個把它放到水里,物塊應該很快會靜止下來。這時因為阻力的作用。

D的作用就相當于阻力

它與變化速度(單位時間內的變化量)有關,變化的越大,它施加的阻力也就越大

它的方向與目標值無關,比如,當物塊從下到上經過平衡位置時,它的方向一直是朝下,

即先是阻止物塊靠近平衡位置,再是阻止物塊遠離平衡位置(對比P的作用,始終阻止物塊遠離平衡位置)

它的作用就是減小系統的超調量了(減少系統在平衡位置震蕩)

I 積分/誤差累積

有了P的動力和D的阻力,這個物塊就可以較快的穩定下來了,那I的作用是什么呢?

想象一下,如果有其它外力的影響,在某一時刻,物塊將要到達平衡位置時,恰好P的動力與外力(與P的作用方向相反的恒定力)抵消,則之后物塊將停在此處附近(因為此時D的力也趨近0,并很快變為0),一直到達不了平衡位置。

這時,I的誤差積分作用就很有必要了:

它計算的誤差的累計,只要有誤差,它就一直增加,開始可能很小,但只要沒要到達平衡位置,該值就會越來越大

它的作用就是消除系統的靜態誤差了

PID參數整定

實際應用,進行PID參數調節時,一般使用試湊法,PID參數整定口訣如下:

參數整定找最佳,從小到大順序查,

先是比例后積分,最后再把微分加,

曲線振蕩很頻繁,比例度盤要放大,

曲線漂浮繞大灣,比例度盤往小扳,

曲線偏離回復慢,積分時間往下降,

曲線波動周期長,積分時間再加長,

曲線振蕩頻率快,先把微分降下來,

動差大來波動慢,微分時間應加長,

理想曲線兩個波,前高后低4比1,

一看二調多分析,調節質量不會低。

電機PID速度控制

上面介紹了PID的基礎知識,接下來就使用位置式PID來實現對直流電機轉速的控制。

程序

自定義PID結構體

typedef struct
{
	float target_val;   //目標值
	float err;          //偏差值
	float err_last;     //上一個偏差值
	float Kp,Ki,Kd;     //比例、積分、微分系數
	float integral;     //積分值
	float output_val;   //輸出值
}PID;

PID算法實現(位置式PID)

float PID_realize(float actual_val)
{
	/*計算目標值與實際值的誤差*/
	pid.err = pid.target_val - actual_val;
	
	/*積分項*/
	pid.integral += pid.err;

	/*PID算法實現*/
	pid.output_val = pid.Kp * pid.err + 
				     pid.Ki * pid.integral + 
				     pid.Kd * (pid.err - pid.err_last);

	/*誤差傳遞*/
	pid.err_last = pid.err;

	/*返回當前實際值*/
	return pid.output_val;
}

周期調用PID計算

//周期定時器的回調函數
void AutoReloadCallback()
{
	int sum = 0;/*編碼器值(PID輸入)*/
	int res_pwm = 0;/*PWM值(PID輸出)*/
	
    /*讀取編碼器測量的速度值*/
	sum = read_encoder();
    /*進行PID運算,得到PWM輸出值*/
    res_pwm = PID_realize(sum);
	/*根據PWM值控制電機轉動*/
	set_motor_rotate(res_pwm);
	
    /*給上位機通道1發送實際值*/
	set_computer_value(SEND_FACT_CMD, CURVES_CH1, &sum, 1); 
}

上位機

這里使用野火多功能調試助手的"PID調試助手“來進行實驗,用于顯示PID調節時的電機轉速曲線。

pYYBAGEggFOAPeU8AACT3tYG0HA877.png

實驗演示

目標速度值設為50(這里的目標值50使用的是編碼器10ms捕獲的脈沖數),通過體調節PID的參數,來測試電機能否較快的達到目標速度。

先調節P

P值先使用10看看效果,從速度曲線可以看出,達不到目標速度,且與目標速度相差較大。

P I D
10 0 0

pYYBAGEggFeARahsAABC9SOfylg763.png

P值加大到100,從速度曲線可以看出,還是達不到目標速度。

P I D
100 0 0

poYBAGEggFuAC_q0AABKTnrsZmU754.png

只使用P,會存在靜差,始終達到不了目標值,這時就要使用積分項來消除靜差了。

再調節I

P保持100,I使用0.2,從速度曲線可以看出,可以達到目標速度,但跟隨的速度較慢。

P I D
100 0.2 0

pYYBAGEggF-ADIcPAABJUypyjM4413.png

P保持100,加大I,使用1.0,從速度曲線可以看出,可以達到目標速度,跟隨的速度加快了。

P I D
100 1.0 0
poYBAGEggGSAV74XAABIOd5Me1Y669.png

P保持100,繼續加大I,使用3.0,從速度曲線可以看出,可以達到目標速度,跟隨的速度進一步加快了。

P I D
100 3.0 0
pYYBAGEggGiAPIHDAABOgMHzDUw658.png

P保持100,再繼續加大I,使用6.0,從速度曲線可以看出,可以達到目標速度,跟隨速度也很快,但有一點過沖。

P I D
100 6.0 0
poYBAGEggGyAbHFDAABQ39wPAJY418.png

對于過沖,可以再加入微分試試,微分D相當于阻力的效果

最后調節D

P保持100,I保持6.0,D使用3.0,從速度曲線上,好像看不出明顯的變化。

P I D
100 6.0 3.0
pYYBAGEggHCALesxAABMH2jfjmk543.png

P保持100,I保持6.0,D加大到6.0,從速度曲線上看,過沖幅度減小了點。

P I D
100 3.0 6.0
poYBAGEggHSAd7IRAABHPxddz4k181.png

演示視頻

https://www.bilibili.com/video/BV18Q4y1R7e8?spm_id_from=333.999.0.0

poYBAGIWTvWASXaAACUEa7Awyk0738.png

總結

本篇簡單介紹了PID的基礎原理與參數整定,若想把PID參數調節好,還需要不斷的實踐與調試。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6008

    文章

    44062

    瀏覽量

    622637
  • 電機控制
    +關注

    關注

    3481

    文章

    1730

    瀏覽量

    265178
  • PWM
    PWM
    +關注

    關注

    114

    文章

    4923

    瀏覽量

    210354
  • PID
    PID
    +關注

    關注

    35

    文章

    1447

    瀏覽量

    84103
  • PID控制
    +關注

    關注

    10

    文章

    444

    瀏覽量

    39739
收藏 人收藏

    評論

    相關推薦

    電機控制進階3——PID串級控制

    前兩篇文章,分別介紹了PID速度控制PID位置控制,分別用來控制
    的頭像 發表于 03-03 09:11 ?1.9w次閱讀
    <b class='flag-5'>電機</b><b class='flag-5'>控制</b><b class='flag-5'>進階</b>3——<b class='flag-5'>PID</b>串級<b class='flag-5'>控制</b>

    電機控制進階2之PID位置控制 相關資料推薦

    上篇文章電機控制進階——PID速度控制講解了電機
    發表于 06-29 07:39

    【創作者之星.No3】電機控制原理與電路設計知識匯總

    :通過檢測信號源,記錄時間的方式編程,需要使用到定時器,本節主要講解定時器如何捕獲單輸入脈沖信號原理,寄存器選擇及設置,定時器詳細編程代碼。4、電機控制進階1——
    發表于 04-08 14:53

    PID調節控制電機速度控制

    PID調節控制電機速度控制 :將偏差的比例(Proportion)、積分(Integral)和微分(Differential)通過線性組合
    發表于 09-19 11:07 ?197次下載

    PID調節控制電機速度控制(非常好)

    PID調節控制電機速度控制(非常好)有做飛思卡爾智能車的同學可以看一看啊,
    發表于 02-17 09:47 ?191次下載

    PID調節控制電機速度控制資料

    PID調節控制電機速度控制、ourdevBasic PID的老外的那篇經典文章、
    發表于 07-20 10:21 ?0次下載

    PID調節控制電機速度控制系統文件下載

    PID調節控制電機速度控制系統文件下載
    發表于 05-24 10:58 ?47次下載

    PID 調節控制電機速度控制中文版下載

    PID 調節控制電機速度控制中文版下載
    發表于 11-17 17:35 ?0次下載

    電機控制進階2——PID位置控制

    上篇文章講解了電機速度控制,可以控制電機快速準確地到達指定速度。
    的頭像 發表于 02-26 12:01 ?6501次閱讀
    <b class='flag-5'>電機</b><b class='flag-5'>控制</b><b class='flag-5'>進階</b>2——<b class='flag-5'>PID</b>位置<b class='flag-5'>控制</b>

    PID調節控制電機速度控制說明

    PID調節控制電機速度控制說明.
    發表于 04-06 16:08 ?12次下載

    電機控制中的PID

    FOC算法中的電流環,速度環都涉及到PID控制 PID又分位置式PID控制算法和增量式
    發表于 05-05 11:51 ?15次下載
    <b class='flag-5'>電機</b><b class='flag-5'>控制</b>中的<b class='flag-5'>PID</b>

    電機控制進階——PID速度控制

    PID即:Proportional(比例)、Integral(積分)、Differential(微分)的縮寫。 PID是經典的閉環控制算法,具有原理簡單,易于實現,適用面廣,控制參數
    發表于 05-05 15:01 ?4次下載
    <b class='flag-5'>電機</b><b class='flag-5'>控制</b><b class='flag-5'>進階</b>——<b class='flag-5'>PID</b><b class='flag-5'>速度</b><b class='flag-5'>控制</b>

    電機控制進階2——PID位置控制

    本篇來介紹電機的位置環控制,實現電機快速準確地轉動到指定位置?;仡櫳掀?,電機速度PID
    發表于 05-06 11:50 ?8次下載
    <b class='flag-5'>電機</b><b class='flag-5'>控制</b><b class='flag-5'>進階</b>2——<b class='flag-5'>PID</b>位置<b class='flag-5'>控制</b>

    STM32實現四驅小車電機控制任務之電機速度PID控制算法

    目錄. 一. 緒論 二. 電機速度PID原理 三. STM32使用CAN總線實現大疆M3508電機速度閉環
    發表于 05-06 10:28 ?7次下載
    STM32實現四驅小車<b class='flag-5'>電機</b><b class='flag-5'>控制</b>任務之<b class='flag-5'>電機</b><b class='flag-5'>速度</b><b class='flag-5'>PID</b><b class='flag-5'>控制</b>算法

    單級PID控制帶編碼器的直流減速電機速度

    STM32 Cubemax(七) —— 單級PID控制帶編碼器的直流減速電機速度目錄 STM32 Cubemax(七) —— 單級PID
    發表于 05-16 15:51 ?3次下載
    單級<b class='flag-5'>PID</b><b class='flag-5'>控制</b>帶編碼器的直流減速<b class='flag-5'>電機</b><b class='flag-5'>速度</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>