0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

電機(jī)控制進(jìn)階3——PID串級(jí)控制

碼農(nóng)愛學(xué)習(xí) ? 來源:碼農(nóng)愛學(xué)習(xí) ? 作者:碼農(nóng)愛學(xué)習(xí) ? 2022-03-03 09:11 ? 次閱讀


前兩篇文章:

http://www.ttokpm.com/d/1796839.html

http://www.ttokpm.com/d/1798370.html

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

串級(jí)PID結(jié)構(gòu)圖

PID串級(jí)控制的典型結(jié)構(gòu)為位置環(huán)+速度環(huán)+電流環(huán),如下圖。

PID串級(jí)控制中,最外環(huán)是輸入是整個(gè)控制系統(tǒng)的期望值,外環(huán)PID的輸出值是內(nèi)環(huán)PID的期望值。

能夠使用三環(huán)控制的前提是要硬件支持,比如位置環(huán)和速度環(huán)需要實(shí)時(shí)的電機(jī)轉(zhuǎn)動(dòng)位置和轉(zhuǎn)動(dòng)速度作為反饋,這就需要電機(jī)需要配有編碼器用于測(cè)速與測(cè)量轉(zhuǎn)動(dòng)的位置;電流環(huán)需要有電流采樣電路來實(shí)時(shí)獲取電機(jī)的電流作為反饋。

poYBAGEDqnyAaKz3AABbI6UjquI821.png

如果沒有電流采樣電路,可以將電流環(huán)去掉,只使用位置環(huán)+速度環(huán),系統(tǒng)的期望仍是轉(zhuǎn)動(dòng)的位置,內(nèi)環(huán)可以調(diào)節(jié)轉(zhuǎn)動(dòng)的速度。

poYBAGEDqoCAR2j-AABF-aCtQ_Q220.png

另外,如果只是想控制電機(jī)轉(zhuǎn)速實(shí)現(xiàn)電機(jī)調(diào)速,可以使用速度環(huán)+電流環(huán),系統(tǒng)的期望仍是轉(zhuǎn)動(dòng)的位置,內(nèi)環(huán)可以調(diào)節(jié)電機(jī)的電流,增強(qiáng)系統(tǒng)轉(zhuǎn)動(dòng)調(diào)節(jié)的抗干擾能力。

pYYBAGEDqoSAU0fqAAA8tylWYOw423.png

位置環(huán)+速度環(huán)實(shí)踐

由于我的電機(jī)沒有電流測(cè)量電路,所以,本文以位置環(huán)+速度環(huán)來學(xué)習(xí)PID串級(jí)控制。就是按照下面這個(gè)圖:

poYBAGEDqoCAR2j-AABF-aCtQ_Q220.png

PID參數(shù)定義

由于是串級(jí)PID控制,每一級(jí)的PID都要有自己的參數(shù),本次實(shí)驗(yàn)使用位置PID+速度PID,參數(shù)定義如下:

/*定義位置PID與速度PID結(jié)構(gòu)體型的全局變量*/
PID pid_location;
PID pid_speed;

/**
  * @brief  PID參數(shù)初始化
  *	@note 	無
  * @retval 無
  */
void PID_param_init()
{
	/* 位置相關(guān)初始化參數(shù) */
	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;

	/* 速度相關(guān)初始化參數(shù) */
	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的實(shí)現(xiàn)

這里有兩點(diǎn)需要注意:

閉環(huán)死區(qū)的設(shè)定

閉環(huán)死區(qū)是指執(zhí)行機(jī)構(gòu)的最小控制量,無法再通過調(diào)節(jié)來滿足控制精度,如果仍然持續(xù)調(diào)節(jié),系統(tǒng)則會(huì)在目標(biāo)值前后頻繁動(dòng)作,不能穩(wěn)定下來。

比如某個(gè)系統(tǒng)的控制精度是1,但目標(biāo)值需要是1.5,則無論怎么調(diào)節(jié),最終的結(jié)果只能控制在 1或 2,始終無法達(dá)到預(yù)設(shè)值。這 1.5L小數(shù)點(diǎn)后的范圍,就是閉環(huán)死區(qū),系統(tǒng)是無法控制的,誤差會(huì)一直存在,容易發(fā)生震蕩現(xiàn)象。

對(duì)應(yīng)精度要求不高的系統(tǒng),可以設(shè)定閉環(huán)死區(qū),比如將允許的誤差范圍設(shè)為0.5,則最終結(jié)果在 1或 2都認(rèn)為是沒有誤差,這時(shí)將目標(biāo)值 與實(shí)際值之差強(qiáng)制設(shè)為 0,認(rèn)為沒有誤差,即限定了閉環(huán)死區(qū)。

積分分離的設(shè)定

通過積分分離的方式來實(shí)現(xiàn)抗積分飽和,積分飽和是指執(zhí)行機(jī)構(gòu)達(dá)到極限輸出能力了,仍無法到達(dá)目標(biāo)值,在很長一段時(shí)間內(nèi)無法消除靜差造成的。

例如,PWM輸出到了100%,仍達(dá)不到期望位置,此時(shí)若一直進(jìn)行誤差累加,在一段時(shí)間后, PID 的積分項(xiàng)累計(jì)了很大的數(shù)值,如果這時(shí)候到達(dá)了目標(biāo)值或者重新設(shè)定了目標(biāo)值,由于積分由于累計(jì)的誤差很大,系統(tǒng)并不能立即調(diào)整到目標(biāo)值,可能造成超調(diào)或失調(diào)的現(xiàn)象。

解決積分飽和的一種方法是使用積分分離,該方法是在累計(jì)誤差小于某個(gè)閾值才使用積分項(xiàng),累計(jì)誤差過大則不再繼續(xù)累計(jì)誤差,相當(dāng)于只使用了PD控制器

控制流程圖

帶有閉環(huán)死區(qū)積分分離的PID控制流程如下圖:

poYBAGEDqo2AMCnLAABHUOq9RWI531.png

完整的位置PID代碼如下:

/**
  * @brief  位置PID算法實(shí)現(xiàn)
  * @param  actual_val:實(shí)際值
  *	@note 	無
  * @retval 通過PID計(jì)算后的輸出
  */
#define LOC_DEAD_ZONE 60 /*位置環(huán)死區(qū)*/
#define LOC_INTEGRAL_START_ERR 200 /*積分分離時(shí)對(duì)應(yīng)的誤差范圍*/
#define LOC_INTEGRAL_MAX_VAL 800   /*積分范圍限定,防止積分飽和*/
float location_pid_realize(PID *pid, float actual_val)
{
	/*計(jì)算目標(biāo)值與實(shí)際值的誤差*/
	pid->err = pid->target_val - actual_val;

	/* 設(shè)定閉環(huán)死區(qū) */
	if((pid->err >= -LOC_DEAD_ZONE) && (pid->err <= LOC_DEAD_ZONE))
	{
		pid->err = 0;
		pid->integral = 0;
		pid->err_last = 0;
	}

	/*積分項(xiàng),積分分離,偏差較大時(shí)去掉積分作用*/
	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算法實(shí)現(xiàn)*/
	pid->output_val = pid->Kp * pid->err +
	                  pid->Ki * pid->integral +
	                  pid->Kd * (pid->err - pid->err_last);

	/*誤差傳遞*/
	pid->err_last = pid->err;

	/*返回當(dāng)前實(shí)際值*/
	return pid->output_val;
}

串級(jí)控制代碼

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

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

PID的計(jì)算是通過定時(shí)器調(diào)用,每10ms一次,從代碼中可以看到,內(nèi)環(huán)(速度PID)控制的周期要比外環(huán)(位置PID)的周期短,位置PID是每?jī)纱窝h(huán)計(jì)算一次,因?yàn)閮?nèi)環(huán)控制著最終的輸出,這個(gè)輸出對(duì)應(yīng)的就是實(shí)際場(chǎng)景中的控制量 (本實(shí)驗(yàn)最終控制的是位置),位置是無法突變,是需要時(shí)間積累的,所以內(nèi)環(huán)輸出盡可能快些。

視頻演示

視頻中,測(cè)試以不同的目標(biāo)速度到達(dá)目標(biāo)位置,視頻后半段測(cè)試引入干擾情況下的控制效果:

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

poYBAGIfi1SAev4XAB7D6AFF3Bg344.png

開源代碼

pYYBAGIfi1qAHxAXAADa2vDgLF0830.png
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6023

    文章

    44376

    瀏覽量

    628369
  • 電機(jī)控制
    +關(guān)注

    關(guān)注

    3512

    文章

    1811

    瀏覽量

    267340
  • STM32
    +關(guān)注

    關(guān)注

    2258

    文章

    10828

    瀏覽量

    352482
  • PID
    PID
    +關(guān)注

    關(guān)注

    35

    文章

    1466

    瀏覽量

    84836
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是級(jí)PID? 簡(jiǎn)單PID級(jí)PID的優(yōu)劣對(duì)比

    什么是級(jí)PID? 什么是級(jí)PID?顧名思義就是兩個(gè)串起來的
    的頭像 發(fā)表于 02-26 15:21 ?1.9w次閱讀
    什么是<b class='flag-5'>串</b><b class='flag-5'>級(jí)</b><b class='flag-5'>PID</b>? 簡(jiǎn)單<b class='flag-5'>PID</b>和<b class='flag-5'>串</b><b class='flag-5'>級(jí)</b><b class='flag-5'>PID</b>的優(yōu)劣對(duì)比

    電機(jī)控制進(jìn)階1——PID速度控制

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

    一文詳解PID級(jí)控制?

    閥,從而對(duì)外環(huán)被控量具有更好的控制效果。這樣的控制系統(tǒng)被稱為級(jí)系統(tǒng)。PID
    發(fā)表于 10-22 10:11

    電機(jī)控制進(jìn)階2之PID位置控制 相關(guān)資料推薦

    上篇文章電機(jī)控制進(jìn)階——PID速度控制講解了電機(jī)的速度環(huán)控制
    發(fā)表于 06-29 07:39

    基于大疆RM3508電機(jī)級(jí)PID相關(guān)資料推薦

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

    PID控制的原理是什么?如何去實(shí)現(xiàn)級(jí)PID的源碼呢

    PID控制的原理是什么?如何去實(shí)現(xiàn)級(jí)PID的源碼呢?
    發(fā)表于 12-17 06:28

    如何用PID級(jí)控制控制電機(jī)?

    PID速度控制PID位置控制是什么?如何用PID級(jí)
    發(fā)表于 12-21 06:45

    PID級(jí)控制控制電機(jī)

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

    【創(chuàng)作者之星.No3電機(jī)控制原理與電路設(shè)計(jì)知識(shí)匯總

    參數(shù),編碼器模式配置,PID數(shù)值計(jì)算與控制邏輯等核心程序?qū)崿F(xiàn)。6、電機(jī)控制進(jìn)階3——
    發(fā)表于 04-08 14:53

    基于級(jí)PID控制技術(shù)的堆垛機(jī)控制器的設(shè)計(jì)

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

    級(jí)PID控制原理

    級(jí)PID控制原理 級(jí)計(jì)算機(jī)控制系統(tǒng)的典型結(jié)構(gòu)如
    發(fā)表于 04-28 14:33 ?1.5w次閱讀
    <b class='flag-5'>串</b><b class='flag-5'>級(jí)</b><b class='flag-5'>PID</b><b class='flag-5'>控制</b>原理

    壓控大功率電流源的級(jí)PID控制算法設(shè)計(jì)

    提出了一種基于級(jí)PID控制算法的壓控大功率電流源設(shè)計(jì)方案。該電流源在內(nèi)環(huán)電路采用PID控制電路
    發(fā)表于 02-10 13:25 ?4226次閱讀
    壓控大功率電流源的<b class='flag-5'>串</b><b class='flag-5'>級(jí)</b><b class='flag-5'>PID</b><b class='flag-5'>控制</b>算法設(shè)計(jì)

    電機(jī)控制進(jìn)階2——PID位置控制

    本篇來介紹電機(jī)的位置環(huán)控制,實(shí)現(xiàn)電機(jī)快速準(zhǔn)確地轉(zhuǎn)動(dòng)到指定位置?;仡櫳掀?,電機(jī)速度PID控制的結(jié)構(gòu)
    發(fā)表于 05-06 11:50 ?9次下載
    <b class='flag-5'>電機(jī)</b><b class='flag-5'>控制</b><b class='flag-5'>進(jìn)階</b>2——<b class='flag-5'>PID</b>位置<b class='flag-5'>控制</b>

    級(jí)控制pid參數(shù)怎么調(diào)節(jié)

    PID(比例-積分-微分)控制器是常用的控制算法。本文將介紹級(jí)控制
    的頭像 發(fā)表于 08-23 09:13 ?317次閱讀

    級(jí)pid內(nèi)環(huán)和外環(huán)怎么確定

    控制系統(tǒng)中,級(jí)PID控制器是一種常見的控制策略,它通過將兩個(gè)
    的頭像 發(fā)表于 08-23 09:17 ?346次閱讀