STM32f103 定時器之編碼器接口模式

2020-11-24 電子產品世界

買了個Arduino的旋轉編碼器模塊,配合STM32定時器編碼器模式實現了旋轉角度以及圈數的計數。這種旋轉編碼器我能想到的實際應用場景暫時只有實體音量旋鈕,滑鼠的滾輪等,所以只實現了計數。閱讀Arduino關於該編碼器的介紹,該編碼器還可以實現旋轉的速度、加速度的計算。應該算是算法層級的吧,還沒做到實際應用,暫時不深究,本篇僅僅對旋轉編碼器的原理以及STM32編碼器接口模式的配置使用方法做個簡介。

本文引用地址:http://www.eepw.com.cn/article/201807/384496.htm

正文

編碼器分類:

按工作原理:光電式、磁電式和觸點電刷式;

按碼盤的刻孔方式:增量式和絕對式兩類;

這是從網上看到一個簡介,只接觸過Arduino的編碼器,其他暫未使用過。

Arduino的編碼器屬於增量式。它一共有5根線。分別為「CLK」、「DT」、「SW」、「+」、「GND」。

「+」、「GND」:勿用多說,VCC與GND,接至板子的VCC與GND即可。

「SW」:Arduino介紹說,當旋鈕旋轉完一圈時,該腳會放出一個電平跳變信號,相當於旋轉編碼器常說的「Z」信號,實際上我買的這個只是一個開關,即旋鈕部分可以按下去(類似於汽車上的音量調節按鈕),該接口會產生一個下降沿。然後由MCU去做相關處理。

「CLK」、「DT」:在該模塊上顯示的絲印名稱為這兩個,不明白為什麼是這個絲印,應該實際對應於編碼器常用的「A」、「B」信號吧,這兩個信號的發生方式如下:

正旋:如上圖當旋鈕開始正向旋轉時,「A」從低電平變為高電平,「B」保持不變;當旋鈕旋轉到預定位置時,「A」維持為高電平,「B」然後跟著從低電平跳變到高電平。也就是說,正旋時,「A」總是先與「B」開始電平變化。

反旋:與正旋相反,「B」總是先與「A」開始電平變化。

所以在此處,絲印將該兩個接線印成「CLK」、「DT」就讓我有點困惑。也未找到相關資料,先暫時放放,下次有實際應用,就知道為什麼了。

根據如上正旋反旋規律,就已經可以根據編碼器輸出的信息判斷出編碼器的旋轉方向以及計算出其旋轉角度了,具體做法如下:

將「CLk」、「DT」分別連接至MCU的任意具有外部中斷的IO口,處理方式為:

將該兩個IO口配置為雙邊沿外部中斷。

當其中某個IO口檢測到上升沿或者下降沿時,在中斷函數內檢測另一個IO口的電平狀態。以正旋為例,正旋時,「A」先上升沿引起中斷,得到的「A」、「B」的電平狀態為「10」,緊接著,「B」上升沿,檢測到「A」、「B」電平狀態為「11」。

若一直正轉,則「A」、「B」的電平狀態為「10 - 11 - 01 - 00 - 10 - ...」。

若一直反轉,則「A」、「B」的電平狀態為「01 - 11 - 10 - 00 - 01 - ...」

以此,即可判斷出該編碼器的旋轉方向,同時在「A」、「B」同時跳變完成後,即可根據編碼器的旋轉方向對編碼器的旋轉計數進行增減。

以上為使用外部中斷方式處理旋轉編碼器的輸出信息,當然,本篇要用到STM32定時器接口模式,所以也就不會用以上的方法進行判斷。那麼定時器接口模式是如何對旋轉編碼器進行計數的呢?

其實原理一樣,將旋轉編碼器的「CLK(A)」、「DT(B)」腳接入到TIMx的通道,將對應通道引腳配置為編碼器接口模式,使能計數,然後STM32的值就會在硬體上按照上述規對計數器的值進行加減。

本實驗接到的是STM32F103的「PB6(TIM4_CH1)」、「PB7(TIM4_CH2)」,具體配置如下:

配置IO口:

// GPIO// 使能對應的GPIO口時鐘RCC_APB2PeriphClockCmd(Enc_GPIO_CLK, ENABLE);

GPIO_InitStructure.GPIO_Pin = Enc_CLK_GPIO_PIN | Enc_DAT_GPIO_PIN | Enc_SW_GPIO_PIN;// 該編碼器模塊已經做了外部上拉處理,配製成浮空輸入即可GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(Enc_GPIO_PORT, GPIO_InitStructure);

配置定時器基本單元:

// TIM4// PB6 ch1 A,PB7 ch2 // TIMxCLK = 36MHZRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

TIM_DeInit(TIM4);

TIM_TimeBaseStructInit(TIM_TimeBaseStructure);

TIM_TimeBaseStructure.TIM_Period = 0xFF;

TIM_TimeBaseStructure.TIM_Prescaler = 0;

TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1 ;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM4, TIM_TimeBaseStructure);

配置對應寄存器為編碼器接口模式以及配置相關的輸入捕獲配置:

TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);

TIM_ICStructInit(TIM_ICInitStructure);

TIM_ICInitStructure.TIM_ICFilter = 6;//ICx_FILTER;TIM_ICInit(TIM2, TIM_ICInitStructure);

清除相關中斷,以及清除對應的計數器,並啟動定時器:

// Clear all pending interruptsTIM_ClearFlag(TIM4, TIM_FLAG_Update);// 其實中斷可以不用開,因為硬體自行對計數器進行加減。TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//Reset counterTIM4->CNT = 0;

TIM_Cmd(TIM4, ENABLE); //啟動TIM4定時器

如若開了中斷,中斷處理函數為:

void TIM4_IRQHandler(void){

if(TIM4->SR0x0001)//溢出中斷{

LED_Toggle(1);

}

TIM4->SR=~(10);//清除中斷標誌位 }

主函數讀取相應計數器值,並將其列印至串口:

int main(void) {// 讀取計數器信息Enc0Pos = TIM_GetCounter(TIM4);// 取模2的原因是,兩個引腳接到同一個定時器,每旋轉一次會計數兩次Enc0Pos /= 2;if(Enc0Pos != Enc_PinDATLast

{

Enc_PinDATLast = Enc0Pos; printf(Position = %d\n\r, Enc0Pos);

}

}

參考文獻:

Reading Rotary Encoders Contents.

Get Native 32Bit resolution for your encoder on STM32F4.

STM32定時器---正交編碼器模式詳解.

至此,記錄完畢

  • STM32單片機中文官網
  • STM32單片機官方開發工具
  • STM32單片機參考設計

相關焦點

  • stm32f103c8t6封裝及最小系統原理圖
    打開APP stm32f103c8t6封裝及最小系統原理圖 發表於 2017-11-23 15:50:30   STM32F103C8T6是一款集成電路,芯體尺寸為32位,程序存儲器容量是64KB,需要電壓2V~3.6V,工作溫度為-40°C ~ 85°C。
  • stm32f407之高級定時器 死區互補PWM(操作寄存器)
    lt;15;    // 剎車使能位置1,開啟所有輸出通道  TIM1->BDTR|=0xCD;     // 死區時間設定  TIM1->CR1 |= 1; //開始計時  while(1)  {  };} 關鍵字:stm32f407
  • stm32編碼器的接口模式
    編碼器是什麼玩意呢,它可是一個好玩的東西,做小車測速必不可少的玩意,下面,我將從編碼器的原理講起,一直到用stm32的編碼器接口模式,測出電機轉速與方向。2.stm32編碼器接口模式(寄存器)        stm32的編碼器接口模式在STM32中文參考手冊中有詳細的說明,在手冊273頁,14.3.12節。程序是完全按照 下圖方式,設置寄存器的。
  • 單片機中各種周期的關係與定時器原理
    以STM32F103為例,進行解析  STM32的TIM一般有高級定時器TIM1,(TIM8隻有在互聯性產品有),普通定時器TIM2,TIM3,TIM4,(TIM5,TIM6,TIM7有點設備中沒有);今天就只介紹普通定時器,因為高級定時器我還不會!每一個普通定時器都有4路通道!
  • stm32 霍爾傳感器接口
    13.3.18 與霍爾傳感器的接口使用高級控制定時器(TIM1或TIM8)產生PWM信號驅動馬達時,可以用另一個通用TIMx(TIM2、TIM3、TIM4或TIM5)定時器作為「接口定時器」來連接霍爾傳感器,見圖93,3個定時器輸入腳(CC1、CC2、CC3)通過一個
  • STM32F1與STM32F0在GPIO_TypeDef 寄存器方面的不同
    推薦閱讀 STM32F1串口通信總結 異步通信:不帶時鐘同步信號,需規定波特率來通信。-UART(通用異步收發器),單總線4、STM32的串口通信接口 :1.UART:通用異步收發器UART異步通信方式特點:全雙工異步通信。
  • STM32F1通用定時器配置步驟(使用HAL庫)
    (1)使能定時器時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4時鐘(2)初始化定時器參數,包含自動重裝值,分頻係數,計數方式等voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct
  • 如何實現STM32F407單片機的ADC轉換
    用到的引腳是PA3也就是ADC1的通道3 1、ADC的主要參數 a、解析度----stm32f407的解析度有6位、8位、10位、12位,參考電壓如果是3.3 那麼最小解析度就是3.3/4095。 b、轉換時間----stm32f407的最高允許頻率是36M,最快轉換時間 = 3+12個周期 =0.71us。
  • 基於FPGA的RCN226絕對式編碼器通信接口設計
    為了減小體積,絕對式編碼器一般採用串行通信方式輸出絕對編碼,針對伺服電機控制等高端場合,為了滿足快速的電流環、速度環、位置環的控制需要,編碼輸出的速度又應該非常快,這些不利因素都對絕對式編碼的接收增加了難度。 絕對式編碼器廠家大多為其編碼器配套了接收晶片,實現串行編碼到並行編碼的轉換,便於控制器的讀取操作。
  • 正點原子-戰艦V3第四章 STM32F1 基礎知識入門
    它的初始化狀態是由幾個屬性來決定的,比如模式,速度等。這些知識也不是什麼原創,純粹根據官方提供的中文參考手冊和自己的應用心得來總結的,如有不合理之處望大家諒解。APB2 分頻器分頻輸出一路供 APB2 外設使用(PCLK2,最大頻率 72MHz),另一路送給定時器(Timer)1 倍頻器使用。
  • STM32 高級定時器-PWM簡單使用
    高級定時器與通用定時器比較類似,下面是一個TIM1 的PWM 程序,TIM1是STM32唯一的高級定時器。共有4個通道有 死區有互補。空閒狀態下的非工作狀態 不管TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;//先不管TIM_OC1Init(TIM1,&TIM_OCInitStructure); //數初始化外設TIMx通道1這裡2.0庫為TIM_OCInit/* TIM1 counter enable開定時器
  • 編碼器的CAN總線接口及其在光電跟蹤系統中的應用
    單片機是編碼器電路系統的核心部分,它將編碼器的信號(粗碼、中精碼、精碼)採集到後,經精碼細分、碼道校正、數字量相加、電調零、度分秒轉換等軟體處理,最後顯示及實現與控制系統接口。因此,在對光電跟蹤系統內部通信方式改造中採用CAN總線作為數據通信總線結構,進而提出編碼器CAN總線接口。
  • stm32庫函數學習篇通用定時器輸入捕獲功能
    也就是說,每個通用定時器都只有四個獨立通道,當某一通道作為了輸入觸發功能那就不能再作為輸出匹配功能。這一點我們也可以從其他地方找到印證。stm32定時器輸入觸發功能其實挺簡單的,與AVR單片機幾乎一樣。就是單片機引腳上一旦出現一個有效邊沿(可以配置為上升、下降或者上升下降均觸發),那麼定時器計數器CNT裡面的值就會被相應的Capture/Compare X Register保存下來。這裡X可以是1,2,3,4任何一個。並且中斷標誌位被置位。
  • MPU6050和STM32L152的微功耗三維無線滑鼠設計
    主控晶片STM32L152與MPU6050的I2C和串口轉WiFi模塊的接口電路如圖2所示。三維滑鼠低功耗設計中,主要實現在滑鼠不工作時系統進入睡眠模式,達到功耗最低,並且能夠及時從睡眠中喚醒,進入工作狀態。因此,在微處理器STM32L152中設置一個3s定時器,用來掃描滑鼠當前狀態是否符合進入睡眠模式條件。每當定時溢出中斷到來後,採集加速度計Z軸輸出值並持續0.5s,採集的當前數據與上一時刻相減得到變化值,判斷其是否大於所設的閾值,並對這些大於閾值的數據進行計數。
  • 一款用於絕對位置編碼器接口的解決方案
    表2:收發器要求 表3:編碼器電源要求 一款用於絕對位置編碼器接口的解決方案 到絕對位置編碼器的通用數字接口參考設計 (TIDA-00179) 執行一個電磁兼容性 (EMC) 兼容的通用數字接口;這個接口與EnDat 2.2、BiSS或HIPERFACE DSL等絕對位置編碼器相連接。
  • STM32CubeMX升級至V5.2.0,STM32G4即將推出,STM32CubeIDE正式面世
    官網網址: www.st.com/stm32cubemx升級,下面重點講講STM32CubeIDE這個集成開發工具。 2STM32CubeIDE第一版 今天,學習STM32的人,大不多都應該聽說了這個STM32CubeIDE工具。
  • Biss磁編碼器
    Biss磁編碼器是指電氣接口是基於開放的BiSS Line和BiSS-C通訊標準的磁編碼器。
  • 基於STM32F107VCT6微控制器的控制系統解決方案
    交流充電樁採用大屏幕LCD彩色觸控螢幕作為人機互動界面,可選擇定電量、定時間、定金額、自動(充滿為止)四種模式充電,具備運行狀態監測、故障狀態監測、充電分時計量、歷史數據記錄和存儲等功能。充電樁的交流工作電壓(220±15%)V,額度輸出電流(AC)為32 A(七芯插座),普通純電動轎車用交流充電樁充滿電大約需要6~8 h,充電樁更適用於慢速充電。
  • iC-Haus推出帶有多圈接口的14位BiSS/SSI磁編碼器IC
    導讀絕對式霍爾角度編碼器 iC-MHM 是一種單晶片磁編碼器,具有 360° 全方位 14 位單圈解析度(0.02° 的角解析度)。該編碼器在與連接到 iC-MHM 多圈接口上的多圈編碼器組件 iC-PV 聯用時,可獲得高達 46 位的總解析度。
  • 機械測量中旋轉編碼器與單片機的通用接口(07-100)
    ,我們成功地開發了單片機與旋轉編碼器的最簡硬體接口。  由於A、B兩相相差90度,可通過比較A相在前還是B相在前,以判別編碼器的正轉與反轉,通過零位脈衝,可獲得編碼器的零位參考位。  信號輸出有正弦波(電流或電壓),方波(TTL、HTL),集電極開路(PNP、NPN),推拉式多種形式,其中TTL為長線差分驅動(對稱A,A-;B,B-;Z,Z-),HTL也稱推拉式、推挽式輸出,編碼器的信號接收設備接口應與編碼器對應。