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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

平衡小车—编码器使用教程与测速原理

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

文章目錄

    • 1.編碼器概述
    • 2.編碼器原理
    • 3.編碼器接線說(shuō)明
    • 4.編碼器軟件四倍頻技術(shù)
    • 5.單片機(jī)如何采集編碼器數(shù)據(jù)
    • 6.獲取方式

來(lái)自平衡小車之家,與大家一起學(xué)習(xí)編碼器使用與測(cè)速原理。

1.編碼器概述

??編碼器是一種將角位移或者角速度轉(zhuǎn)換成一連串電數(shù)字脈沖的旋轉(zhuǎn)式傳感器,我們可以通過編碼器測(cè)量到底位移或者速度信息。編碼器從輸出數(shù)據(jù)類型上分,可以分為增量式編碼器和絕對(duì)式編碼器。
??從編碼器檢測(cè)原理上來(lái)分,還可以分為光學(xué)式、磁式、感應(yīng)式、電容式。常見的是光電編碼器(光學(xué)式)和霍爾編碼器(磁式)。

2.編碼器原理

??光電編碼器是一種通過光電轉(zhuǎn)換將輸出軸上的機(jī)械幾何位移量轉(zhuǎn)換成脈沖或數(shù)字量的傳感器。光電編碼器是由光碼盤和光電檢測(cè)裝置組成。光碼盤是在一定直徑的圓板上等分地開通若干個(gè)長(zhǎng)方形孔。由于光電碼盤與電動(dòng)機(jī)同軸,電動(dòng)機(jī)旋轉(zhuǎn)時(shí),檢測(cè)裝置檢測(cè)輸出若干脈沖信號(hào),為判斷轉(zhuǎn)向,一般輸出兩組存在一定相位差的方波信號(hào)。

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

??可以看到兩種原理的編碼器目的都是獲取AB相輸出的方波信號(hào),其使用方法也是一樣,下面是一個(gè)簡(jiǎn)單的示意圖。

講下增量型旋轉(zhuǎn)編碼器的工作原理,再拆開一個(gè)編碼器看看內(nèi)部構(gòu)造

3.編碼器接線說(shuō)明

??具體到我們的編碼器電機(jī),我們可以看看電機(jī)編碼器的實(shí)物。

??這是一款增量式輸出的霍爾編碼器。編碼器有AB相輸出,所以不僅可以測(cè)速,還可以辨別轉(zhuǎn)向。根據(jù)上圖的接線說(shuō)明可以看到,我們只需給編碼器電源5V供電,在電機(jī)轉(zhuǎn)動(dòng)的時(shí)候即可通過AB相輸出方波信號(hào)。編碼器自帶了上拉電阻,所以無(wú)需外部上拉,可以直接連接到單片機(jī)IO讀取。

4.編碼器軟件四倍頻技術(shù)

??下面我們說(shuō)一下編碼器倍頻的原理。為了提高大家下面學(xué)習(xí)的興趣,我們先明確,這是一項(xiàng)實(shí)用的技術(shù),可以真正地把編碼器的精度提升4倍。作用可類比于單反相機(jī)的光學(xué)變焦,而并非犧牲清晰度來(lái)放大圖像的數(shù)碼變焦。
??0K,先看看下面編碼器輸出的波形圖。

??這里,我們是通過軟件的方法實(shí)現(xiàn)四倍頻。首先可以看到上圖編碼器輸出的AB相波形,正常情況下我們使用M法測(cè)速的時(shí)候,會(huì)通過測(cè)量單位時(shí)間內(nèi)A相輸出的脈沖數(shù)來(lái)得到速度信息。常規(guī)的方法,我們只測(cè)量A相(或B相)的上升沿或者下降沿,也就是上圖中對(duì)應(yīng)的數(shù)字1234中的某一個(gè),這樣就只能計(jì)數(shù)3次。而四倍頻的方法是測(cè)量A相和B相編碼器的上升沿和下降沿。這樣在同樣的時(shí)間內(nèi),可以計(jì)數(shù)12次(3個(gè)1234的循環(huán))。這就是軟件四倍頻的原理。

**************************************************************************/ /************************************************************************** 函數(shù)功能:把TIM2初始化為編碼器接口模式 入口參數(shù):無(wú) 返回 值:無(wú) **************************************************************************/ void Encoder_Init_TIM2(void) {TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能定時(shí)器2的時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PB端口時(shí)鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入GPIO_Init(GPIOA, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始GPIOBTIM_TimeBaseStructInit(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 預(yù)分頻器 TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //設(shè)定計(jì)數(shù)器自動(dòng)重裝值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//選擇時(shí)鐘分頻:不分頻TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM向上計(jì)數(shù) TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用編碼器模式3,模式3就我們?cè)谶@里所說(shuō)的4倍頻,詳細(xì)信息查看stm32f1技術(shù)手冊(cè)TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = 10;TIM_ICInit(TIM2, &TIM_ICInitStructure);TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除TIM的更新標(biāo)志位TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//Reset counterTIM_SetCounter(TIM2,0);TIM_Cmd(TIM2, ENABLE); } /************************************************************************** 函數(shù)功能:把TIM4初始化為編碼器接口模式 和TIM2同理 入口參數(shù):無(wú) 返回 值:無(wú) **************************************************************************/ void Encoder_Init_TIM4(void) {TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//使能定時(shí)器4的時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PB端口時(shí)鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入GPIO_Init(GPIOB, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化GPIOBTIM_TimeBaseStructInit(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 預(yù)分頻器 TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //設(shè)定計(jì)數(shù)器自動(dòng)重裝值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//選擇時(shí)鐘分頻:不分頻TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM向上計(jì)數(shù) TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);//使用編碼器模式3TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = 10;TIM_ICInit(TIM4, &TIM_ICInitStructure);TIM_ClearFlag(TIM4, TIM_FLAG_Update);//清除TIM的更新標(biāo)志位TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//Reset counterTIM_SetCounter(TIM4,0);TIM_Cmd(TIM4, ENABLE); }

5.單片機(jī)如何采集編碼器數(shù)據(jù)

??因?yàn)榫幋a器輸出的是標(biāo)準(zhǔn)的方波,所以我們可以使用單片機(jī)(STM32\STM851等)直接讀取。在軟件中的處理方法是分兩種,自帶編碼器接口的單片機(jī)如STM32,可以直接使用硬件計(jì)數(shù)。而沒有編碼器接口的單片機(jī)如51單片機(jī),可以通過外部中斷讀取,比如把編碼器A相輸出接到單片機(jī)的外部中斷輸入口,這樣就可通過跳變沿觸發(fā)中斷,然后在對(duì)應(yīng)的外部中斷服務(wù)函數(shù)里面,通過B相的電平來(lái)確定正反轉(zhuǎn)。如當(dāng)A相來(lái)一個(gè)跳變沿的時(shí)候,如果B相是高電平就認(rèn)為是正轉(zhuǎn),低電平就認(rèn)為是反轉(zhuǎn)。

/************************************************************************** 函數(shù)功能:單位時(shí)間讀取編碼器計(jì)數(shù) 入口參數(shù):定時(shí)器 返回 值:速度值 **************************************************************************/ int Read_Encoder(u8 TIMX) {int Encoder_TIM; switch(TIMX){case 2: Encoder_TIM= (short)TIM2 -> CNT; TIM2 -> CNT=0;break;case 3: Encoder_TIM= (short)TIM3 -> CNT; TIM3 -> CNT=0;break; case 4: Encoder_TIM= (short)TIM4 -> CNT; TIM4 -> CNT=0;break; default: Encoder_TIM=0;}return Encoder_TIM; } /************************************************************************** 函數(shù)功能:TIM4中斷服務(wù)函數(shù) 入口參數(shù):無(wú) 返回 值:無(wú) **************************************************************************/ void TIM4_IRQHandler(void) { if(TIM4->SR&0X0001)//溢出中斷{ } TIM4->SR&=~(1<<0);//清除中斷標(biāo)志位 } /************************************************************************** 函數(shù)功能:TIM2中斷服務(wù)函數(shù) 入口參數(shù):無(wú) 返回 值:無(wú) **************************************************************************/ void TIM2_IRQHandler(void) { if(TIM2->SR&0X0001)//溢出中斷{ } TIM2->SR&=~(1<<0);//清除中斷標(biāo)志位 }

6.獲取方式

??測(cè)試編碼器代碼獲取方式,關(guān)注微信公眾號(hào):果果小師弟,后套回復(fù):編碼器。即可獲取STM32測(cè)試編碼器代碼。

總結(jié)

以上是生活随笔為你收集整理的平衡小车—编码器使用教程与测速原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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