女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

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

碼農愛學習 ? 來源:碼農愛學習 ? 作者:碼農愛學習 ? 2022-02-26 12:01 ? 次閱讀

上篇文章講解了電機的速度環控制,可以控制電機快速準確地到達指定速度。

本篇來介紹電機的位置環控制,實現電機快速準確地轉動到指定位置。

1 位置控制與速度控制的區別

回顧上篇,電機速度PID控制的結構圖如下,目標值是設定的速度,通過編碼器獲取電機的轉速作為反饋,實現電機轉速的控制。

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

再來看電機位置PID控制,其結構圖如下,目標值是設定的位置,通過編碼器獲取電機累計轉動的脈沖數作為反饋,實現電機位置的控制。

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

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

2 核心程序

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

2.1 編碼器相關

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

2.1.1 電機與編碼器參數

編碼器部分,需要根據自己電機的實際參數進行設定,比如我用到的電機:

編碼器一圈的物理脈沖數為11

定時器編碼器模式通過設置倍頻來實現4倍頻

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

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

#define ENCODER_RESOLUTION 11  

/*編碼器一圈的物理脈沖數*/

#define ENCODER_MULTIPLE 4    

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

#define MOTOR_REDUCTION_RATIO 34 

/*電機的減速比*/

?

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

/* 11*4*34= 1496*/

#define TOTAL_RESOLUTION ( ENCODER_RESOLUTION*ENCODER_MULTIPLE*MOTOR_REDUCTION_RATIO ) 

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

2.1.2 定時器編碼器模式配置

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

#define ENCODER_TIM_PSC  0     

/*計數器分頻*/

#define ENCODER_TIM_PERIOD  65535  

/*計數器最大值*/

#define CNT_INIT 0         

/*計數器初值*/

配置主要關注重裝載值,倍頻,溢出中斷設置。

/* 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;        /*復用功能*/
	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;       /*預分頻 */        
	TIM_TimeBaseStruct.TIM_Period = ENCODER_TIM_PERIOD;       /*周期(重裝載值)*/
	TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;      
	TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;  /*連續向上計數模式*/  
	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;   /*輸入通道的濾波參數*/
	TIM_ICInit(TIM4, &TIM_ICInitStruct); /*輸入通道初始化*/
	TIM_SetCounter(TIM4, CNT_INIT);      /*CNT設初值*/
	TIM_ClearFlag(TIM4,TIM_IT_Update);   /*中斷標志清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; //搶占優先級1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x01; //子優先級1
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
} 

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

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

2.1.3 讀取編碼器的值

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

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

2.1.4 編碼器計數值溢出處理

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

/* 定時器溢出次數 */
__IO int16_t EncoderOverflowCnt = 0;

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

2.2 PID計算相關

2.2.1 周期定時

定時器配置,通過設置自動重裝載值定時器分頻實現指定周期的定時。

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; //向上計數模式
	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; //搶占優先級1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子優先級3
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}

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

定時器中斷中,每10ms進行1次PID計算

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

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

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

2.2.2 PID電機控制邏輯

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

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

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

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

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

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

}

3 實驗演示

實驗中,指定目標值1496,可以實現電機正轉1圈,再指定目標值-1496,因為是相對位置,電機會反轉2圈。當指定14960轉10圈時進行觀察,若PID的參數不合適,會出現靜態誤差、或是持續抖動、或是誤差消除慢等情況。通過不斷的調整參數,可以實際感受到PID各項的調節作用。

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

    關注

    143

    文章

    9248

    瀏覽量

    148327
  • 控制
    +關注

    關注

    5

    文章

    1021

    瀏覽量

    123538
  • PID
    PID
    +關注

    關注

    37

    文章

    1480

    瀏覽量

    87335
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    電機控制】PMSM無感FOC控制

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

    PID控制詳解(可下載)

    一、PID控制簡介 PID( Proportional Integral Derivative)控制是最早發展起來的控制策略之一,由于
    發表于 02-27 15:42 ?1次下載

    資料免費下!PID電機控制系統(控制原理+控制算法+程序范例)

    資料免費下啦!本資料包括PID調節控制電機速度控制、ourdevBasic PID的經典文章、PID
    發表于 02-27 14:17

    伺服電機PID控制抖動問題?

    PID控制伺服電機總是在兩個電機絕對角度位置抖動,看上去像是電機轉動到這個
    發表于 11-29 18:28

    如何使用Python實現PID控制

    PID控制(比例-積分-微分控制)是一種常見的反饋控制算法,廣泛應用于工業控制系統中。在Python中實現
    的頭像 發表于 11-14 09:09 ?1361次閱讀

    PID控制在機器人中的應用案例

    PID控制作為一種經典的控制策略,因其簡單、魯棒和易于實現的特點,在機器人領域得到了廣泛的應用。以下是一些PID控制在機器人中的具體應用案例
    的頭像 發表于 11-13 14:42 ?1680次閱讀

    基于PID控制的溫度調節系統

    ,還可能導致設備損壞。PID控制器因其能夠提供快速響應和穩定性而被廣泛應用于溫度控制PID控制器通過調整
    的頭像 發表于 11-13 14:39 ?3777次閱讀

    在焊接中應用PID控制技術

    ,從而提高焊接質量。 2. PID控制技術原理 PID控制技術由比例(P)、積分(I)和微分(D)三個基本環節組成。比例環節根據偏差的大小進
    的頭像 發表于 11-06 10:40 ?952次閱讀

    PID控制器的類型和選擇指南

    PID控制器是一種廣泛應用于工業控制系統中的控制器,它根據系統的偏差來計算控制量,以實現對系統的精確控制
    的頭像 發表于 11-06 10:37 ?1629次閱讀

    什么是PID控制與傳統控制的區別

    在自動化控制系統中,PID控制(比例-積分-微分控制)是一種廣泛應用的控制算法。它以其簡單、魯棒和易于實現的特點,在工業和工程領域中占據了重
    的頭像 發表于 11-06 10:34 ?1433次閱讀

    如何使用PID進行溫度控制

    PID(比例-積分-微分)控制器在溫度控制系統中扮演著至關重要的角色。以下是使用PID進行溫度控制的基本步驟和原理: 一、
    的頭像 發表于 11-06 10:31 ?6891次閱讀

    步進電機的伺服控制方法有哪些

    和脈沖序列,使電機準確移動到目標位置。這種控制模式適用于需要精確定位的應用場景。 2. 速度模式 定義 :在速度模式下,步進伺服電機根據輸入
    的頭像 發表于 09-04 09:48 ?1056次閱讀

    PID控制的原理與作用

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

    PID在工業控制領域的應用

    在工業控制領域,PID(比例-積分-微分)控制算法以其簡單實用、魯棒性好、應用范圍廣等特點,成為了工程師們實現穩定、高效控制的首選方案。PID
    的頭像 發表于 06-11 14:47 ?2092次閱讀

    位置PID與增量式PID的區別

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