日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

编码器测速原理与实现

發(fā)布時(shí)間:2024/3/24 编程问答 82 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编码器测速原理与实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄:

  • 一、測(cè)速原理
  • 二、CubeMX配置編碼器模式
  • 三、利用外部中斷采集脈沖

一、測(cè)速原理

通常情況下編碼器旋轉(zhuǎn)一周會(huì)輸出固定的脈沖數(shù),即編碼器的分辨率,通過(guò)測(cè)量固定時(shí)間T內(nèi)編碼器輸出的脈沖數(shù)即可求得電機(jī)的轉(zhuǎn)速。
假設(shè)編碼器的分辨率為P,T時(shí)間內(nèi)測(cè)得脈沖數(shù)m個(gè),則單倍頻(編碼器轉(zhuǎn)動(dòng)一圈輸出的脈沖數(shù)與分辨率相同)情況下電機(jī)轉(zhuǎn)速為:

(其中m/p為編碼器轉(zhuǎn)過(guò)的圈數(shù),再除以時(shí)間即為轉(zhuǎn)速)
編碼器AB相輸出兩列相位差為90°的方波,當(dāng)A相超前于B相90°時(shí)為正轉(zhuǎn),相反,B相超前于A相90°時(shí)為反轉(zhuǎn)

為了提高采樣精度,利用軟件實(shí)現(xiàn)四倍頻,即將編碼器的分辨率提高4倍。原理圖如上,一個(gè)小周期內(nèi)AB兩相分別各有一個(gè)上升沿和下降沿,只需要在AB兩相的每個(gè)上升沿、下降沿進(jìn)行采集,這樣就實(shí)現(xiàn)了四倍頻技術(shù),即如果編碼器分辨率為p,則現(xiàn)在編碼器轉(zhuǎn)動(dòng)一圈就可以采集到4p個(gè)脈沖

二、CubeMX配置編碼器模式

stm32的部分定時(shí)器有編碼器模式,可以直接利用該功能采集編碼器脈沖數(shù)

先配置串口,方便后期打印采集的數(shù)據(jù)


我這里采用定時(shí)器4做測(cè)速,選擇編碼器模式,Encoder Mode選擇Encoder Mode T1 and T2,這個(gè)模式下將在AB相的上升沿和下降沿進(jìn)行脈沖技術(shù),即四倍頻


配置一定時(shí)器用于定時(shí)讀取和清空脈沖數(shù),此處設(shè)置每500ms讀取一次

打開(kāi)定時(shí)器全局中斷


配置時(shí)鐘



打開(kāi)創(chuàng)建好的工程,在主函數(shù)中啟動(dòng)編碼器脈沖采集和定時(shí)器中斷


重定向

定時(shí)器中斷服務(wù)函數(shù)中讀取采集到的脈沖數(shù),TIM2的計(jì)數(shù)值為0-65535,采用short int類型對(duì)其強(qiáng)制類型轉(zhuǎn)換,若TIM2計(jì)數(shù)器值為0 ~ 32767,則強(qiáng)制轉(zhuǎn)化后的值仍為0 ~ 32767,電機(jī)正轉(zhuǎn);
若TIM2計(jì)數(shù)器值為32768 ~ 65535,則強(qiáng)制轉(zhuǎn)化后的值仍為-32768 ~ -1,電機(jī)反轉(zhuǎn);使用一階濾波減小誤差,每次采集的脈沖數(shù)保存至new_capturenumber,編碼器轉(zhuǎn)動(dòng)一圈輸出4096個(gè)脈沖,則new_capturenumber/4096為編碼器轉(zhuǎn)動(dòng)的圈數(shù),最后除以采集時(shí)間500ms就得到了電機(jī)轉(zhuǎn)速(r/s)

三、利用外部中斷采集脈沖

有些單片機(jī)沒(méi)有編碼器功能,如esp32,我們可以利用外部中斷對(duì)編碼器輸出脈沖進(jìn)行計(jì)數(shù)

設(shè)置PE11 PE14的外部中斷,上升沿、下降沿均觸發(fā)


打開(kāi)全局中斷


配置一定時(shí)器每500ms讀取一次脈沖值


打開(kāi)定時(shí)器全局中斷


編碼器正反轉(zhuǎn)時(shí),脈沖波形如上圖所示,我們可以先定義pulse_num來(lái)對(duì)脈沖進(jìn)行計(jì)數(shù)
當(dāng)A相下降沿時(shí),若B相為低電平則為反轉(zhuǎn),pulse_num減一,若B相為高電平則為正轉(zhuǎn),pulse_num加一
當(dāng)A相上升沿時(shí),若B相為低電平則為正轉(zhuǎn),pulse_num加一,若B相為高電平則為反轉(zhuǎn),pulse_num減一
當(dāng)B相下降沿時(shí),若A相為低電平則為正轉(zhuǎn),pulse_num加一,若A相為高電平則為反轉(zhuǎn),pulse_num減一
當(dāng)B相上升沿時(shí),若A相為低電平則為反轉(zhuǎn),pulse_num減一,若A相為高電平則為正轉(zhuǎn),pulse_num加一
即:

/* USER CODE BEGIN 2 */ int pulse_num=0; /* USER CODE BEGIN 2 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ //PE11 - A相發(fā)生中斷if(GPIO_Pin==GPIO_PIN_11){//A相下降沿if(HAL_GPIO_ReadPin(GPIOE,A_phase_Pin)==0){if(HAL_GPIO_ReadPin(GPIOE,B_phase_Pin)==0)pulse_num--;elsepulse_num++;}//A相上升沿else{if(HAL_GPIO_ReadPin(GPIOE,B_phase_Pin)==0)pulse_num++;elsepulse_num--;} }//PE14 - B相發(fā)生中斷 else if(GPIO_Pin==GPIO_PIN_14){//B相下降沿if(HAL_GPIO_ReadPin(GPIOE,B_phase_Pin)==0){if(HAL_GPIO_ReadPin(GPIOE,A_phase_Pin)==0)pulse_num++;elsepulse_num--;}//B相上升沿else{if(HAL_GPIO_ReadPin(GPIOE,A_phase_Pin)==0)pulse_num--;elsepulse_num++;}} }


最后在定時(shí)器中斷函數(shù)中對(duì)采集到的脈沖個(gè)數(shù)處理,注意需要手動(dòng)清空pulse_num

總結(jié)

以上是生活随笔為你收集整理的编码器测速原理与实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。