衡阳派盒市场营销有限公司

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

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

3天內不再提示

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

碼農愛學習 ? 來源:碼農愛學習 ? 作者:碼農愛學習 ? 2022-03-03 09:11 ? 次閱讀


前兩篇文章:

http://www.zgszdi.cn/d/1796839.html

http://www.zgszdi.cn/d/1798370.html

分別介紹了PID速度控制和PID位置控制,分別用來控制電機以期望的速度持續轉動以及以期望的位置(圈數)轉動,這里的期望值都只有一個,但是,如果想要以期望的速度轉動到期望的位置(啟動與停止的加減速過程不考慮),該怎么控制呢?那就要將兩者結合起來了,即PID的串級控制來控制電機。

串級PID結構圖

PID串級控制的典型結構為位置環+速度環+電流環,如下圖。

PID串級控制中,最外環是輸入是整個控制系統的期望值,外環PID的輸出值是內環PID的期望值。

能夠使用三環控制的前提是要硬件支持,比如位置環和速度環需要實時的電機轉動位置和轉動速度作為反饋,這就需要電機需要配有編碼器用于測速與測量轉動的位置;電流環需要有電流采樣電路來實時獲取電機的電流作為反饋。

poYBAGEDqnyAaKz3AABbI6UjquI821.png

如果沒有電流采樣電路,可以將電流環去掉,只使用位置環+速度環,系統的期望仍是轉動的位置,內環可以調節轉動的速度。

poYBAGEDqoCAR2j-AABF-aCtQ_Q220.png

另外,如果只是想控制電機轉速實現電機調速,可以使用速度環+電流環,系統的期望仍是轉動的位置,內環可以調節電機的電流,增強系統轉動調節的抗干擾能力。

pYYBAGEDqoSAU0fqAAA8tylWYOw423.png

位置環+速度環實踐

由于我的電機沒有電流測量電路,所以,本文以位置環+速度環來學習PID串級控制。就是按照下面這個圖:

poYBAGEDqoCAR2j-AABF-aCtQ_Q220.png

PID參數定義

由于是串級PID控制,每一級的PID都要有自己的參數,本次實驗使用位置PID+速度PID,參數定義如下:

/*定義位置PID與速度PID結構體型的全局變量*/
PID pid_location;
PID pid_speed;

/**
  * @brief  PID參數初始化
  *	@note 	無
  * @retval 無
  */
void PID_param_init()
{
	/* 位置相關初始化參數 */
	pid_location.target_val = TOTAL_RESOLUTION*10;				
	pid_location.output_val = 0.0;
	pid_location.err = 0.0;
	pid_location.err_last = 0.0;
	pid_location.integral = 0.0;

	pid_location.Kp = 0.05;
	pid_location.Ki = 0;
	pid_location.Kd = 0;

	/* 速度相關初始化參數 */
	pid_speed.target_val=10.0;				
	pid_speed.output_val=0.0;
	pid_speed.err=0.0;
	pid_speed.err_last=0.0;
	pid_speed.integral=0.0;

	pid_speed.Kp = 80.0;
	pid_speed.Ki = 2.0;
	pid_speed.Kd = 100.0;
}

位置PID的實現

這里有兩點需要注意:

閉環死區的設定

閉環死區是指執行機構的最小控制量,無法再通過調節來滿足控制精度,如果仍然持續調節,系統則會在目標值前后頻繁動作,不能穩定下來。

比如某個系統的控制精度是1,但目標值需要是1.5,則無論怎么調節,最終的結果只能控制在 1或 2,始終無法達到預設值。這 1.5L小數點后的范圍,就是閉環死區,系統是無法控制的,誤差會一直存在,容易發生震蕩現象。

對應精度要求不高的系統,可以設定閉環死區,比如將允許的誤差范圍設為0.5,則最終結果在 1或 2都認為是沒有誤差,這時將目標值 與實際值之差強制設為 0,認為沒有誤差,即限定了閉環死區。

積分分離的設定

通過積分分離的方式來實現抗積分飽和,積分飽和是指執行機構達到極限輸出能力了,仍無法到達目標值,在很長一段時間內無法消除靜差造成的。

例如,PWM輸出到了100%,仍達不到期望位置,此時若一直進行誤差累加,在一段時間后, PID 的積分項累計了很大的數值,如果這時候到達了目標值或者重新設定了目標值,由于積分由于累計的誤差很大,系統并不能立即調整到目標值,可能造成超調或失調的現象。

解決積分飽和的一種方法是使用積分分離,該方法是在累計誤差小于某個閾值才使用積分項,累計誤差過大則不再繼續累計誤差,相當于只使用了PD控制器

控制流程圖

帶有閉環死區積分分離的PID控制流程如下圖:

poYBAGEDqo2AMCnLAABHUOq9RWI531.png

完整的位置PID代碼如下:

/**
  * @brief  位置PID算法實現
  * @param  actual_val:實際值
  *	@note 	無
  * @retval 通過PID計算后的輸出
  */
#define LOC_DEAD_ZONE 60 /*位置環死區*/
#define LOC_INTEGRAL_START_ERR 200 /*積分分離時對應的誤差范圍*/
#define LOC_INTEGRAL_MAX_VAL 800   /*積分范圍限定,防止積分飽和*/
float location_pid_realize(PID *pid, float actual_val)
{
	/*計算目標值與實際值的誤差*/
	pid->err = pid->target_val - actual_val;

	/* 設定閉環死區 */
	if((pid->err >= -LOC_DEAD_ZONE) && (pid->err <= LOC_DEAD_ZONE))
	{
		pid->err = 0;
		pid->integral = 0;
		pid->err_last = 0;
	}

	/*積分項,積分分離,偏差較大時去掉積分作用*/
	if(pid->err > -LOC_INTEGRAL_START_ERR && pid->err < LOC_INTEGRAL_START_ERR)
	{
		pid->integral += pid->err;  
        /*積分范圍限定,防止積分飽和*/
		if(pid->integral > LOC_INTEGRAL_MAX_VAL)
		{
			pid->integral = LOC_INTEGRAL_MAX_VAL;
		}
		else if(pid->integral < -LOC_INTEGRAL_MAX_VAL)
		{
			pid->integral = -LOC_INTEGRAL_MAX_VAL;
		}
	}	

	/*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;
}

串級控制代碼

//周期定時器的回調函數
void AutoReloadCallback()
{
	static uint32_t location_timer = 0;    // 位置環周期
	
	static __IO int encoderNow = 0;    /*當前時刻總計數值*/
    static __IO int encoderLast = 0;   /*上一時刻總計數值*/
	int encoderDelta = 0; /*當前時刻與上一時刻編碼器的變化量*/
	float actual_speed = 0;  /*實際測得速度*/
	int actual_speed_int = 0;
	
	int res_pwm = 0;/*PID計算得到的PWM值*/
	static int i=0;
	
	/*【1】讀取編碼器的值*/
	encoderNow = read_encoder() + EncoderOverflowCnt*ENCODER_TIM_PERIOD;/*獲取當前的累計值*/
	encoderDelta = encoderNow - encoderLast; /*得到變化值*/
	encoderLast = encoderNow;/*更新上次的累計值*/
	
	/*【2】位置PID運算,得到PWM控制值*/
	if ((location_timer++ % 2) == 0)
	{
		float control_val = 0;   /*當前控制值*/
		
		/*位置PID計算*/
		control_val = location_pid_realize(&pid_location, encoderNow);  
		
        /*目標速度值限制*/
		speed_val_protect(&control_val);

		/*設定速度PID的目標值*/
		set_pid_target(&pid_speed, control_val);    
	}
	  
	/* 轉速(1秒鐘轉多少圈)=單位時間內的計數值/總分辨率*時間系數, 再乘60變為1分鐘轉多少圈 */
    actual_speed = (float)encoderDelta / TOTAL_RESOLUTION * 10 * 60;
    
	/*【3】速度PID運算,得到PWM控制值*/
	actual_speed_int = actual_speed;
	res_pwm = pwm_val_protect((int)speed_pid_realize(&pid_speed, actual_speed));
	
	/*【4】PWM控制電機*/
	set_motor_rotate(res_pwm);
	
	/*【5】數據上傳到上位機顯示*/
	set_computer_value(SEND_FACT_CMD, CURVES_CH1, &encoderNow, 1);   /*給通道1發送實際的電機【位置】值*/
}

PID的計算是通過定時器調用,每10ms一次,從代碼中可以看到,內環(速度PID)控制的周期要比外環(位置PID)的周期短,位置PID是每兩次循環計算一次,因為內環控制著最終的輸出,這個輸出對應的就是實際場景中的控制量 (本實驗最終控制的是位置),位置是無法突變,是需要時間積累的,所以內環輸出盡可能快些。

視頻演示

視頻中,測試以不同的目標速度到達目標位置,視頻后半段測試引入干擾情況下的控制效果:

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

poYBAGIfi1SAev4XAB7D6AFF3Bg344.png

開源代碼

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

    關注

    6043

    文章

    44621

    瀏覽量

    638626
  • 電機控制
    +關注

    關注

    3540

    文章

    1897

    瀏覽量

    269267
  • STM32
    +關注

    關注

    2272

    文章

    10924

    瀏覽量

    357608
  • PID
    PID
    +關注

    關注

    35

    文章

    1473

    瀏覽量

    85826
收藏 人收藏

    評論

    相關推薦

    什么是PID? 簡單PIDPID的優劣對比

    什么是PID? 什么是PID?顧名思義就是兩個串起來的
    的頭像 發表于 02-26 15:21 ?2w次閱讀
    什么是<b class='flag-5'>串</b><b class='flag-5'>級</b><b class='flag-5'>PID</b>? 簡單<b class='flag-5'>PID</b>和<b class='flag-5'>串</b><b class='flag-5'>級</b><b class='flag-5'>PID</b>的優劣對比

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

    之前的幾篇文章(電機控制基礎篇),介紹的電機編碼器原理、定時器輸出PWM、定時器編碼器模式測速等。 本篇在前幾篇的基礎上,繼續來學習電機控制
    的頭像 發表于 02-24 09:19 ?2.6w次閱讀
    <b class='flag-5'>電機</b><b class='flag-5'>控制</b><b class='flag-5'>進階</b>1——<b class='flag-5'>PID</b>速度<b class='flag-5'>控制</b>

    一文詳解PID控制

    閥,從而對外環被控量具有更好的控制效果。這樣的控制系統被稱為系統。PID
    發表于 10-22 10:11

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

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

    基于大疆RM3508電機PID相關資料推薦

    2.配置程序關于3508的配置程序以及一些其他部分在我的另外一篇博客里有詳細的介紹,本篇主要是詳細講解3508pid(轉固定角度)。大疆3508/2006/6020電機使用教程
    發表于 06-30 06:15

    PID控制的原理是什么?如何去實現PID的源碼呢

    PID控制的原理是什么?如何去實現PID的源碼呢?
    發表于 12-17 06:28

    如何用PID控制控制電機

    PID速度控制PID位置控制是什么?如何用PID
    發表于 12-21 06:45

    PID控制控制電機

    的加減速過程不考慮),該怎么控制呢?那就要將兩者結合起來了,即PID控制控制
    發表于 01-10 08:30

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

    參數,編碼器模式配置,PID數值計算與控制邏輯等核心程序實現。6、電機控制進階3——
    發表于 04-08 14:53

    基于PID控制技術的堆垛機控制器的設計

    本文從提高堆垛機作業系統的工作效率和可靠性的角度出發,利用控制原理和積分分離的PID 算法,建立了堆垛機
    發表于 08-29 11:41 ?14次下載

    PID控制原理

    PID控制原理 計算機控制系統的典型結構如
    發表于 04-28 14:33 ?1.5w次閱讀
    <b class='flag-5'>串</b><b class='flag-5'>級</b><b class='flag-5'>PID</b><b class='flag-5'>控制</b>原理

    壓控大功率電流源的PID控制算法設計

    提出了一種基于PID控制算法的壓控大功率電流源設計方案。該電流源在內環電路采用PID控制電路
    發表于 02-10 13:25 ?4583次閱讀
    壓控大功率電流源的<b class='flag-5'>串</b><b class='flag-5'>級</b><b class='flag-5'>PID</b><b class='flag-5'>控制</b>算法設計

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

    本篇來介紹電機的位置環控制,實現電機快速準確地轉動到指定位置。回顧上篇,電機速度PID控制的結構
    發表于 05-06 11:50 ?9次下載
    <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(比例-積分-微分)控制器是常用的控制算法。本文將介紹控制
    的頭像 發表于 08-23 09:13 ?2256次閱讀

    pid內環和外環怎么確定

    控制系統中,PID控制器是一種常見的控制策略,它通過將兩個
    的頭像 發表于 08-23 09:17 ?2051次閱讀
    单机百家乐官网棋牌| 百家乐官网l路单| 威尼斯人娱乐网赌| 澳门百家乐游戏说明| 网络百家乐官网游戏机怎么破解| 三公百家乐在线哪里可以玩| 百家乐代理占成| 百家乐官网娱乐网网| 百家乐官网玩法注意事项| 老虎机破解器| 上海百家乐的玩法技巧和规则| 免邮百家乐官网布桌| 百家乐官网翻天粤语快播| 东阿县| 百家乐官网玩法秘决| 大发888注册官方网站| 杰克百家乐玩法| 百家乐摇色子网站| 贝博百家乐官网的玩法技巧和规则 | 网上百家乐官网是现场吗| 诏安县| 百家乐官网下注平台| 百家乐官网视频游戏平台| 网上百家乐官网骗人吗| 百利宫娱乐城官方网| 香港六合彩报码| 黄大仙区| 真钱轮盘| 家乐在线| 百家乐官网玩法和技巧| 百家乐官网网站建设| 百家乐官网微笑玩法| 百家乐官网赢钱公式1| 百家乐官网强弱走势图| 网上百家乐官网公| 线上百家乐赢钱| 蓝盾百家乐代理| 成都百家乐的玩法技巧和规则| 二八杠下载| 资兴市| 广州百家乐官网娱乐场开户注册|