树莓派基础实验26:旋转编码器实验
一、介紹
?? 旋轉(zhuǎn)編碼器是一種機(jī)電裝置,可將軸或軸的角位置或運(yùn)動(dòng),轉(zhuǎn)換為模擬或數(shù)字代碼。旋轉(zhuǎn)編碼器通常放置在垂直于軸的一側(cè)。旋轉(zhuǎn)編碼器用作檢測(cè)自動(dòng)化領(lǐng)域中的角度,速度,長(zhǎng)度,位置和加速度的傳感器。
二、組件
Raspberry Pi 3主板*1
樹(shù)莓派電源*1
40P軟排線*1
旋轉(zhuǎn)編碼器傳感器模塊*1
面包板*1
跳線若干
三、實(shí)驗(yàn)原理
?? 旋轉(zhuǎn)編碼器可通過(guò)旋轉(zhuǎn),計(jì)數(shù)正方向和反方向轉(zhuǎn)動(dòng)過(guò)程中,輸出脈沖的次數(shù)。旋轉(zhuǎn)計(jì)數(shù)不像電位計(jì),這種轉(zhuǎn)動(dòng)計(jì)數(shù)是沒(méi)有限制的。配合旋轉(zhuǎn)編碼器上的按鍵,可以復(fù)位到初始狀態(tài),即從0開(kāi)始計(jì)數(shù)。
??工作原理: 增量編碼器是一種將旋轉(zhuǎn)位移,轉(zhuǎn)換成周期性的電信號(hào),再把這個(gè)電信號(hào)轉(zhuǎn)變成計(jì)數(shù)脈沖,用脈沖的個(gè)數(shù)表示位移的大小的旋轉(zhuǎn)式傳感器。
??在增量編碼器中角位移的轉(zhuǎn)換采用了光電掃描原理。讀數(shù)系統(tǒng)以,由交替的透光窗口和不透光窗口構(gòu)成的,徑向分度盤(pán)(碼盤(pán))的旋轉(zhuǎn),為依據(jù),同時(shí)被一個(gè)紅外光源垂直照射。
??光把碼盤(pán)的圖像投射到接收器表面上,接收器覆蓋著一層衍射光柵,它具有和碼盤(pán)相同的窗口寬度。接收器的工作是感受光盤(pán)轉(zhuǎn)動(dòng)所產(chǎn)生的變化,然后將光變化轉(zhuǎn)換成相應(yīng)的電變化。再使低電平信號(hào)上升到較高電平,并產(chǎn)生沒(méi)有任何干擾的方形脈沖,這就必須用電子電路來(lái)處理。
??讀數(shù)系統(tǒng)通常采用差分方式,即將兩個(gè)波形一樣但相位差為180°的不同信號(hào)進(jìn)行比較,以便提高輸出信號(hào)的質(zhì)量和穩(wěn)定性。讀數(shù)是在兩個(gè)信號(hào)的差別基礎(chǔ)上形成的,從而消除了干擾。
??增量編碼器給出兩相方波,它們的相位差90°,通常稱(chēng)為A通道和B通道。其中一個(gè)通道給出與轉(zhuǎn)速相關(guān)的信息,與此同時(shí),通過(guò)兩個(gè)通道信號(hào)進(jìn)行順序?qū)Ρ?#xff0c;得到旋轉(zhuǎn)方向的信息。還有一個(gè)特殊信號(hào)稱(chēng)為Z或零通道,該通道給出編碼器的絕對(duì)零位(恢復(fù)按鈕),此信號(hào)是一個(gè)方波與A通道方波的中心線重合。
??增量型編碼器精度取決于機(jī)械和電氣兩種因素,這些因素有:光柵分度誤差、光盤(pán)偏心、軸承偏心、電子讀數(shù)裝置引入的誤差以及光學(xué)部分的不精確性。確定編碼器精度的測(cè)量單位是電氣上的度數(shù),編碼器精度決定了編碼器產(chǎn)生的脈沖分度。以下用360°電氣度數(shù)來(lái)表示機(jī)械軸的轉(zhuǎn)動(dòng),而軸的轉(zhuǎn)動(dòng)必須是一個(gè)完整的周期。要知道多少機(jī)械角度相當(dāng)于電氣上的360度,可以用下列公式來(lái)計(jì)算: 電氣360 =機(jī)械360°/n°脈沖/轉(zhuǎn)。
??編碼器分度誤差是以電氣角度為單位的,兩個(gè)連續(xù)脈沖波的最大偏移來(lái)表示。誤差存在于任何編碼器中,這是由前述各因素引起的。增量型編碼器的最大誤差為±25電氣角度(在已聲明的任何條件下),相當(dāng)于額定值偏移±7%,至于相位差90°(電氣上)的兩個(gè)通道的最大偏差為±35電氣度數(shù)相當(dāng)于額定值偏移±10%左右。
??除了上述傳統(tǒng)的編碼器外,還有一些是與其它的電氣輸出信號(hào)集成在一起的增量型編碼器。與UVW信號(hào)集成的增量型編碼器就是實(shí)例,它通常應(yīng)用于交流伺服電機(jī)的反饋。這些磁極信號(hào)一般出現(xiàn)在交流伺服電機(jī)中,UVW信號(hào)一般是通過(guò)模擬磁性原件的功能而設(shè)計(jì)的。在增量型編碼器中,這些UVW信號(hào)是用光學(xué)方法產(chǎn)生,并以三個(gè)方波的形式出現(xiàn),它們彼此偏移120°。為了便于電機(jī)啟動(dòng),控制電動(dòng)機(jī)用的啟動(dòng)器需要這些正確的信號(hào)。這些UVW磁極脈沖可在機(jī)械軸旋轉(zhuǎn)中重復(fù)許多次,因?yàn)樗鼈冎苯尤Q于所連接的電機(jī)磁極數(shù),并且用于4、6或更多極電機(jī)的UVW信號(hào)。
??本次實(shí)驗(yàn)中,順時(shí)針旋轉(zhuǎn)時(shí),打印的值變大;逆時(shí)針旋轉(zhuǎn),數(shù)值減小;按下旋轉(zhuǎn)按鈕時(shí),復(fù)位到初始狀態(tài),即從0開(kāi)始計(jì)數(shù)。
四、實(shí)驗(yàn)步驟
??第1步: 連接電路。
| GPIO0 | G17 | CLK |
| GPIO1 | G18 | DT |
| GPIO2 | G27 | SW |
| 5V | 5V | VCC |
| GND | GND | GND |
??第2步: 編寫(xiě)控制程序。順時(shí)針旋轉(zhuǎn)時(shí),打印的值變大;逆時(shí)針旋轉(zhuǎn),數(shù)值減小;按下旋轉(zhuǎn)按鈕時(shí),復(fù)位到初始狀態(tài),即從0開(kāi)始計(jì)數(shù)。
#!/usr/bin/env python import RPi.GPIO as GPIO import timeRoAPin = 11 # CLK Pin RoBPin = 12 # DT Pin BtnPin = 13 # Button PinglobalCounter = 0flag = 0 Last_RoB_Status = 0 Current_RoB_Status = 0def setup():GPIO.setmode(GPIO.BOARD) # Numbers GPIOs by physical locationGPIO.setup(RoAPin, GPIO.IN) # input modeGPIO.setup(RoBPin, GPIO.IN)GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)def rotaryDeal():global flagglobal Last_RoB_Statusglobal Current_RoB_Statusglobal globalCounterLast_RoB_Status = GPIO.input(RoBPin) while(not GPIO.input(RoAPin)): #未旋轉(zhuǎn)時(shí),GPIO.input(RoAPin)值為1,旋轉(zhuǎn)時(shí)會(huì)變?yōu)?Current_RoB_Status = GPIO.input(RoBPin) #旋轉(zhuǎn)時(shí)的當(dāng)前值flag = 1if flag == 1:flag = 0if (Last_RoB_Status == 1) and (Current_RoB_Status == 0):globalCounter = globalCounter + 1 #順時(shí)針旋轉(zhuǎn),角位移增大if (Last_RoB_Status == 0) and (Current_RoB_Status == 1):globalCounter = globalCounter - 1 #逆時(shí)針旋轉(zhuǎn),數(shù)值減小def btnISR(channel):global globalCounterglobalCounter = 0def loop():global globalCountertmp = 0 # Rotary TemperaryGPIO.add_event_detect(BtnPin, GPIO.FALLING, callback=btnISR)#當(dāng)按下按鈕時(shí),調(diào)用回調(diào)函數(shù)btnISRwhile True:rotaryDeal()if tmp != globalCounter:print 'globalCounter = %d' % globalCountertmp = globalCounterdef destroy():GPIO.cleanup() # Release resourceif __name__ == '__main__': # Program start from heresetup()try:loop()except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child program destroy() will be executed.destroy()??
總結(jié)
以上是生活随笔為你收集整理的树莓派基础实验26:旋转编码器实验的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 冬季招聘会感受
- 下一篇: BTTCOJ 问题 C: 逃离机场 广度