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在通過輸入濾波器和極性控制後的訊號
編碼器介面模式基本上相當於使用了一個帶有方向選擇的外部時鐘。這意味著計數器只在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)
從上面的手冊中我們也可知道使用編碼器模式需要配置時基,也可以選擇使用過濾器(需要配置輸入捕獲)因此我們可以推出編碼器模式的程式設計流程
編碼器可以使用的介面
一般的編碼器有AB兩相,需要接到定時器的兩個通道上。對於STM32而言只有TIMx_CH1和TIMx_CH2支援編碼器模式。這一點我們可以從定時器的時鐘框圖可以看出(因此編碼器模式下定時器通道的選擇上一定要注意)