樹莓派基礎(chǔ)實驗26:旋轉(zhuǎn)編碼器實驗

一、介紹

?? 旋轉(zhuǎn)編碼器是一種機(jī)電裝置,可將軸或軸的角位置或運(yùn)動,轉(zhuǎn)換為模擬或數(shù)字代碼。旋轉(zhuǎn)編碼器通常放置在垂直于軸的一側(cè)。旋轉(zhuǎn)編碼器用作檢測自動化領(lǐng)域中的角度,速度,長度,位置和加速度的傳感器。


二、組件

Raspberry Pi主板*1

樹莓派電源*1

40P軟排線*1

旋轉(zhuǎn)編碼器傳感器模塊*1

面包板*1

跳線若干

三、實驗原理

旋轉(zhuǎn)編碼器
旋轉(zhuǎn)編碼器
旋轉(zhuǎn)編碼器模塊原理圖

?? 旋轉(zhuǎn)編碼器可通過旋轉(zhuǎn),計數(shù)正方向和反方向轉(zhuǎn)動過程中,輸出脈沖的次數(shù)。旋轉(zhuǎn)計數(shù)不像電位計,這種轉(zhuǎn)動計數(shù)是沒有限制的。配合旋轉(zhuǎn)編碼器上的按鍵,可以復(fù)位到初始狀態(tài),即從0開始計數(shù)。

??工作原理: 增量編碼器是一種將旋轉(zhuǎn)位移,轉(zhuǎn)換成周期性的電信號,再把這個電信號轉(zhuǎn)變成計數(shù)脈沖,用脈沖的個數(shù)表示位移的大小的旋轉(zhuǎn)式傳感器。
??在增量編碼器中角位移的轉(zhuǎn)換采用了光電掃描原理。讀數(shù)系統(tǒng)以,由交替的透光窗口和不透光窗口構(gòu)成的,徑向分度盤(碼盤)的旋轉(zhuǎn),為依據(jù),同時被一個紅外光源垂直照射。
??光把碼盤的圖像投射到接收器表面上,接收器覆蓋著一層衍射光柵,它具有和碼盤相同的窗口寬度。接收器的工作是感受光盤轉(zhuǎn)動所產(chǎn)生的變化,然后將光變化轉(zhuǎn)換成相應(yīng)的電變化。再使低電平信號上升到較高電平,并產(chǎn)生沒有任何干擾的方形脈沖,這就必須用電子電路來處理。
??讀數(shù)系統(tǒng)通常采用差分方式,即將兩個波形一樣但相位差為180°的不同信號進(jìn)行比較,以便提高輸出信號的質(zhì)量和穩(wěn)定性。讀數(shù)是在兩個信號的差別基礎(chǔ)上形成的,從而消除了干擾。

工作原理圖

??增量編碼器給出兩相方波,它們的相位差90°,通常稱為A通道和B通道。其中一個通道給出與轉(zhuǎn)速相關(guān)的信息,與此同時,通過兩個通道信號進(jìn)行順序?qū)Ρ?,得到旋轉(zhuǎn)方向的信息。還有一個特殊信號稱為Z或零通道,該通道給出編碼器的絕對零位(恢復(fù)按鈕),此信號是一個方波與A通道方波的中心線重合。

??增量型編碼器精度取決于機(jī)械和電氣兩種因素,這些因素有:光柵分度誤差、光盤偏心、軸承偏心、電子讀數(shù)裝置引入的誤差以及光學(xué)部分的不精確性。確定編碼器精度的測量單位是電氣上的度數(shù),編碼器精度決定了編碼器產(chǎn)生的脈沖分度。以下用360°電氣度數(shù)來表示機(jī)械軸的轉(zhuǎn)動,而軸的轉(zhuǎn)動必須是一個完整的周期。要知道多少機(jī)械角度相當(dāng)于電氣上的360度,可以用下列公式來計算: 電氣360 =機(jī)械360°/n°脈沖/轉(zhuǎn)。

A、B換向時信號

??編碼器分度誤差是以電氣角度為單位的,兩個連續(xù)脈沖波的最大偏移來表示。誤差存在于任何編碼器中,這是由前述各因素引起的。增量型編碼器的最大誤差為±25電氣角度(在已聲明的任何條件下),相當(dāng)于額定值偏移±7%,至于相位差90°(電氣上)的兩個通道的最大偏差為±35電氣度數(shù)相當(dāng)于額定值偏移±10%左右。

??除了上述傳統(tǒng)的編碼器外,還有一些是與其它的電氣輸出信號集成在一起的增量型編碼器。與UVW信號集成的增量型編碼器就是實例,它通常應(yīng)用于交流伺服電機(jī)的反饋。這些磁極信號一般出現(xiàn)在交流伺服電機(jī)中,UVW信號一般是通過模擬磁性原件的功能而設(shè)計的。在增量型編碼器中,這些UVW信號是用光學(xué)方法產(chǎn)生,并以三個方波的形式出現(xiàn),它們彼此偏移120°。為了便于電機(jī)啟動,控制電動機(jī)用的啟動器需要這些正確的信號。這些UVW磁極脈沖可在機(jī)械軸旋轉(zhuǎn)中重復(fù)許多次,因為它們直接取決于所連接的電機(jī)磁極數(shù),并且用于4、6或更多極電機(jī)的UVW信號。

??本次實驗中,順時針旋轉(zhuǎn)時,打印的值變大;逆時針旋轉(zhuǎn),數(shù)值減??;按下旋轉(zhuǎn)按鈕時,復(fù)位到初始狀態(tài),即從0開始計數(shù)。

四、實驗步驟

??第1步:連接電路。

樹莓派 T型轉(zhuǎn)接板 (BCM) 旋轉(zhuǎn)編碼器模塊
GPIO0 G17 CLK
GPIO1 G18 DT
GPIO2 G27 SW
5V 5V VCC
GND GND GND
旋轉(zhuǎn)編碼器實驗電路圖
旋轉(zhuǎn)編碼器實驗實物接線圖

??第2步:編寫控制程序。順時針旋轉(zhuǎn)時,打印的值變大;逆時針旋轉(zhuǎn),數(shù)值減??;按下旋轉(zhuǎn)按鈕時,復(fù)位到初始狀態(tài),即從0開始計數(shù)。

實驗打印結(jié)果截圖
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time

RoAPin = 11    # CLK Pin
RoBPin = 12    # DT Pin
BtnPin = 13    # Button Pin

globalCounter = 0

flag = 0
Last_RoB_Status = 0
Current_RoB_Status = 0

def setup():
    GPIO.setmode(GPIO.BOARD)       # Numbers GPIOs by physical location
    GPIO.setup(RoAPin, GPIO.IN)    # input mode
    GPIO.setup(RoBPin, GPIO.IN)
    GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

def rotaryDeal():
    global flag
    global Last_RoB_Status
    global Current_RoB_Status
    global globalCounter
    Last_RoB_Status = GPIO.input(RoBPin)  
    while(not GPIO.input(RoAPin)):      #未旋轉(zhuǎn)時,GPIO.input(RoAPin)值為1,旋轉(zhuǎn)時會變?yōu)?
        Current_RoB_Status = GPIO.input(RoBPin)  #旋轉(zhuǎn)時的當(dāng)前值
        flag = 1
    if flag == 1:
        flag = 0
        if (Last_RoB_Status == 1) and (Current_RoB_Status == 0):
            globalCounter = globalCounter + 1  #順時針旋轉(zhuǎn),角位移增大
        if (Last_RoB_Status == 0) and (Current_RoB_Status == 1):
            globalCounter = globalCounter - 1  #逆時針旋轉(zhuǎn),數(shù)值減小

def btnISR(channel):
    global globalCounter
    globalCounter = 0

def loop():
    global globalCounter
    tmp = 0 # Rotary Temperary

    GPIO.add_event_detect(BtnPin, GPIO.FALLING, callback=btnISR)
    #當(dāng)按下按鈕時,調(diào)用回調(diào)函數(shù)btnISR
    while True:
        rotaryDeal()
        if tmp != globalCounter:
            print 'globalCounter = %d' % globalCounter
            tmp = globalCounter

def destroy():
    GPIO.cleanup()             # Release resource

if __name__ == '__main__':     # Program start from here
    setup()
    try:
        loop()
    except KeyboardInterrupt:  # When 'Ctrl+C' is pressed, the child program destroy() will be  executed.
        destroy()


??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容