91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

碼農(nóng)愛學(xué)習(xí) ? 來源:碼農(nóng)愛學(xué)習(xí) ? 作者:碼農(nóng)愛學(xué)習(xí) ? 2022-02-26 12:01 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

本篇來介紹電機的位置環(huán)控制,實現(xiàn)電機快速準(zhǔn)確地轉(zhuǎn)動到指定位置

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

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

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

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

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

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

2 核心程序

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

2.1 編碼器相關(guān)

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

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

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

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

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

電機的減速齒輪的減速比為1:34

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

#define ENCODER_RESOLUTION 11  

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

#define ENCODER_MULTIPLE 4    

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

#define MOTOR_REDUCTION_RATIO 34 

/*電機的減速比*/

?

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

/* 11*4*34= 1496*/

#define TOTAL_RESOLUTION ( ENCODER_RESOLUTION*ENCODER_MULTIPLE*MOTOR_REDUCTION_RATIO ) 

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

2.1.2 定時器編碼器模式配置

用于編碼器捕獲的定時器的一些宏定義。

#define ENCODER_TIM_PSC  0     

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

#define ENCODER_TIM_PERIOD  65535  

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

#define CNT_INIT 0         

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

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

/* TIM4通道1通道2 正交編碼器 */
void TIMx_encoder_init(void)                      
{ 
	GPIO_InitTypeDef GPIO_InitStruct;            /*GPIO*/
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStruct; /*時基*/
	TIM_ICInitTypeDef TIM_ICInitStruct;          /*輸入通道*/
	NVIC_InitTypeDef NVIC_InitStructure;         /*中斷*/
    
    /*GPIO初始化*/    
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); /*使能GPIO時鐘 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); 

	/*時基初始化*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);   /*使能定時器時鐘 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ù)向上計數(shù)模式*/  
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStruct); 

	/*編碼器模式配置:同時捕獲通道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; //定時器4中斷
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //搶占優(yōu)先級1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x01; //子優(yōu)先級1
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
} 

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

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

2.1.3 讀取編碼器的值

讀取值,這里直接讀取原始值即可,讀取后也不需要再設(shè)置計數(shù)初值,因為使用的溢出中斷。

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

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

溢出中斷中,主要判斷是向上溢出還是向下溢出,因為電機可以正反轉(zhuǎn),所以需要記錄溢出的方向。

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

//定時器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++;/*編碼器計數(shù)值[向上]溢出*/
		}
		else
		{
			EncoderOverflowCnt--;/*編碼器計數(shù)值[向下]溢出*/
		}
	}
	TIM_ClearITPendingBit(TIM4,TIM_IT_Update);  //清除中斷標(biāo)志位
}

2.2 PID計算相關(guān)

2.2.1 周期定時

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

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

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

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

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

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

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

2.2.2 PID電機控制邏輯

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

void AutoReloadCallback()
{
	static __IO int encoderNow = 0;    /*當(dāng)前時刻總計數(shù)值*/
	static __IO int encoderLast = 0;   /*上一時刻總計數(shù)值*/
	int encoderDelta = 0; /*當(dāng)前時刻與上一時刻編碼器的變化量*/
	int res_pwm = 0; /*PID計算得到的PWM值*/

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

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

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

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

}

3 實驗演示

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

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

    關(guān)注

    143

    文章

    9601

    瀏覽量

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

    關(guān)注

    5

    文章

    1035

    瀏覽量

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

    關(guān)注

    38

    文章

    1500

    瀏覽量

    91247
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    變頻器內(nèi)置PID控制參數(shù)的含義

    變頻器內(nèi)置PID控制是工業(yè)自動化領(lǐng)域中的關(guān)鍵技術(shù)之一,廣泛應(yīng)用于電機調(diào)速、溫度控制、壓力調(diào)節(jié)等場景。PID
    的頭像 發(fā)表于 03-04 11:02 ?121次閱讀
    變頻器內(nèi)置<b class='flag-5'>PID</b><b class='flag-5'>控制</b>參數(shù)的含義

    PID控制的算法

    電機轉(zhuǎn)速實際值(轉(zhuǎn)/min); 3.偏差量為預(yù)定值和實際值之差(轉(zhuǎn)/min); 那么以下幾個問題需要弄清楚: 1.通過PID環(huán)節(jié)之后的U(t)是什么值呢? 2.控制執(zhí)行器(直流
    發(fā)表于 01-23 08:18

    怎樣理解變頻器內(nèi)置PID控制參數(shù)的含義

    變頻器內(nèi)置PID控制參數(shù)是工業(yè)自動化領(lǐng)域中實現(xiàn)精確控制的核心要素,其合理配置直接影響電機調(diào)速、壓力調(diào)節(jié)、溫度控制等過程的穩(wěn)定性和響應(yīng)速度。要
    的頭像 發(fā)表于 12-06 07:39 ?2026次閱讀

    CW32電機控制基礎(chǔ)——PID控制原理

    的CW32L011無刷電機驅(qū)動器有感控制代碼就用到了相關(guān)方法。也是電機控制必備知識。 1模擬PID控制
    的頭像 發(fā)表于 09-30 11:44 ?2711次閱讀
    CW32<b class='flag-5'>電機</b><b class='flag-5'>控制</b>基礎(chǔ)——<b class='flag-5'>PID</b><b class='flag-5'>控制</b>原理

    PID控制算法學(xué)習(xí)筆記資料

    用于新手學(xué)習(xí)PID控制算法。
    發(fā)表于 08-12 16:22 ?7次下載

    使用位置傳感器進(jìn)行無刷電機控制

    刷直流電機或場定向控制 (FOC) 無刷交流電機,確實可以實現(xiàn)無需任何旋轉(zhuǎn)角度傳感器即可工作。但實際情況是,工業(yè)和人形機器人、自主移動機器人和直線電機運輸系統(tǒng)等終端設(shè)備,旋轉(zhuǎn)角度傳感器
    的頭像 發(fā)表于 08-07 14:25 ?5923次閱讀
    使用<b class='flag-5'>位置</b>傳感器進(jìn)行無刷<b class='flag-5'>電機</b><b class='flag-5'>控制</b>

    永磁同步直線電機的粒子群PID空間矢量控制

    由于永磁同步直線電機(PMLSM)在運行過程中存在著參數(shù)變動和負(fù)載干擾等問題,因此傳統(tǒng)PID控制器無法滿足高精度伺服控制系統(tǒng)的要求。針對以上問題,提出一種基于粒子群參數(shù)全局尋優(yōu)的在線自
    發(fā)表于 08-05 14:20

    無刷直流電機自適應(yīng)模糊PID控制系統(tǒng)

    摘要:針對無刷直流電機傳統(tǒng)PID控制存在精度低、抗于抗能力差及模糊控制穩(wěn)態(tài)精度不高等問題,研究了一種自適應(yīng)模糊PID
    發(fā)表于 07-09 14:18

    無刷直流電機模糊自適應(yīng)PID控制的研究

    摘要:為了提高無刷直流電機控制系統(tǒng)的動、靜態(tài)性能,將模糊控制結(jié)合PID控制算法應(yīng)用到無刷直流電機
    發(fā)表于 07-07 18:29

    PID串級控制在同步發(fā)電機勵磁控制中的應(yīng)用

    摘 要:為提高發(fā)電機勛磁控制系統(tǒng)的穩(wěn)定性,分析了同步發(fā)電機的自并勵勵磁系統(tǒng)的結(jié)構(gòu)和數(shù)學(xué)模型,介紹了神經(jīng)網(wǎng)絡(luò)預(yù)測控制的結(jié)構(gòu)和算法,分別基于PID
    發(fā)表于 06-16 21:56

    掃描電機PID恒速控制仿真及實驗

    數(shù)學(xué)模型,并通過 Matlab Simulink 搭建了仿真模型。提出了使用增量式PID控制算法實現(xiàn)電機的恒速控制,并進(jìn)行了仿真,最后,利用STC89C52將
    發(fā)表于 06-16 21:53

    改進(jìn)粒子群算法的永磁同步電機PID控制

    采用粒子優(yōu)化算法進(jìn)行PID模糊控制訓(xùn)練能提高永磁同步電機控制精度,提出一種基于改進(jìn)粒子群算法的永磁同步電機
    發(fā)表于 05-28 15:44

    改進(jìn)的BP網(wǎng)絡(luò)PID控制器在無刷直流電機中的應(yīng)用

    通過分析學(xué)習(xí)速率對BP算法的影響,提出一種分層調(diào)整學(xué)習(xí)速率的改進(jìn)BP 網(wǎng)絡(luò)算法,并把該方法設(shè)計成 PID控制器應(yīng)用在無刷直流電機控制系統(tǒng)中,仿真結(jié)果驗證了基于改進(jìn)的 BP 網(wǎng)絡(luò)的
    發(fā)表于 05-28 15:42

    電機控制】PMSM無感FOC控制

    0.前言前段時間做了一個永磁同步電機無感控制的項目,想總結(jié)一下,做個比較基礎(chǔ)易懂的文章方便大家入門,主要介紹以下幾個方面:1.FOC控制算法、坐標(biāo)變換2.PID
    的頭像 發(fā)表于 04-15 19:33 ?3667次閱讀
    【<b class='flag-5'>電機</b><b class='flag-5'>控制</b>】PMSM無感FOC<b class='flag-5'>控制</b>

    永磁同步直線電機的粒子群PID空間矢量控制

    由于永磁同步直線電機(PMLSM)在運行過程中存在著參數(shù)變動和負(fù)載干擾等問題,因此傳統(tǒng) PID 控制器無法滿足高精度伺服控制系統(tǒng)的要求。針對以上問題,提出一種基于粒子群參數(shù)全局尋優(yōu)的在
    發(fā)表于 03-27 12:07