日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

树莓派基础实验26:旋转编码器实验

發布時間:2023/12/16 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树莓派基础实验26:旋转编码器实验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、介紹

?? 旋轉編碼器是一種機電裝置,可將軸或軸的角位置或運動,轉換為模擬或數字代碼。旋轉編碼器通常放置在垂直于軸的一側。旋轉編碼器用作檢測自動化領域中的角度,速度,長度,位置和加速度的傳感器。


二、組件

Raspberry Pi 3主板*1

樹莓派電源*1

40P軟排線*1

旋轉編碼器傳感器模塊*1

面包板*1

跳線若干

三、實驗原理

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

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

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

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

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

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

??本次實驗中,順時針旋轉時,打印的值變大;逆時針旋轉,數值減小;按下旋轉按鈕時,復位到初始狀態,即從0開始計數。

四、實驗步驟

??第1步: 連接電路。

樹莓派T型轉接板 (BCM)旋轉編碼器模塊
GPIO0G17CLK
GPIO1G18DT
GPIO2G27SW
5V5VVCC
GNDGNDGND

??第2步: 編寫控制程序。順時針旋轉時,打印的值變大;逆時針旋轉,數值減小;按下旋轉按鈕時,復位到初始狀態,即從0開始計數。

#!/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)): #未旋轉時,GPIO.input(RoAPin)值為1,旋轉時會變為0Current_RoB_Status = GPIO.input(RoBPin) #旋轉時的當前值flag = 1if flag == 1:flag = 0if (Last_RoB_Status == 1) and (Current_RoB_Status == 0):globalCounter = globalCounter + 1 #順時針旋轉,角位移增大if (Last_RoB_Status == 0) and (Current_RoB_Status == 1):globalCounter = globalCounter - 1 #逆時針旋轉,數值減小def btnISR(channel):global globalCounterglobalCounter = 0def loop():global globalCountertmp = 0 # Rotary TemperaryGPIO.add_event_detect(BtnPin, GPIO.FALLING, callback=btnISR)#當按下按鈕時,調用回調函數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()

??

總結

以上是生活随笔為你收集整理的树莓派基础实验26:旋转编码器实验的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。