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

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

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

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

碼農(nóng)愛(ài)學(xué)習(xí) ? 來(lái)源:碼農(nóng)愛(ài)學(xué)習(xí) ? 作者:碼農(nóng)愛(ài)學(xué)習(xí) ? 2022-02-26 12:01 ? 次閱讀

上篇文章講解了電機(jī)的速度環(huán)控制,可以控制電機(jī)快速準(zhǔn)確地到達(dá)指定速度。

本篇來(lái)介紹電機(jī)的位置環(huán)控制,實(shí)現(xiàn)電機(jī)快速準(zhǔn)確地轉(zhuǎn)動(dòng)到指定位置。

1 位置控制與速度控制的區(qū)別

回顧上篇,電機(jī)速度PID控制的結(jié)構(gòu)圖如下,目標(biāo)值是設(shè)定的速度,通過(guò)編碼器獲取電機(jī)的轉(zhuǎn)速作為反饋,實(shí)現(xiàn)電機(jī)轉(zhuǎn)速的控制。

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

再來(lái)看電機(jī)位置PID控制,其結(jié)構(gòu)圖如下,目標(biāo)值是設(shè)定的位置,通過(guò)編碼器獲取電機(jī)累計(jì)轉(zhuǎn)動(dòng)的脈沖數(shù)作為反饋,實(shí)現(xiàn)電機(jī)位置的控制。

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

所以:對(duì)比兩張圖,速度控制與位置控制的主要區(qū)別,就是控制量的不同。

2 核心程序

了解了速度控制與位置控制的區(qū)別后,下面就可以修改程序。

2.1 編碼器相關(guān)

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

2.1.1 電機(jī)與編碼器參數(shù)

編碼器部分,需要根據(jù)自己電機(jī)的實(shí)際參數(shù)進(jìn)行設(shè)定,比如我用到的電機(jī):

編碼器一圈的物理脈沖數(shù)為11

定時(shí)器編碼器模式通過(guò)設(shè)置倍頻來(lái)實(shí)現(xiàn)4倍頻

電機(jī)的減速齒輪的減速比為1:34

所以,電機(jī)轉(zhuǎn)一圈總的脈沖數(shù),即定時(shí)器能讀到的脈沖數(shù)為11*4*34= 1496。

#define ENCODER_RESOLUTION 11  

/*編碼器一圈的物理脈沖數(shù)*/

#define ENCODER_MULTIPLE 4    

/*編碼器倍頻,通過(guò)定時(shí)器的編碼器模式設(shè)置*/

#define MOTOR_REDUCTION_RATIO 34 

/*電機(jī)的減速比*/

?

/*電機(jī)轉(zhuǎn)一圈總的脈沖數(shù)(定時(shí)器能讀到的脈沖數(shù)) = 編碼器物理脈沖數(shù)*編碼器倍頻*電機(jī)減速比 */

/* 11*4*34= 1496*/

#define TOTAL_RESOLUTION ( ENCODER_RESOLUTION*ENCODER_MULTIPLE*MOTOR_REDUCTION_RATIO ) 

想要了解更多關(guān)于編碼器的使用,可參照之前的文章: ( http://www.ttokpm.com/d/1639052.html )

2.1.2 定時(shí)器編碼器模式配置

用于編碼器捕獲的定時(shí)器的一些宏定義。

#define ENCODER_TIM_PSC  0     

/*計(jì)數(shù)器分頻*/

#define ENCODER_TIM_PERIOD  65535  

/*計(jì)數(shù)器最大值*/

#define CNT_INIT 0         

/*計(jì)數(shù)器初值*/

配置主要關(guān)注重裝載值,倍頻,溢出中斷設(shè)置。

/* TIM4通道1通道2 正交編碼器 */
void TIMx_encoder_init(void)                      
{ 
	GPIO_InitTypeDef GPIO_InitStruct;            /*GPIO*/
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStruct; /*時(shí)基*/
	TIM_ICInitTypeDef TIM_ICInitStruct;          /*輸入通道*/
	NVIC_InitTypeDef NVIC_InitStructure;         /*中斷*/
    
    /*GPIO初始化*/    
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); /*使能GPIO時(shí)鐘 AHB1*/                    
	GPIO_StructInit(&GPIO_InitStruct);        
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; 
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;        /*復(fù)用功能*/
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;	 /*速度100MHz*/
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;   
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;        
	GPIO_Init(GPIOB, &GPIO_InitStruct); 
	
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_TIM4); 
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_TIM4); 

	/*時(shí)基初始化*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);   /*使能定時(shí)器時(shí)鐘 APB1*/
	TIM_DeInit(TIM4);  
	TIM_TimeBaseStructInit(&TIM_TimeBaseStruct);    
	TIM_TimeBaseStruct.TIM_Prescaler = ENCODER_TIM_PSC;       /*預(yù)分頻 */        
	TIM_TimeBaseStruct.TIM_Period = ENCODER_TIM_PERIOD;       /*周期(重裝載值)*/
	TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;      
	TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;  /*連續(xù)向上計(jì)數(shù)模式*/  
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStruct); 

	/*編碼器模式配置:同時(shí)捕獲通道1與通道2(即4倍頻),極性均為Rising*/
	TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); 
	TIM_ICStructInit(&TIM_ICInitStruct);        
	TIM_ICInitStruct.TIM_ICFilter = 0;   /*輸入通道的濾波參數(shù)*/
	TIM_ICInit(TIM4, &TIM_ICInitStruct); /*輸入通道初始化*/
	TIM_SetCounter(TIM4, CNT_INIT);      /*CNT設(shè)初值*/
	TIM_ClearFlag(TIM4,TIM_IT_Update);   /*中斷標(biāo)志清0*/
	TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); /*中斷使能*/
	TIM_Cmd(TIM4,ENABLE);                /*使能CR寄存器*/
	
	/*中斷配置*/
	NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn; //定時(shí)器4中斷
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //搶占優(yōu)先級(jí)1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x01; //子優(yōu)先級(jí)1
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
} 

想要了解更多關(guān)于定時(shí)器編碼器模式配置的詳細(xì)介紹,可參照之前的文章:

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

2.1.3 讀取編碼器的值

讀取值,這里直接讀取原始值即可,讀取后也不需要再設(shè)置計(jì)數(shù)初值,因?yàn)槭褂玫囊绯鲋袛唷?/p>

uint32_t read_encoder(void)
{
	uint32_t encoderNum = 0;
	encoderNum = (TIM4->CNT); 
	return encoderNum;
}

2.1.4 編碼器計(jì)數(shù)值溢出處理

溢出中斷中,主要判斷是向上溢出還是向下溢出,因?yàn)殡姍C(jī)可以正反轉(zhuǎn),所以需要記錄溢出的方向。

/* 定時(shí)器溢出次數(shù) */
__IO int16_t EncoderOverflowCnt = 0;

//定時(shí)器4中斷服務(wù)函數(shù)
void TIM4_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET) //溢出中斷
	{
		if((TIM4->CR1 & TIM_CounterMode_Down) != TIM_CounterMode_Down)
		{
			EncoderOverflowCnt++;/*編碼器計(jì)數(shù)值[向上]溢出*/
		}
		else
		{
			EncoderOverflowCnt--;/*編碼器計(jì)數(shù)值[向下]溢出*/
		}
	}
	TIM_ClearITPendingBit(TIM4,TIM_IT_Update);  //清除中斷標(biāo)志位
}

2.2 PID計(jì)算相關(guān)

2.2.1 周期定時(shí)

定時(shí)器配置,通過(guò)設(shè)置自動(dòng)重裝載值定時(shí)器分頻實(shí)現(xiàn)指定周期的定時(shí)。

void TIMx_calcPID_init(u16 arr,u16 psc)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7,ENABLE);  ///使能TIM7時(shí)鐘
	
    TIM_TimeBaseInitStructure.TIM_Period = arr;   //自動(dòng)重裝載值
	TIM_TimeBaseInitStructure.TIM_Prescaler=psc;  //定時(shí)器分頻
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計(jì)數(shù)模式
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
	TIM_TimeBaseInit(TIM7,&TIM_TimeBaseInitStructure);//初始化TIM7
	
	TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE); //允許定時(shí)器6更新中斷
	TIM_Cmd(TIM7,DISABLE); //初始化時(shí)先不開(kāi)啟定時(shí)器7
	
	NVIC_InitStructure.NVIC_IRQChannel=TIM7_IRQn; //定時(shí)器6中斷
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //搶占優(yōu)先級(jí)1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子優(yōu)先級(jí)3
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}

TIMx_calcPID_init(100-1,8400-1);/*定時(shí)10ms,這句在主函數(shù)中調(diào)用*/

定時(shí)器中斷中,每10ms進(jìn)行1次PID計(jì)算

void TIM7_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM7,TIM_IT_Update)==SET) //溢出中斷
	{
		AutoReloadCallback();
	}
	TIM_ClearITPendingBit(TIM7,TIM_IT_Update);  //清除中斷標(biāo)志位
}

想要了解更多關(guān)于基礎(chǔ)定時(shí)器的配置與使用,可參照之前的文章:( http://www.ttokpm.com/d/1640145.html )

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

2.2.2 PID電機(jī)控制邏輯

周期定時(shí)器的回調(diào)函數(shù)中進(jìn)行PID的計(jì)算,程序中被注釋掉的兩句是速度控制的代碼,用于與位置控制進(jìn)行對(duì)比,通過(guò)對(duì)比可以明顯的看出,位置控制與速度控制的區(qū)別在于傳入PID的控制量。

void AutoReloadCallback()
{
	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í)刻編碼器的變化量*/
	int res_pwm = 0; /*PID計(jì)算得到的PWM值*/

    /*【1】讀取編碼器的值*/
    encoderNow = read_encoder() + EncoderOverflowCnt*ENCODER_TIM_PERIOD;/*獲取當(dāng)前的累計(jì)值*/
    encoderDelta = encoderNow - encoderLast; /*得到變化值*/
    encoderLast = encoderNow;/*更新上次的累計(jì)值*/

    /*【2】PID運(yùn)算,得到PWM控制值*/
    //res_pwm = pwm_val_protect((int)PID_realize(encoderDelta));/*傳入編碼器的[變化值],實(shí)現(xiàn)電機(jī)【速度】控制*/
    res_pwm = pwm_val_protect((int)PID_realize(encoderNow));/*傳入編碼器的[總計(jì)數(shù)值],實(shí)現(xiàn)電機(jī)【位置】控制*/

    /*【3】PWM控制電機(jī)*/
    set_motor_rotate(res_pwm);

    /*【4】數(shù)據(jù)上傳到上位機(jī)顯示*/
    //set_computer_value(SEND_FACT_CMD, CURVES_CH1, &encoderDelta, 1); /*給通道1發(fā)送實(shí)際的電機(jī)【速度】值*/
    set_computer_value(SEND_FACT_CMD, CURVES_CH1, &encoderNow, 1); /*給通道1發(fā)送實(shí)際的電機(jī)【位置】值*/

}

3 實(shí)驗(yàn)演示

實(shí)驗(yàn)中,指定目標(biāo)值1496,可以實(shí)現(xiàn)電機(jī)正轉(zhuǎn)1圈,再指定目標(biāo)值-1496,因?yàn)槭窍鄬?duì)位置,電機(jī)會(huì)反轉(zhuǎn)2圈。當(dāng)指定14960轉(zhuǎn)10圈時(shí)進(jìn)行觀(guān)察,若PID的參數(shù)不合適,會(huì)出現(xiàn)靜態(tài)誤差、或是持續(xù)抖動(dòng)、或是誤差消除慢等情況。通過(guò)不斷的調(diào)整參數(shù),可以實(shí)際感受到PID各項(xiàng)的調(diào)節(jié)作用。

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

    關(guān)注

    141

    文章

    8772

    瀏覽量

    143775
  • 控制
    +關(guān)注

    關(guān)注

    4

    文章

    1005

    瀏覽量

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

    關(guān)注

    35

    文章

    1466

    瀏覽量

    84836
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    步進(jìn)電機(jī)的伺服控制方法有哪些

    和脈沖序列,使電機(jī)準(zhǔn)確移動(dòng)到目標(biāo)位置。這種控制模式適用于需要精確定位的應(yīng)用場(chǎng)景。 2. 速度模式 定義 :在速度模式下,步進(jìn)伺服電機(jī)根據(jù)輸入
    的頭像 發(fā)表于 09-04 09:48 ?178次閱讀

    PID控制的原理與作用

    在工業(yè)自動(dòng)化和過(guò)程控制中,PID(比例-積分-微分)控制是一種廣泛應(yīng)用的控制策略。PID控制憑借
    的頭像 發(fā)表于 06-12 11:45 ?1532次閱讀

    PID在工業(yè)控制領(lǐng)域的應(yīng)用

    在工業(yè)控制領(lǐng)域,PID(比例-積分-微分)控制算法以其簡(jiǎn)單實(shí)用、魯棒性好、應(yīng)用范圍廣等特點(diǎn),成為了工程師們實(shí)現(xiàn)穩(wěn)定、高效控制的首選方案。PID
    的頭像 發(fā)表于 06-11 14:47 ?663次閱讀

    位置PID與增量式PID的區(qū)別

    PID(比例-積分-微分)控制器作為工業(yè)自動(dòng)化領(lǐng)域中的核心控制算法,廣泛應(yīng)用于各種需要精確控制的系統(tǒng)中。在PID
    的頭像 發(fā)表于 06-05 16:23 ?3796次閱讀

    直線(xiàn)馬達(dá)的控制策略

    直線(xiàn)馬達(dá)通常分為無(wú)鐵芯U型槽、有鐵芯平板以及軸棒直線(xiàn)馬達(dá)三大類(lèi),而無(wú)論哪類(lèi)直線(xiàn)馬達(dá),控制策略大多包括位置控制、速度控制和力控制三種模式。 其
    的頭像 發(fā)表于 02-25 10:40 ?300次閱讀
    直線(xiàn)馬達(dá)的<b class='flag-5'>控制</b>策略

    什么是pid控制,其控制作用是什么

    PID控制(Proportional-Integral-Derivative control)是一種常見(jiàn)的自動(dòng)控制算法,它被廣泛應(yīng)用于工業(yè)自動(dòng)化、機(jī)器人控制、飛行器導(dǎo)航等領(lǐng)域。
    的頭像 發(fā)表于 02-01 14:51 ?1951次閱讀

    什么是pid控制原理 pid各個(gè)參數(shù)對(duì)系統(tǒng)的影響

    PID(Proportional-Integral-Derivative)控制是一種常見(jiàn)的控制算法,廣泛應(yīng)用于工業(yè)過(guò)程控制、機(jī)器人控制、自動(dòng)
    的頭像 發(fā)表于 01-22 15:35 ?3974次閱讀

    過(guò)程控制中的PID控制技術(shù)

    在工程實(shí)際中,應(yīng)用最為廣泛的調(diào)節(jié)器控制規(guī)律為比例、積分、微分控制,簡(jiǎn)稱(chēng)PID控制,又稱(chēng)PID調(diào)節(jié)。它以其結(jié)構(gòu)簡(jiǎn)單、穩(wěn)定性好、工作可靠、調(diào)整方
    的頭像 發(fā)表于 01-22 11:45 ?688次閱讀
    過(guò)程<b class='flag-5'>控制</b>中的<b class='flag-5'>PID</b><b class='flag-5'>控制</b>技術(shù)

    伺服電機(jī)最簡(jiǎn)單控制方法

    伺服電機(jī)是一種特殊的電機(jī),可以根據(jù)控制信號(hào)準(zhǔn)確地控制角度、速度和位置。伺服電機(jī)的最簡(jiǎn)單
    的頭像 發(fā)表于 01-14 14:40 ?1561次閱讀

    詳解PID回路控制方案

    在實(shí)際工程中,應(yīng)用最為廣泛的調(diào)節(jié)器控制規(guī)律為比例、積分、微分控制,簡(jiǎn)稱(chēng)PID控制,又稱(chēng)PID調(diào)節(jié)。
    的頭像 發(fā)表于 12-31 14:39 ?1308次閱讀
    詳解<b class='flag-5'>PID</b>回路<b class='flag-5'>控制</b>方案

    基于STM32F103的直流電機(jī)pid調(diào)節(jié)閉環(huán)控制

    基于STM32F103的直流電機(jī)pid調(diào)節(jié)的閉環(huán)控制,主要模塊:NOKIA5110顯示屏紅外測(cè)速模塊
    發(fā)表于 11-27 16:50 ?6次下載

    單片機(jī)如何實(shí)現(xiàn)pid控制 基于pid控制的STM32代碼實(shí)現(xiàn)

    PID控制算法是目前應(yīng)用較為廣泛的一種控制算法,PID控制具有參數(shù)可調(diào)、應(yīng)用范圍廣、控制精度高等
    的頭像 發(fā)表于 11-10 16:56 ?4061次閱讀

    搭建機(jī)器人關(guān)節(jié)力控制系統(tǒng)步驟

    搭建機(jī)器人關(guān)節(jié)力控制系統(tǒng)需要以下步驟: 1. 選擇合適的電機(jī)和傳感器。電機(jī)的選取要符合機(jī)器人的要求,例如扭矩和速度范圍。傳感器的選擇則取決于需要監(jiān)測(cè)的參數(shù),如位置、速度和力量。
    的頭像 發(fā)表于 11-08 17:45 ?753次閱讀

    PLC控制系統(tǒng)控制伺服電機(jī)的原理

    伺服電機(jī)重要的應(yīng)用是定位控制。位置控制有兩個(gè)需要控制的物理量,即速度和位置。準(zhǔn)確地說(shuō),是
    發(fā)表于 11-06 10:29 ?789次閱讀

    LabVIEW中PID控制的的高級(jí)功能

    LabVIEW中PID控制的的高級(jí)功能 比例-積分-微分(PID控制占當(dāng)今控制和自動(dòng)化應(yīng)用的90%以上,主要是因?yàn)樗且环N有效且簡(jiǎn)單的解決
    的頭像 發(fā)表于 10-24 14:30 ?1689次閱讀
    LabVIEW中<b class='flag-5'>PID</b><b class='flag-5'>控制</b>的的高級(jí)功能