1. 程式人生 > >STM32編碼器模式詳解(一)---理論

STM32編碼器模式詳解(一)---理論

編碼器介面模式

選擇編碼器介面模式的方法是:如果計數器只在TI2的邊沿計數,則置TIMx_SMCR暫存器中的SMS=001;如果只在TI1邊沿計數,則置SMS=010;如果計數器同時在TI1和TI2邊沿計數,則置SMS=011。
通過設定TIMx_CCER暫存器中的CC1P和CC2P位,可以選擇TI1和TI2極性;如果需要,還可以對輸入濾波器程式設計。
兩個輸入TI1和TI2被用來作為增量編碼器的介面。參看表77,假定計數器已經啟動(TIMx_CR1暫存器中的CEN=’1’),計數器由每次在TI1FP1或TI2FP2上的有效跳變驅動。TI1FP1和TI2FP2是TI1和TI2在通過輸入濾波器和極性控制後的訊號

如果沒有濾波和變相,則TI1FP1=TI1,TI2FP2=TI2根據兩個輸入訊號的跳變順序,產生了計數脈衝和方向訊號。依據兩個輸入訊號的跳變順序,計數器向上或向下計數,同時硬體對TIMx_CR1暫存器的DIR位進行相應的設定。不管計數器是依靠TI1計數、依靠TI2計數或者同時依靠TI1和TI2計數。在任一輸入端(TI1或者TI2)的跳變都會重新計算DIR位。
編碼器介面模式基本上相當於使用了一個帶有方向選擇的外部時鐘。這意味著計數器只在0到TIMx_ARR暫存器的自動裝載值之間連續計數(根據方向,或是0到ARR計數,或是ARR到0計數)。所以在開始計數之前必須配置TIMx_ARR;同樣,捕獲器、比較器、預分頻器、觸發輸出特性等仍工作如常。
在這個模式下,計數器依照增量編碼器的速度和方向被自動的修改,因此計數器的內容始終指示著編碼器的位置。計數方向與相連的感測器旋轉的方向對應。下表列出了所有可能的組合,假設TI1和TI2不同時變換。
表1 計數方向和編碼器的關係

在這裡插入圖片描述
一個外部的增量編碼器可以直接與MCU連線而不需要外部介面邏輯。但是,一般會使用比較器將編碼器的差動輸出轉換到數字訊號,這大大增加了抗噪聲干擾能力。編碼器輸出的第三個訊號表示機械零點,可以把它連線到一個外部中斷輸入並觸發一個計數器復位。
下圖是一個計數器操作的例項,顯示了計數訊號的產生和方向控制。它還顯示了當選擇了雙邊沿時,輸入抖動是如何被抑制的;抖動可能會在感測器的位置靠近一個轉換點時產生。在這個例子中,我們假定配置如下:
● CC1S=’01’ (TIMx_CCMR1暫存器, IC1FP1對映到TI1)
● CC2S=’01’ (TIMx_CCMR2暫存器, IC2FP2對映到TI2)
● CC1P=’0’ (TIMx_CCER暫存器, IC1FP1不反相, IC1FP1=TI1)
● CC2P=’0’ (TIMx_CCER暫存器, IC2FP2不反相, IC2FP2=TI2)
● SMS=’011’ (TIMx_SMCR暫存器,所有的輸入均在上升沿和下降沿有效).
● CEN=’1’ (TIMx_CR1暫存器,計數器使能)
圖1 編碼器模式下的計數器操作例項
在這裡插入圖片描述

對下面 計數器方向和編碼器關係 表格的理解

在這裡插入圖片描述
我們可以對應圖1來看
僅在TI1計數時 相對訊號的電平其實就是TI2的電平(不考慮反向的情況)這樣再看這張表就會比較容易理解了
在TI2為高電平的時候TI1為上升沿時脈衝計數減1,TI1位下降沿時脈衝計數加1
在TI2為低電平的時候TI1為上升沿時脈衝計數加1,TI1位下降沿時脈衝計數減1
後面可以同理類推。

韌體庫中的編碼器介面函式

上面部分的內容是對手冊中編碼器模式的摘錄。從中我們可以看出編碼器模式的配置方法。STM32韌體庫中提供了編碼器介面的配置函式(下面摘錄了函式介紹和引數說明部分)

/**
  * @brief  Configures the TIMx Encoder Interface.
  * @param  TIMx: where x can be  1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
  * @param  TIM_EncoderMode: specifies the TIMx Encoder Mode.
  *   This parameter can be one of the following values:
  *     @arg TIM_EncoderMode_TI1: Counter counts on TI1FP1 edge depending on TI2FP2 level.
  *     @arg TIM_EncoderMode_TI2: Counter counts on TI2FP2 edge depending on TI1FP1 level.
  *     @arg TIM_EncoderMode_TI12: Counter counts on both TI1FP1 and TI2FP2 edges depending
  *                                on the level of the other input.
  * @param  TIM_IC1Polarity: specifies the IC1 Polarity
  *   This parameter can be one of the following values:
  *     @arg TIM_ICPolarity_Falling: IC Falling edge.
  *     @arg TIM_ICPolarity_Rising: IC Rising edge.
  * @param  TIM_IC2Polarity: specifies the IC2 Polarity
  *   This parameter can be one of the following values:
  *     @arg TIM_ICPolarity_Falling: IC Falling edge.
  *     @arg TIM_ICPolarity_Rising: IC Rising edge.
  * @retval None
  */
void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity)

我們使用如下函式即可達到上面手冊例項中通過暫存器配置的效果(假設使用的是TIM2定時器)

TIM_EncoderInterfaceConfig(TIM2,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising)

從上面的手冊中我們也可知道使用編碼器模式需要配置時基,也可以選擇使用過濾器(需要配置輸入捕獲)因此我們可以推出編碼器模式的程式設計流程

Created with Raphaël 2.2.0開始開啟GPIO埠時鐘和定時器時鐘配置時基結構體配置編碼器配置輸入捕獲結構體使能定時器結束

編碼器可以使用的介面

一般的編碼器有AB兩相,需要接到定時器的兩個通道上。對於STM32而言只有TIMx_CH1和TIMx_CH2支援編碼器模式。這一點我們可以從定時器的時鐘框圖可以看出(因此編碼器模式下定時器通道的選擇上一定要注意
在這裡插入圖片描述