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