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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

STM32——编码器测速原理及STM32编码器模式

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

1. 編碼器概述

編碼器是一種將角位移或者角速度轉換成一連串電數字脈沖的旋轉式傳感 器,我們可以通過編碼器測量到底位移或者速度信息。編碼器從輸出數據類型上 分,可以分為增量式編碼器和絕對式編碼器。

從編碼器檢測原理上來分,還可以分為光學式、磁式、感應式、電容式。常 見的是光電編碼器(光學式)和霍爾編碼器(磁式)。

2. 編碼器原理

光電編碼器是一種通過光電轉換將輸出軸上的機械幾何位移量轉換成脈沖或數字量的傳感器。光電編碼器是由光碼盤和光電檢測裝置組成。光碼盤是在一 定直徑的圓板上等分地開通若干個長方形孔。由于光電碼盤與電動機同軸,電動機旋轉時,檢測裝置檢測輸出若干脈沖信號,為判斷轉向,一般輸出兩組存在一 定相位差的方波信號。

霍爾編碼器是一種通過磁電轉換將輸出軸上的機械幾何位移量轉換成脈沖或數字量的傳感器。霍爾編碼器是由霍爾碼盤和霍爾元件組成。霍爾碼盤是在一 定直徑的圓板上等分地布置有不同的磁極。霍爾碼盤與電動機同軸,電動機旋轉時,霍爾元件檢測輸出若干脈沖信號,為判斷轉向,一般輸出兩組存在一定相位差的方波信號。

可以看到兩種原理的編碼器目的都是獲取 AB 相輸出的方波信號,其使用方法也是一樣,下面是一個簡單的示意圖。

3. 編碼器接線說明

具體到我們的編碼器電機,我們可以看看電機編碼器的實物。

4. 編碼器軟件四倍頻技術

下面我們說一下編碼器倍頻的原理。為了提高大家下面學習的興趣,我們先明確,這是一項實用的技術,可以真正地把編碼器的精度提升 4 倍。作用可類比 于單反相機的光學變焦,而并非犧牲清晰度來放大圖像的數碼變焦。OK,先看看下面編碼器輸出的波形圖。
這里,我們是通過軟件的方法實現四倍頻。首先可以看到上圖編碼器輸出的AB 相波形,正常情況下我們使用 M 法測速的時候,會通過測量單位時間內 A 相輸出的脈沖數來得到速度信息。常規的方法,我們只測量 A 相(或 B 相)的上升 沿或者下降沿,也就是上圖中對應的數字 1234 中的某一個,這樣就只能計數 3次。而四倍頻的方法是測量 A 相和 B 相編碼器的上升沿和下降沿。這樣在同樣的 時間內,可以計數 12 次(3 個 1234 的循環)。這就是軟件四倍頻的原理。

5. STM32編碼器模式

在STM32中,編碼器使用的是定時器接口,通過數據手冊可知,定時器1,2,3,4,5和8有編碼器的功能,而其他沒有。編碼器輸入信號TI1,TI2經過輸入濾波,邊沿檢測產生TI1FP1,TI2FP2接到編碼器模塊,通過配置編碼器的工作模式,即可以對編碼器進行正向/反向計數。

STM32編碼器有三種工作模式,其中模式三即為上文中提到的四倍頻模式。

在使用編碼器模式時需要注意以下幾點:

  • 編碼器有個轉速上限,超過這個上限是不能正常工作的,這個是硬件的限制,原則上線數越多轉速就越低,這點在選型時要注意。
  • 定時器初始化好以后,任何時候CNT寄存器的值就是編碼器的位置信息,正轉他會加反轉他會減這部分是不需要軟件干預的,初始化時給的TIM_Period 值應該是碼盤整圈的刻度值,在減溢出會自動修正為這個數.加超過此數值就回0.
  • 計數值偶爾也會有出錯誤的情況,一圈多計一個或少計一個數都是很正常的特別是轉速比較高的時候尤其明顯,有個絕對位置信號做修正是很有必要的.絕對位置信號不需要一定在零位置點,收到這個信號就將CNT修正為一個固定的數值即可.

6. STM32編碼器模式例程

此例程用于初始化定時器2和定時器3為編碼器模式,得到小車底盤上兩個直流電機的運轉速度。

#.c文件 #include "encoder.h"/************************************************************************** * 函數功能:把TIM2初始化為編碼器接口模式 * * 入口參數:無 * * 返 回 值:無 **************************************************************************/ void Encoder_Init_TIM2(void) {TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能定時器2的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);//使能PA PB端口時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //端口配置 PA15GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入GPIO_Init(GPIOA, &GPIO_InitStructure); //根據設定參數初始化GPIOAGPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //端口配置 PB3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入GPIO_Init(GPIOB, &GPIO_InitStructure); //根據設定參數初始化GPIOBTIM_TimeBaseStructInit(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 預分頻器 TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //設定計數器自動重裝值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//選擇時鐘分頻:不分頻TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//邊沿計數模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //初始化定時器2TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用編碼器模式3TIM_ICStructInit(&TIM_ICInitStructure); //把TIM_ICInitStruct 中的每一個參數按缺省值填入TIM_ICInitStructure.TIM_ICFilter = 10; //設置濾波器長度TIM_ICInit(TIM2, &TIM_ICInitStructure);//根據 TIM_ICInitStruct 的參數初始化外設 TIMxTIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除TIM的更新標志位TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//使能定時器中斷TIM_SetCounter(TIM2,0);TIM_Cmd(TIM2, ENABLE); //使能定時器2 }/************************************************************************** 函數功能:把TIM3初始化為編碼器接口模式 入口參數:無 返回 值:無 **************************************************************************/ void Encoder_Init_TIM3(void) {TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//使能定時器3的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PA端口時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //端口配置 PA6 PA7GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入GPIO_Init(GPIOA, &GPIO_InitStructure); //根據設定參數初始化GPIOATIM_TimeBaseStructInit(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 預分頻器 TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //設定計數器自動重裝值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//選擇時鐘分頻:不分頻TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//邊沿計數模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化定時器3TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用編碼器模式3(TIM_ICPolarity_Rising或者TIM_ICPolarity_Falling效果相同,都是4倍頻)TIM_ICStructInit(&TIM_ICInitStructure); //把TIM_ICInitStruct 中的每一個參數按缺省值填入TIM_ICInitStructure.TIM_ICFilter = 10; //設置濾波器長度TIM_ICInit(TIM3, &TIM_ICInitStructure);//根據 TIM_ICInitStruct 的參數初始化外設 TIMxTIM_ClearFlag(TIM3, TIM_FLAG_Update);//清除TIM的更新標志位TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);//使能定時器中斷TIM_SetCounter(TIM3,0);TIM_Cmd(TIM3, ENABLE); //使能定時器 }/************************************************************************** 函數功能:單位時間讀取編碼器A計數 入口參數:無 返回 值:計數值 **************************************************************************/ float Read_EncoderA(void) {int Encoder_TIM = 0; float Speed = 0.0; Encoder_TIM= (short)TIM2 -> CNT; TIM2 -> CNT=0;return -Encoder_TIM; } /************************************************************************** 函數功能:單位時間讀取編碼器B計數 入口參數:無 返回 值:計數值 **************************************************************************/ float Read_EncoderB(void) {int Encoder_TIM = 0; float Speed = 0.0; Encoder_TIM= (short)TIM3 -> CNT; TIM3 -> CNT=0;return Encoder_TIM; }/************************************************************************** * 函數功能:TIM2中斷服務函數 * * 入口參數:無 * * 返 回 值:無 **************************************************************************/ void TIM2_IRQHandler(void) { if(TIM2->SR&0X0001)//溢出中斷{ } TIM2->SR&=~(1<<0);//清除中斷標志位 }/************************************************************************** * 函數功能:TIM3中斷服務函數 * * 入口參數:無 * * 返 回 值:無 **************************************************************************/ void TIM3_IRQHandler(void) { if(TIM3->SR&0X0001)//溢出中斷{ } TIM3->SR&=~(1<<0);//清除中斷標志位 } #.h文件 #define __ENCODER_H #include <sys.h> #include "init.h" //include了所有需要的頭文件 #define ENCODER_TIM_PERIOD (u16)(65535) //不可大于65535 因為F103的定時器是16位的。void Encoder_Init_TIM2(void); void Encoder_Init_TIM3(void);float Read_EncoderA(void); float Read_EncoderB(void);void TIM2_IRQHandler(void); void TIM3_IRQHandler(void);#endif

總結

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

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

主站蜘蛛池模板: av在线播放一区二区三区 | 老女人丨91丨九色 | 91精品国产高清一区二区三密臀 | 国产精品久久久久久久久免费 | 欧美日韩视频在线播放 | 91精产品一区观看 | 青青在线视频 | 精品成人无码一区二区三区 | 丝袜美女av | 国内精品久久久久久久久久久 | 超碰av在线免费观看 | 91综合久久 | 日韩在线网 | 先锋影音av资源在线 | 超碰国产91 | 欧美成一区二区三区 | 午夜激情在线播放 | 国产精品果冻传媒潘 | 一区二区三区视频网 | 91动态图 | 色网在线免费观看 | 国产又爽又黄又嫩又猛又粗 | jlzzjlzz亚洲女人18| 午夜视频免费在线 | 日日精| 男生捅女生肌肌 | a级淫片 | 日本a级无毛 | 色综合天天综合综合国产 | 香蕉网站视频 | 日本老熟妇毛茸茸 | 精品久久久久久中文字幕 | 国产13页 | 国产一区二区观看 | 日韩欧美资源 | 漂亮人妻被中出中文字幕 | 136fldh导航福利微拍 | 国产专区视频 | 成人毛片观看 | aaa大片十八岁禁止 中文字幕亚洲在线观看 | 欧美精品一区二区三区蜜臀 | 91免费版黄色 | av视觉盛宴 | 在线观看视频中文字幕 | 久久久久无码国产精品一区李宗瑞 | 激情文学88 | 国产aaa毛片| 精品久久久免费 | 椎名由奈在线观看 | 少妇人妻好深好紧精品无码 | 91在线公开视频 | 黑人巨大精品欧美一区二区 | 亚洲婷婷免费 | 在线免费观看国产视频 | 成人一级片 | 国内露脸中年夫妇交换 | 九热在线视频 | 亚洲黄色在线观看视频 | 五月依人网 | 香蕉视频成人在线 | 欧美成人午夜剧场 | 欧美一二三级 | 日本性爱视频在线观看 | 四虎影院一区二区 | jizz性欧美2| 日韩精品视频免费看 | 欲色视频 | 在线中文字幕视频 | 婷婷综合网站 | 国产成人精品久久二区二区 | 国产精品伦一区二区三级古装电影 | 特级西西人体wwwww | 国产aaaaa毛片 | 91视频久久久久 | 黄色欧美大片 | 天堂资源在线 | 精品视频www| 亚洲av久久久噜噜噜噜 | 亚洲AV第二区国产精品 | 国产v亚洲v天堂无码久久久 | 日韩欧美有码 | 久久春色 | 96在线观看 | 天天干天天添 | ass精品国模裸体欣赏pics | 三上悠亚影音先锋 | 亚洲一区二区av | 久久午夜电影 | 四虎精品一区二区 | 日韩欧美手机在线 | 亚洲福利影院 | 床戏高潮做进去大尺度视频 | 落日余晖图片 | 精品一区二区国产 | 日本一区免费看 | 欧美精品1区2区3区 精品成人一区 | 鲁一鲁一鲁一鲁一av | 中国免费一级片 | 一级高清视频 |