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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

stm32f103单片机—编码器测速

發布時間:2024/3/24 编程问答 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stm32f103单片机—编码器测速 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、涉及資源

stm32f103ZET6開發板(非指定)
MG513P3012V型號電機(帶霍爾編碼器)(非指定)

二、涉及概念

1、單片機資源要求

此種測速方法要求單片機的定時器具有編碼器模式,對于stm32f1系列,具備編碼器模式的定時器有TIM1/2/3/4/5/8,定時器使用通道1、2來實現編碼器功能,接線時注意把A/B相接到定時器通道1/2的引腳。

2、減速比

電機結構

減速結構

減速比為1:30通俗地講就是當電機外伸軸轉1圈時實際軸轉30圈,外伸軸我們一般接上輪胎等實際作用物體,而實際軸是電機自身的轉子,霍爾編碼器的檢測對象是實際軸

3、測速原理

霍爾編碼器工作方式

霍爾編碼器是一種通過磁電轉換將輸出軸上的機械幾何位移量轉換成脈沖或數字量的傳感器。霍爾編碼器是由霍爾碼盤和霍爾元件組成。霍爾碼盤是在一 定直徑的圓板上等分地布置有不同的磁極。電機旋轉一圈霍爾元件發出特定數目的脈沖信號。,用時間間隔內接收的總的脈沖數目除以轉一圈發出的脈沖數目即可得到轉軸轉的圈數,再除以時間間隔就能得到轉速。 為判斷轉向,一般輸出兩組存在一定相位差的方波信號。

定時器判斷電機正反轉的依據

定時器通道1、通道2接收A相和B相的脈沖信號,轉一圈A相和B相發出的脈沖數目是一樣的,但是發送有先后之分。

定時器針對正反轉的兩種計數方式

定時器在編碼器模式下有兩種計數方式,正轉時是從重載值開始向下減數,反轉時是從零開始向上加數(正反是相對而言的)。例如,如果我設定定時器的重載值為0x7fff,那么當定時器接收到10個正轉的脈沖時,計數值變為0x7ff3,當定時器接收到的是反轉的脈沖時,定時器的計數值變為0x000A。

定時器編碼器模式1、2、3

TI1和TI2分別為定時器的通道1和通道2


編碼器模式3即為四倍頻模式,這個模式下對于A和B相發過來的一組脈沖會有四次計數(四個跳變沿),這樣就能將檢測精度提到四倍。

4、M法測速



三、編碼器與單片機的接線

注:這里以stm32f1系列的定時器4為例,若使用其他定時器進行測速需要更換對應的引腳資源,編碼器A/B相需接到定時器的通道1和通道2

1、霍爾編碼器實物圖

接線

編碼器A相和B相接PB6和PB7引腳(無對應要求)

四、單片機引腳和定時器的初始化

1、代碼示例

引腳選擇PB6和PB7
定時器選擇TIM4,使用編碼器模式3

/***************************************************** *@Func: 編碼器涉及資源的初始化 ****** *@para: ****** *@desc: 選擇TIM4作為此編碼器的解碼時鐘 ****** 設置重裝值 ****** 注意:實際使用時對轉速有限制,如果轉速太快可能發生定時器溢出的情況,就要考慮使用中斷 ****** 目前對脈沖一次定時僅能計32768次,超過即無效,可以分別正反轉。 ****** 定時器在編碼器模式下電機如果正轉計數器會從零開始正數,如果反轉計數器會從重載值開始倒數 ******************************************************/ void EncoderA_Init(void) {GPIO_InitTypeDef GPIO_InitStructure; // 引腳初始化的結構體 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // 定時器初始化的結構體TIM_ICInitTypeDef TIM_ICInitStructure; // 定時器編碼器模式初始化的結構體RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); // 使能TIM4時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB時鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; // PB6、PB7GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空輸入GPIO_Init(GPIOB, &GPIO_InitStructure); // 根據GPIO_InitStructure的參數初始化GPIOB0TIM_TimeBaseStructure.TIM_Period = 0xffff; // 設定計數器自動重裝值TIM_TimeBaseStructure.TIM_Prescaler = 0; // 預分頻器 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 選擇時鐘分頻:不分頻TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // TIM向上計數模式TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); // 根據TIM_TimeBaseInitStruct的參數初始化定時器TIM4TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用編碼器模式3:CH1、CH2同時計數,四分頻//初始化TIM4輸入捕獲參數TIM_ICStructInit(&TIM_ICInitStructure); // 把TIM_ICInitStruct 中的每一個參數按缺省值填入TIM_ICInitStructure.TIM_ICFilter = 0x03; // IC1F=0011 配置輸入濾波器(連續采樣八次)TIM_ICInit(TIM4, &TIM_ICInitStructure); // 根TIM_ICInitStructure參數初始化定時器TIM4編碼器模式TIM_Cmd(TIM4, ENABLE); // 使能定時器4 }

五、讀定時器的計數值

定時器的計數值即為編碼器發出的脈沖數目*4(定時器的編碼器模式3)

/***************************************************** *@Func: 讀取定時器計數值 ****** *@para: ****** *@desc: ******************************************************/ void Read_EncoderA(void) {if(TIM4->CNT > 0x7fff){EncoderA = TIM4->CNT - 0xffff; // 反轉}else{EncoderA = TIM4->CNT; // 正轉}TIM4->CNT = 0xffff; }

六、由定時器計數值得到轉速

1、計算公式

使用M法測速,計算公式為:
轉速n = 總脈沖數/四倍頻/單圈脈沖數/減速比/時間間隔

2、代碼示例

電機轉一圈本款霍爾編碼器發出13個脈沖,本款電機的減速比為1:30

/***************************************************** *@Func: 獲取電機A的速度 ****** *@para: ****** *@desc: 返回的是電機的轉速 n圈/s ****** 轉速n = 總脈沖數/四倍頻/單圈脈沖數/減速比/時間 ******************************************************/ void Get_MotorA_Speed(void) {Read_EncoderA(); // 獲取編碼器產生的脈沖數MotorASpeed = (float)EncoderA / 4 / PulseNum / ReRate / DecodeGapTime * 1000; }

總結

以上是生活随笔為你收集整理的stm32f103单片机—编码器测速的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。