基礎知識之旋轉位置傳感器
1. 什么是旋轉位置傳感器?
旋轉位置傳感器是一種用于測量物體旋轉位置或角度的裝置。它可以檢測并測量物體相對于參考點的旋轉角度以及被測物的位置并轉換成可用輸出信號的傳感器。
本文引用地址:http://www.ex-cimer.com/article/202403/455994.htm
2. 旋轉位置傳感器是如何工作的?
旋轉式位置傳感器是一種用于測量物體旋轉角度的傳感器,是許多機電設備中不可缺少的元器件。它的工作原理是利用磁性和電學性質來測量旋轉角度,具有高精度、高可靠性等優點。其中,最常用的技術是使用旋轉磁編碼盤和集線器,將旋轉角度轉換為數字信號輸出到控制器進行處理。
2.1 按傳感器的刻孔方式不同分
就是每轉過單位的角度就發出一個脈沖信號(也有發正余弦信號,然后對其進行細分,斬波出頻率更高的脈沖),通常為A相、B相、Z相輸出,A相、B相為相互延遲1/4周期的脈沖輸出,根據延遲關系可以區別正反轉,而且通過取A相、B相的上升和下降沿可以進行2或4倍頻;Z相為單圈脈沖,即每圈發出一個脈沖。
我們通常用的是增量型編碼器,可將旋轉編碼器的輸出脈沖信號直接輸入給PLC,利用PLC的高速計數器對其脈沖信號進行計數,以獲得測量結果。不同型號的旋轉編碼器,其輸出脈沖的相數也不同,有的旋轉編碼器輸出A、B、Z三相脈沖,有的只有A、B相兩相,最簡單的只有A相。
編碼器有5條引線,其中3條是脈沖輸出線,1條是COM端線,1條是電源線(OC門輸出型)。編碼器的電源可以是外接電源,也可直接使用PLC的DC24V電源。電源“-”端要與編碼器的COM端連接,“+ ”與編碼器的電源端連接。編碼器的COM端與PLC輸入COM端連接,A、B、Z兩相脈沖輸出線直接與PLC的輸入端連接,A、B為相差90度的脈沖,Z相信號在編碼器旋轉一圈只有一個脈沖,通常用來做零點的依據,連接時要注意PLC輸入的響應時間。旋轉編碼器還有一條屏蔽線,使用時要將屏蔽線接地,提高抗干擾性。
就是對應一圈,每個基準的角度發出一個唯一與該角度對應二進制的數值,通過外部記圈器件可以進行多個位置的記錄和測量。
由于A、B兩相相差90度,可通過比較A相在前還是B相在前,以判別編碼器的正轉與反轉,通過零位脈沖,可獲得編碼器的零位參考位。編碼器碼盤的材料有玻璃、金屬、塑料,玻璃碼盤是在玻璃上沉積很薄的刻線,其熱穩定性好,精度高,金屬碼盤直接以通和不通刻線,不易碎,但由于金屬有一定的厚度,精度就有限制,其熱穩定性就要比玻璃的差一個數量級,塑料碼盤是經濟型的,其成本低,但精度、熱穩定性、壽命均要差一些。
分辨率—編碼器以每旋轉360度提供多少的通或暗刻線稱為分辨率,也稱解析分度、或直接稱多少線,一般在每轉分度5~10000線
2.2 按傳感器組成的材料分
磁性旋轉傳感器是利用磁性元件實現測量的傳感器。其工作原理是將磁性元件固定在被測物體上,當被測物體旋轉時,磁性元件也跟隨旋轉,產生磁場變化。傳感器內部的磁敏電阻感應到這一磁場變化,并產生電壓信號輸出。通過測量電壓信號的大小和方向,就可以計算出被測物體的旋轉角度。
霍爾效應式轉速傳感器和曲軸位置傳感器是一種利用霍爾效應的信號發生器?;魻栃盘柊l生器安裝在分電器內,與分火頭同軸,由封裝的霍爾芯片和永久磁鐵作成整體固定在分電器盤上。觸發葉輪上的缺口數和發動機氣缸數相同。當觸發葉輪上的葉片進入永久磁鐵與霍爾元件之間,霍爾觸發器的磁場被葉片旁路,這時不產生霍爾電壓,傳感器無輸出信號;當觸發葉輪上的缺口部分進入永久磁鐵和霍爾元件之間時,磁力線進入霍爾元件,霍爾電壓升高,傳感器輸出電壓信號。
光電旋轉傳感器是通過光電元件實現測量的傳感器。其工作原理是將旋轉物體上的刻度盤固定在光電元件上方,當旋轉物體旋轉時,刻度盤上的條紋或孔洞會使光束發生變化,光電元件感應到這一變化并產生電信號輸出。通過測量電信號的大小和方向,就可以計算出被測物體的旋轉角度。
3. 如何應用旋轉位置傳感器?
旋轉式位置傳感器廣泛應用于工業自動化、航空航天、汽車、醫療設備等領域。 例如,在機床中,旋轉式位置傳感器可以用于測量工件的旋轉角度,實現工件的定位和控制;在汽車中,旋轉式位置傳感器可以用于測量轉向角度和車速,實現車輛的穩定性和安全性控制。 旋轉式位置傳感器是一種重要的傳感器元器件,可以實現物體旋轉位置角度的高精度測量。
3.1 應用領域
1、工業機械、工程機械建筑設備、石化設備、醫療設備、航空航天儀器儀表、國防工業等旋轉速度和角度的測量;
2、汽車電子腳踩油門角位移、方向盤位置、座椅位置、前大燈位置;
3、自動化機器人、運動控制、旋轉電機轉動和控制。
3.2 電位位置傳感器的簡單應用
所有“位置傳感器”中最常用的是電位器,因為它是一種便宜且易于使用的位置傳感器。它有一個與機械軸相連的觸點,該機械軸的運動可以是有角度的(旋轉的)或線性的(滑塊型),這會導致滑塊和兩個端部連接之間的電阻值發生變化,從而產生電信號輸出在電阻軌道上的實際抽頭位置與其電阻值之間具有比例關系。換句話說,阻力與位置成正比。
電位器有多種設計和尺寸,例如常用的圓形旋轉類型或較長且扁平的線性滑塊類型。當用作位置傳感器時,可移動物體直接連接到電位計的旋轉軸或滑塊。
直流參考電壓施加在形成電阻元件的兩個外部固定連接上。輸出電壓信號取自滑動觸點的抽頭端子,如下圖所示。
電位器結構圖
這種配置產生與軸位置成比例的電位或分壓器類型的電路輸出。然后,例如,如果在電位器的電阻元件上施加 10v 的電壓,則最大輸出電壓將等于 10 伏的電源電壓,最小輸出電壓等于 0 伏。
然后電位器抽頭將輸出信號在 0 到 10 伏之間變化,其中 5 伏表示抽頭或滑塊處于其中間位置或中心位置。電位器的輸出信號 (Vout) 在沿電阻軌道移動時取自中心游標連接,并且與軸的角位置成正比。
簡單的位置檢測電路示例
雖然電阻式電位器位置傳感器具有許多優點:成本低、技術含量低、易于使用等,但作為位置傳感器,它們也有許多缺點:運動部件磨損、精度低、可重復性低和頻率響應有限。
3.3 旋轉位置傳感器在工業自動化、汽車、機器人、航空等領域的實際應用
在重載設備和其他車輛中,霍爾效應旋轉位置傳感器能夠取代腳踏板與發動機之間的機械電纜連接。機械電纜會抻拉或腐蝕,需要定期維護和重新校準。取代機械電纜,能改善發動機控制系統的響應和車輛排放,提高可靠性并減少超重。這種電子油門系統比電纜連接系統更安全,更經濟。
霍爾效應旋轉位置傳感器也可用在公交車和重卡離地高度系統中,感應懸架系統的行程。公交車利用自動踏板可降低其離地高度,方便乘客上下車。在此應用的兩端都可使用霍爾效應旋轉位置傳感器:一個傳感器監控控制桿的位置,第二個傳感器部署在懸架臂或連桿上來監控離地高度。
精確的位置感應可確認車輛是否處于適合應用系統要求的正確高度,從而改進車輛上下通行的便利性。大型拖車也可利用霍爾效應旋轉位置傳感器來監測拖車高度,提高倉庫??繉拥男?。
4. 主要的旋轉位置傳感器供應商
廠商 | 主營業務 |
泰科電子 TE Connectivity | 解決方案代理商,產品、服務 |
霍尼韋爾 Honeywell | 航空產品和服務、樓宇和工業控制技術、以及特性材料 |
百能云芯 Bourns | 電子元器件、芯片 |
森薩塔科技 Sensata | 傳感器的解決方案,關鍵型產品 |
力特Littelfuse | 模塊化產品、解決方案 |
5. 參考案例
5.1 設計與方案分析
本次設計需要通過RP2040模塊驅動一個旋轉位置傳感器,這里采用的是一個方向脈沖型信號的512線編碼器,RP2040通過脈沖捕獲,檢測編碼器輸出的信號,將編碼器輸出的信號顯示于0.96的顯示屏,同時12路LED燈用于記數編碼器的旋轉圈數,此外通過串口通信的方式將編碼器數據發送至上位機,方便后續的數據處理與系統開發,其本次設計的系統架構框圖如圖所示。
5.2 系統硬件框圖及工作原理
本次研究設計的傳感器模塊為512線旋轉位置傳感器-編碼器模塊,通過編碼器采集到的數據發送給RP2040模塊,RP2040通過外接OLED顯示屏與WS1812LED燈板。此外RP2040通過SPI硬件協議驅動OLED顯示屏用于實時顯示編碼器旋轉的位置、方向等數據,LED燈板則用于統計編碼器旋轉的圈數,同時將數據實時發送到上位機,便后后續的數據處理與系統開發,其中系統硬件框圖如圖所示。
此外其中通過查閱各類資料與相關數據手冊后得出編碼器在旋轉過程中,POUT將產生特定的脈沖信號,DIR端口將輸出0或1的高低電瓶以表示旋轉的方向,PR2040通過IO口中斷形式捕獲脈沖信號,其中編碼器工作原理及信號如下圖所示。
實際編碼器上電后,通過示波器測試模塊的DIR引腳輸出和OUT輸出信號,觀測到的現象與數據手冊一致,實際測試表明該編碼器在上電后能正常工作,其中示波器測試編碼器輸出信號波形如下圖所示。
5.3 系統軟件設計
首先在上電后對OLED顯示屏、WS2812以及串口進行初始化化配置,使其具有基礎的數據顯示與發送功能,其次開啟IO口中斷模式,使其通過中斷的方式快速檢測編碼器產生的脈沖信號并進行捕獲,通過中斷的次數計算編碼器的當前位置與轉過的圈數以及旋轉方向,檢測完成后用過SPI圖像協議以及RP2040特帶的PIO口將數據顯示于OLED顯示屏與LED燈板,此外將數據通過串口的新式發送到上位機便于數據查看,其中系統軟件工作流程圖如圖所示。
5.4 系統功能測試及總結
通過對系統硬件模塊的組成、軟件代碼的編寫,以及系統的調試,初步完成對編碼器數據的采集,實時的將編碼器的旋轉位置,方向以及旋轉的圈數顯示與OLED顯示屏,同時將數據發送至上位機串口調試助手,其中串口調制助手界面以及實物OLED顯示屏顯示數據如下圖所示。
通過對編碼器的研究與數據采集,初步了解了編碼器的工作原理與實際應用,在日常生活中,可將編碼器應用與智能小車等一系列智能運動的控制中,通過車輪的轉動帶動編碼器的來捕獲小車的運動方向以及更加精確的控制小車的速度,以下為編碼器在大學生智能汽車競賽中的實際圖片,當然編碼器的應用遠不止如此,更是涉及到身邊的工業機械、工程機械建筑設備、石化設備、醫療設備、航空航天儀器儀表、國防工業等旋轉速度和角度的測量。
5.5 附件程序
from machine import Pin, SPI, ADC, UART
from ssd1306 import SSD1306_SPI
from astronaut import frames
from board import pin_cfg
import framebuf
import _thread
import time
import array
import rp2
#常量定義NUM_LEDS = 12 #LED number
wsLedDegree = 30 #LED light Degree
#pasoberry image
buffer = bytearray(b"x00x00x00x00x00x00x00x00x00x00x00x00x00|?x00x01x86@x80x01x01x80x80x01x11x88x80x01x05xa0x80x00x83xc1x00x00Cxe3x00x00~xfcx00x00L'x00x00x9cx11x00x00xbfxfdx00x00xe1x87x00x01xc1x83x80x02Ax82@x02Ax82@x02xc1xc2@x02xf6>xc0x01xfc=x80x01x18x18x80x01x88x10x80x00x8c!x00x00x87xf1x00x00x7fxf6x00x008x1cx00x00x0c x00x00x03xc0x00x00x00x00x00x00x00x00x00x00x00x00x00")
#記數變量定義
pcnt = 0 #脈沖計數器,用于計算脈沖數量
ledCnt = 0
circle = 0
message=''
cirLed = 0
global direction
global dircnt
dircnt = 1
#引腳定義并初始化
dire = Pin(2, Pin.IN, Pin.PULL_UP)
pout = Pin(3, Pin.IN, Pin.PULL_UP)
led1 = Pin(20, Pin.OUT)
led2 = Pin(26, Pin.OUT)
led3 = Pin(22, Pin.OUT)
led4 = Pin(21, Pin.OUT)
uart = UART(0, baudrate=115200, tx=Pin(0), rx=Pin(1), bits=8, parity=None, stop=1)
led1.off()
led2.off()
led3.off()
led4.off()
#WS1812初始化
@rp2.asm_pio(sideset_init=rp2.PIO.OUT_LOW, out_shiftdir=rp2.PIO.SHIFT_LEFT, autopull=True, pull_thresh=24)
def ws2812():
T1 = 2
T2 = 5
T3 = 3
wrap_target()
label("bitloop")
out(x, 1) .side(0) [T3 - 1]
jmp(not_x, "do_zero") .side(1) [T1 - 1]
jmp("bitloop") .side(1) [T2 - 1]
label("do_zero")
nop() .side(0) [T2 - 1]
wrap()
# Create the StateMachine with the ws2812 program, outputting on Pin(18).
sm = rp2.StateMachine(0, ws2812, freq=8_000_000, sideset_base=Pin(18))
# Start the StateMachine, it will wait for data on its FIFO.
sm.active(1)
# Display a pattern on the LEDs via an array of LED RGB values.
ar = array.array("I", [0 for _ in range(NUM_LEDS)])
# 8 blue 16 red 24 green
#oled初始化
spi1 = SPI(1, 100000, mosi=Pin(pin_cfg.spi1_mosi), sck=Pin(pin_cfg.spi1_sck))
oled = SSD1306_SPI(128, 64, spi1, Pin(pin_cfg.spi1_dc),Pin(pin_cfg.spi1_rstn), Pin(pin_cfg.spi1_cs))
oled.rotate(1)
oled.fill(0)
oled.show()
fb = framebuf.FrameBuffer(buffer, 32, 32, framebuf.MONO_HLSB)
global flag
flag = 0
for j in range(NUM_LEDS):
ar[j] = 0sm.put(ar, 16)
def dirIRQHandler(pin): global dircnt
dircnt += 1
#脈沖捕獲中斷函數def poutIQHandler(pin):
global pcnt
global ledCnt
global circle
pcnt += 1
if pcnt > 512:
pcnt = 0
circle += 1
ledCnt += 1
if ledCnt == 0:
pass
elif ledCnt == 13:
ledCnt =1
for j in range(NUM_LEDS):
ar[j] = 0
sm.put(ar, 16)
else:
ar[ledCnt-1] = wsLedDegree
sm.put(ar, 16)
def oled_thread():
global direction
while True:
oled.fill(0)
#oled.blit(fb, 96, 0)
oled.text("Raspberry Pi",5,5)
oled.text("Pcnt: ",5,20)
oled.text("Cnum: ",5,35)
oled.text("Dire: ",5,50)
oled.text(str(pcnt),50,20)
oled.text(str(circle),50,35)
oled.text(str(direction),50,50)
oled.show()
time.sleep_ms(100)
#設置脈沖捕獲
_thread.start_new_thread(oled_thread, ())
pout.irq(trigger=Pin.IRQ_RISING,handler=poutIQHandler)
dire.irq(trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING,handler=dirIRQHandler)
i=0
while True:
#pass
direction = dire.value() time.sleep_ms(50)
uart.write('pcnt: '+str(pcnt))
uart.write(' circle: '+str(circle))
uart.write(' direction: '+str(direction))
評論