增量式編碼器增量式編碼器也成為正交編碼器,是通過兩個信號線的脈沖輸出來進行數據處理,一個輸出脈沖信號就對應于一個增量位移,編碼器每轉動固定的位移,就會產生一個脈沖信號 通過讀取單位時間脈沖信號的數量,便可以達到測速的效果(v=s/t),通過對脈沖信號的累加,和編碼器的碼盤的周長(轉一圈對應距離) 便可以達到計算行走距離的效果(s=n*d)
看一下我用過的一種編碼器
編碼器信號: A 脈沖輸出 B 脈沖輸出 Z 零點信號 當編碼器旋轉到零點時,Z信號會發出一個脈沖表示現在是零位置 表示編碼器轉了1圈,可用來記錄編碼器轉了多少圈,從而知道運行距離VCC 電源線GND 地線
編碼器線數:編碼器的線數 ,是說編碼器轉一圈輸出多少個脈沖,,,如果一個編碼器是500線,說明這個編碼器轉一圈對應的信號線會輸出500個脈沖, A B兩相轉一圈發出的脈沖數一樣的,不過存在90°相位差
線數越高代表編碼器能夠反應的位置精度越高
編碼器原理:增量式編碼器有兩個脈沖輸出,A相和B相,并且兩個相位永遠存在90°相位差。 如果兩個信號相位差為90度,則這兩個信號稱為正交。由于兩個信號相差90度,因此可以根據兩個信號哪個先哪個后來判斷方向、并且可以根據AB相脈沖信號數量測得速度,位移等,
編碼器正反轉:
正轉的時候信號線A先輸出信號,信號線B后輸出 A相超前B相90度 證明是正轉
反轉的時候信號線B先輸出信號,信號線A后輸出 B相超前A相90度 證明是反轉
STM32定時器編碼器模式
STM32的編碼器模式共有三種:
僅在TL1計數(A相) 僅在TL2計數(B相) 在TL1和TL2都計數(A相和B相都計數)
僅在TL1計數(A相)
TI2(B相)為高電平時:
1時刻: TI1(A相)下降沿, 則向上計數(正轉)。
2時刻:TI1(A相)上升沿, 則向下計數(反轉)
TI2(B相)為低電平時:
3時刻: TI1(A相)上升沿, 則向上計數(正轉)。
4時刻:TI1(A相)下降沿, 則向下計數(反轉)
僅在TL2計數(B相)
TI1(A相)為高電平時:
1時刻: TI2(B相)上升沿, 則向上計數(正轉)。
2時刻:TI2(B相)下降沿, 則向下計數(反轉)
TI2(B相)為低電平時:
3時刻: TI2(B相)下降沿, 則向上計數(正轉)。
4時刻:TI2(B相)上升沿, 則向下計數(反轉)
在TL1和TL2都計數(A相和B相都計數)
一個脈沖信號周期完成4次跳變。精度提高
1時刻:TI2為低電平,TI1上升沿跳變,計數器向上計數;
2時刻:TI1為高電平,TI2上升沿跳變,計數器仍然向上計數;
3時刻:TI2為高電平,TI1下降沿跳變,計數器仍然向上計數;
4時刻:TI1為低電平,TI2下降沿跳變,計數器仍然向上計數。
毛刺:只有一個相位脈沖 過濾掉 編碼器轉動過程中可能產生的毛刺過濾掉
計數器向下計數原理相同 看圖即可很好理解。
計數器向下計數:
A下降沿,B低電平B下降沿,A高電平B上升沿,A低電平A上升沿,B高電平
上升沿與下降沿參看 《外部中斷----高低電平觸發,(邊沿觸發)上升沿觸發和下降沿觸發區別》
注意事項:需要增加測量的精度時,可以采用4倍頻方式,即分別在A、B相波形的上升沿和下降沿計數,分辨率可以提高4倍,如果只是測速,不要求方向,那么只需要用單片機隨意選擇一個信號線就行了,,然后定時器邊沿觸發,檢測脈沖計數即可一般是定時器的通道1和2才能作為編碼器輸入口,對應編碼器輸出的兩相。GPIO配置為配置為上拉輸入模式一個定時器做一種工作,如果你配置了編碼器模式,那么剩下的通道就不能配置其他模式兩相計數模式下, 讀出來數需要/4 一個脈沖信號對應四次計數
編碼器配置標準外設庫
TIM_EncoderInterfaceConfig,它就是編碼器接口的配置函數。簡單的只需要配置該函數,使能TIM,即可實現采集編碼器上面的信息
void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity)
TIMx參數就是使用哪個定時器作為編碼器接口的捕捉定時器。
TIM_EncoderMode參數是模式,是單相計數(僅在TL1計數或僅在TL2計數)還是兩相計數(在TL1和TL2都計數)。
TIM_IC1Polarity和TIM_IC2Polarity參數就是通道1、2的捕捉極性。
如果計數器只在TI2的邊沿計數,則置TIMx_SMCR寄存器中的SMS=001;如果只在TI1邊沿計數,則置SMS=010;如果計數器同時在TI1和TI2邊沿計數,則置SMS=011
編碼器模式功能: stm32f407中定時器1、2、3、4、5、8提供編碼器接口模式 可以對輸入信號TI1,TI2進行濾波處理,數字濾波器由事件器組成,每N個事件才視為一個有效邊沿,可以在TIMx_CCMR1、TIMx_CCMR2中的IC1F位域設置 也就是可以設置每產生幾次脈沖才視為1次有效 各個值的計算:轉速計算方法:用捕獲值(一秒內輸出的脈沖數)/編碼器線數(轉速一圈輸出脈沖數)/電機減數比(內部電機轉動圈數與電機輸出軸轉動圈數比,即減速齒輪比 沒有則不用除)
運動距離計算:輸出的總脈沖數 / 編碼器線數*編碼器齒輪周長
所轉角度計算: 輸出的總脈沖數 / 編碼器線數 *360 或 溢出中斷次數*360+當前計數值
轉動方向: 方向在定時器CR1的DIR位里 dir=(TIMX->CR1 & 0x0010)>>4; //取方向標志位if(dir > 0) //向下計數 else //向上計數