基礎(chǔ)知識(shí)之旋轉(zhuǎn)位置傳感器
1. 什么是旋轉(zhuǎn)位置傳感器?
旋轉(zhuǎn)位置傳感器是一種用于測(cè)量物體旋轉(zhuǎn)位置或角度的裝置。它可以檢測(cè)并測(cè)量物體相對(duì)于參考點(diǎn)的旋轉(zhuǎn)角度以及被測(cè)物的位置并轉(zhuǎn)換成可用輸出信號(hào)的傳感器。
本文引用地址:http://cafeforensic.com/article/202403/455994.htm
2. 旋轉(zhuǎn)位置傳感器是如何工作的?
旋轉(zhuǎn)式位置傳感器是一種用于測(cè)量物體旋轉(zhuǎn)角度的傳感器,是許多機(jī)電設(shè)備中不可缺少的元器件。它的工作原理是利用磁性和電學(xué)性質(zhì)來(lái)測(cè)量旋轉(zhuǎn)角度,具有高精度、高可靠性等優(yōu)點(diǎn)。其中,最常用的技術(shù)是使用旋轉(zhuǎn)磁編碼盤(pán)和集線(xiàn)器,將旋轉(zhuǎn)角度轉(zhuǎn)換為數(shù)字信號(hào)輸出到控制器進(jìn)行處理。
2.1 按傳感器的刻孔方式不同分
就是每轉(zhuǎn)過(guò)單位的角度就發(fā)出一個(gè)脈沖信號(hào)(也有發(fā)正余弦信號(hào),然后對(duì)其進(jìn)行細(xì)分,斬波出頻率更高的脈沖),通常為A相、B相、Z相輸出,A相、B相為相互延遲1/4周期的脈沖輸出,根據(jù)延遲關(guān)系可以區(qū)別正反轉(zhuǎn),而且通過(guò)取A相、B相的上升和下降沿可以進(jìn)行2或4倍頻;Z相為單圈脈沖,即每圈發(fā)出一個(gè)脈沖。
我們通常用的是增量型編碼器,可將旋轉(zhuǎn)編碼器的輸出脈沖信號(hào)直接輸入給PLC,利用PLC的高速計(jì)數(shù)器對(duì)其脈沖信號(hào)進(jìn)行計(jì)數(shù),以獲得測(cè)量結(jié)果。不同型號(hào)的旋轉(zhuǎn)編碼器,其輸出脈沖的相數(shù)也不同,有的旋轉(zhuǎn)編碼器輸出A、B、Z三相脈沖,有的只有A、B相兩相,最簡(jiǎn)單的只有A相。
編碼器有5條引線(xiàn),其中3條是脈沖輸出線(xiàn),1條是COM端線(xiàn),1條是電源線(xiàn)(OC門(mén)輸出型)。編碼器的電源可以是外接電源,也可直接使用PLC的DC24V電源。電源“-”端要與編碼器的COM端連接,“+ ”與編碼器的電源端連接。編碼器的COM端與PLC輸入COM端連接,A、B、Z兩相脈沖輸出線(xiàn)直接與PLC的輸入端連接,A、B為相差90度的脈沖,Z相信號(hào)在編碼器旋轉(zhuǎn)一圈只有一個(gè)脈沖,通常用來(lái)做零點(diǎn)的依據(jù),連接時(shí)要注意PLC輸入的響應(yīng)時(shí)間。旋轉(zhuǎn)編碼器還有一條屏蔽線(xiàn),使用時(shí)要將屏蔽線(xiàn)接地,提高抗干擾性。
就是對(duì)應(yīng)一圈,每個(gè)基準(zhǔn)的角度發(fā)出一個(gè)唯一與該角度對(duì)應(yīng)二進(jìn)制的數(shù)值,通過(guò)外部記圈器件可以進(jìn)行多個(gè)位置的記錄和測(cè)量。
由于A、B兩相相差90度,可通過(guò)比較A相在前還是B相在前,以判別編碼器的正轉(zhuǎn)與反轉(zhuǎn),通過(guò)零位脈沖,可獲得編碼器的零位參考位。編碼器碼盤(pán)的材料有玻璃、金屬、塑料,玻璃碼盤(pán)是在玻璃上沉積很薄的刻線(xiàn),其熱穩(wěn)定性好,精度高,金屬碼盤(pán)直接以通和不通刻線(xiàn),不易碎,但由于金屬有一定的厚度,精度就有限制,其熱穩(wěn)定性就要比玻璃的差一個(gè)數(shù)量級(jí),塑料碼盤(pán)是經(jīng)濟(jì)型的,其成本低,但精度、熱穩(wěn)定性、壽命均要差一些。
分辨率—編碼器以每旋轉(zhuǎn)360度提供多少的通或暗刻線(xiàn)稱(chēng)為分辨率,也稱(chēng)解析分度、或直接稱(chēng)多少線(xiàn),一般在每轉(zhuǎn)分度5~10000線(xiàn)
2.2 按傳感器組成的材料分
磁性旋轉(zhuǎn)傳感器是利用磁性元件實(shí)現(xiàn)測(cè)量的傳感器。其工作原理是將磁性元件固定在被測(cè)物體上,當(dāng)被測(cè)物體旋轉(zhuǎn)時(shí),磁性元件也跟隨旋轉(zhuǎn),產(chǎn)生磁場(chǎng)變化。傳感器內(nèi)部的磁敏電阻感應(yīng)到這一磁場(chǎng)變化,并產(chǎn)生電壓信號(hào)輸出。通過(guò)測(cè)量電壓信號(hào)的大小和方向,就可以計(jì)算出被測(cè)物體的旋轉(zhuǎn)角度。
霍爾效應(yīng)式轉(zhuǎn)速傳感器和曲軸位置傳感器是一種利用霍爾效應(yīng)的信號(hào)發(fā)生器?;魻栃盘?hào)發(fā)生器安裝在分電器內(nèi),與分火頭同軸,由封裝的霍爾芯片和永久磁鐵作成整體固定在分電器盤(pán)上。觸發(fā)葉輪上的缺口數(shù)和發(fā)動(dòng)機(jī)氣缸數(shù)相同。當(dāng)觸發(fā)葉輪上的葉片進(jìn)入永久磁鐵與霍爾元件之間,霍爾觸發(fā)器的磁場(chǎng)被葉片旁路,這時(shí)不產(chǎn)生霍爾電壓,傳感器無(wú)輸出信號(hào);當(dāng)觸發(fā)葉輪上的缺口部分進(jìn)入永久磁鐵和霍爾元件之間時(shí),磁力線(xiàn)進(jìn)入霍爾元件,霍爾電壓升高,傳感器輸出電壓信號(hào)。
光電旋轉(zhuǎn)傳感器是通過(guò)光電元件實(shí)現(xiàn)測(cè)量的傳感器。其工作原理是將旋轉(zhuǎn)物體上的刻度盤(pán)固定在光電元件上方,當(dāng)旋轉(zhuǎn)物體旋轉(zhuǎn)時(shí),刻度盤(pán)上的條紋或孔洞會(huì)使光束發(fā)生變化,光電元件感應(yīng)到這一變化并產(chǎn)生電信號(hào)輸出。通過(guò)測(cè)量電信號(hào)的大小和方向,就可以計(jì)算出被測(cè)物體的旋轉(zhuǎn)角度。
3. 如何應(yīng)用旋轉(zhuǎn)位置傳感器?
旋轉(zhuǎn)式位置傳感器廣泛應(yīng)用于工業(yè)自動(dòng)化、航空航天、汽車(chē)、醫(yī)療設(shè)備等領(lǐng)域。 例如,在機(jī)床中,旋轉(zhuǎn)式位置傳感器可以用于測(cè)量工件的旋轉(zhuǎn)角度,實(shí)現(xiàn)工件的定位和控制;在汽車(chē)中,旋轉(zhuǎn)式位置傳感器可以用于測(cè)量轉(zhuǎn)向角度和車(chē)速,實(shí)現(xiàn)車(chē)輛的穩(wěn)定性和安全性控制。 旋轉(zhuǎn)式位置傳感器是一種重要的傳感器元器件,可以實(shí)現(xiàn)物體旋轉(zhuǎn)位置角度的高精度測(cè)量。
3.1 應(yīng)用領(lǐng)域
1、工業(yè)機(jī)械、工程機(jī)械建筑設(shè)備、石化設(shè)備、醫(yī)療設(shè)備、航空航天儀器儀表、國(guó)防工業(yè)等旋轉(zhuǎn)速度和角度的測(cè)量;
2、汽車(chē)電子腳踩油門(mén)角位移、方向盤(pán)位置、座椅位置、前大燈位置;
3、自動(dòng)化機(jī)器人、運(yùn)動(dòng)控制、旋轉(zhuǎn)電機(jī)轉(zhuǎn)動(dòng)和控制。
3.2 電位位置傳感器的簡(jiǎn)單應(yīng)用
所有“位置傳感器”中最常用的是電位器,因?yàn)樗且环N便宜且易于使用的位置傳感器。它有一個(gè)與機(jī)械軸相連的觸點(diǎn),該機(jī)械軸的運(yùn)動(dòng)可以是有角度的(旋轉(zhuǎn)的)或線(xiàn)性的(滑塊型),這會(huì)導(dǎo)致滑塊和兩個(gè)端部連接之間的電阻值發(fā)生變化,從而產(chǎn)生電信號(hào)輸出在電阻軌道上的實(shí)際抽頭位置與其電阻值之間具有比例關(guān)系。換句話(huà)說(shuō),阻力與位置成正比。
電位器有多種設(shè)計(jì)和尺寸,例如常用的圓形旋轉(zhuǎn)類(lèi)型或較長(zhǎng)且扁平的線(xiàn)性滑塊類(lèi)型。當(dāng)用作位置傳感器時(shí),可移動(dòng)物體直接連接到電位計(jì)的旋轉(zhuǎn)軸或滑塊。
直流參考電壓施加在形成電阻元件的兩個(gè)外部固定連接上。輸出電壓信號(hào)取自滑動(dòng)觸點(diǎn)的抽頭端子,如下圖所示。
電位器結(jié)構(gòu)圖
這種配置產(chǎn)生與軸位置成比例的電位或分壓器類(lèi)型的電路輸出。然后,例如,如果在電位器的電阻元件上施加 10v 的電壓,則最大輸出電壓將等于 10 伏的電源電壓,最小輸出電壓等于 0 伏。
然后電位器抽頭將輸出信號(hào)在 0 到 10 伏之間變化,其中 5 伏表示抽頭或滑塊處于其中間位置或中心位置。電位器的輸出信號(hào) (Vout) 在沿電阻軌道移動(dòng)時(shí)取自中心游標(biāo)連接,并且與軸的角位置成正比。
簡(jiǎn)單的位置檢測(cè)電路示例
雖然電阻式電位器位置傳感器具有許多優(yōu)點(diǎn):成本低、技術(shù)含量低、易于使用等,但作為位置傳感器,它們也有許多缺點(diǎn):運(yùn)動(dòng)部件磨損、精度低、可重復(fù)性低和頻率響應(yīng)有限。
3.3 旋轉(zhuǎn)位置傳感器在工業(yè)自動(dòng)化、汽車(chē)、機(jī)器人、航空等領(lǐng)域的實(shí)際應(yīng)用
在重載設(shè)備和其他車(chē)輛中,霍爾效應(yīng)旋轉(zhuǎn)位置傳感器能夠取代腳踏板與發(fā)動(dòng)機(jī)之間的機(jī)械電纜連接。機(jī)械電纜會(huì)抻拉或腐蝕,需要定期維護(hù)和重新校準(zhǔn)。取代機(jī)械電纜,能改善發(fā)動(dòng)機(jī)控制系統(tǒng)的響應(yīng)和車(chē)輛排放,提高可靠性并減少超重。這種電子油門(mén)系統(tǒng)比電纜連接系統(tǒng)更安全,更經(jīng)濟(jì)。
霍爾效應(yīng)旋轉(zhuǎn)位置傳感器也可用在公交車(chē)和重卡離地高度系統(tǒng)中,感應(yīng)懸架系統(tǒng)的行程。公交車(chē)?yán)米詣?dòng)踏板可降低其離地高度,方便乘客上下車(chē)。在此應(yīng)用的兩端都可使用霍爾效應(yīng)旋轉(zhuǎn)位置傳感器:一個(gè)傳感器監(jiān)控控制桿的位置,第二個(gè)傳感器部署在懸架臂或連桿上來(lái)監(jiān)控離地高度。
精確的位置感應(yīng)可確認(rèn)車(chē)輛是否處于適合應(yīng)用系統(tǒng)要求的正確高度,從而改進(jìn)車(chē)輛上下通行的便利性。大型拖車(chē)也可利用霍爾效應(yīng)旋轉(zhuǎn)位置傳感器來(lái)監(jiān)測(cè)拖車(chē)高度,提高倉(cāng)庫(kù)停靠對(duì)接的效率。
4. 主要的旋轉(zhuǎn)位置傳感器供應(yīng)商
廠商 | 主營(yíng)業(yè)務(wù) |
泰科電子 TE Connectivity | 解決方案代理商,產(chǎn)品、服務(wù) |
霍尼韋爾 Honeywell | 航空產(chǎn)品和服務(wù)、樓宇和工業(yè)控制技術(shù)、以及特性材料 |
百能云芯 Bourns | 電子元器件、芯片 |
森薩塔科技 Sensata | 傳感器的解決方案,關(guān)鍵型產(chǎn)品 |
力特Littelfuse | 模塊化產(chǎn)品、解決方案 |
5. 參考案例
5.1 設(shè)計(jì)與方案分析
本次設(shè)計(jì)需要通過(guò)RP2040模塊驅(qū)動(dòng)一個(gè)旋轉(zhuǎn)位置傳感器,這里采用的是一個(gè)方向脈沖型信號(hào)的512線(xiàn)編碼器,RP2040通過(guò)脈沖捕獲,檢測(cè)編碼器輸出的信號(hào),將編碼器輸出的信號(hào)顯示于0.96的顯示屏,同時(shí)12路LED燈用于記數(shù)編碼器的旋轉(zhuǎn)圈數(shù),此外通過(guò)串口通信的方式將編碼器數(shù)據(jù)發(fā)送至上位機(jī),方便后續(xù)的數(shù)據(jù)處理與系統(tǒng)開(kāi)發(fā),其本次設(shè)計(jì)的系統(tǒng)架構(gòu)框圖如圖所示。
5.2 系統(tǒng)硬件框圖及工作原理
本次研究設(shè)計(jì)的傳感器模塊為512線(xiàn)旋轉(zhuǎn)位置傳感器-編碼器模塊,通過(guò)編碼器采集到的數(shù)據(jù)發(fā)送給RP2040模塊,RP2040通過(guò)外接OLED顯示屏與WS1812LED燈板。此外RP2040通過(guò)SPI硬件協(xié)議驅(qū)動(dòng)OLED顯示屏用于實(shí)時(shí)顯示編碼器旋轉(zhuǎn)的位置、方向等數(shù)據(jù),LED燈板則用于統(tǒng)計(jì)編碼器旋轉(zhuǎn)的圈數(shù),同時(shí)將數(shù)據(jù)實(shí)時(shí)發(fā)送到上位機(jī),便后后續(xù)的數(shù)據(jù)處理與系統(tǒng)開(kāi)發(fā),其中系統(tǒng)硬件框圖如圖所示。
此外其中通過(guò)查閱各類(lèi)資料與相關(guān)數(shù)據(jù)手冊(cè)后得出編碼器在旋轉(zhuǎn)過(guò)程中,POUT將產(chǎn)生特定的脈沖信號(hào),DIR端口將輸出0或1的高低電瓶以表示旋轉(zhuǎn)的方向,PR2040通過(guò)IO口中斷形式捕獲脈沖信號(hào),其中編碼器工作原理及信號(hào)如下圖所示。
實(shí)際編碼器上電后,通過(guò)示波器測(cè)試模塊的DIR引腳輸出和OUT輸出信號(hào),觀測(cè)到的現(xiàn)象與數(shù)據(jù)手冊(cè)一致,實(shí)際測(cè)試表明該編碼器在上電后能正常工作,其中示波器測(cè)試編碼器輸出信號(hào)波形如下圖所示。
5.3 系統(tǒng)軟件設(shè)計(jì)
首先在上電后對(duì)OLED顯示屏、WS2812以及串口進(jìn)行初始化化配置,使其具有基礎(chǔ)的數(shù)據(jù)顯示與發(fā)送功能,其次開(kāi)啟IO口中斷模式,使其通過(guò)中斷的方式快速檢測(cè)編碼器產(chǎn)生的脈沖信號(hào)并進(jìn)行捕獲,通過(guò)中斷的次數(shù)計(jì)算編碼器的當(dāng)前位置與轉(zhuǎn)過(guò)的圈數(shù)以及旋轉(zhuǎn)方向,檢測(cè)完成后用過(guò)SPI圖像協(xié)議以及RP2040特帶的PIO口將數(shù)據(jù)顯示于OLED顯示屏與LED燈板,此外將數(shù)據(jù)通過(guò)串口的新式發(fā)送到上位機(jī)便于數(shù)據(jù)查看,其中系統(tǒng)軟件工作流程圖如圖所示。
5.4 系統(tǒng)功能測(cè)試及總結(jié)
通過(guò)對(duì)系統(tǒng)硬件模塊的組成、軟件代碼的編寫(xiě),以及系統(tǒng)的調(diào)試,初步完成對(duì)編碼器數(shù)據(jù)的采集,實(shí)時(shí)的將編碼器的旋轉(zhuǎn)位置,方向以及旋轉(zhuǎn)的圈數(shù)顯示與OLED顯示屏,同時(shí)將數(shù)據(jù)發(fā)送至上位機(jī)串口調(diào)試助手,其中串口調(diào)制助手界面以及實(shí)物OLED顯示屏顯示數(shù)據(jù)如下圖所示。
通過(guò)對(duì)編碼器的研究與數(shù)據(jù)采集,初步了解了編碼器的工作原理與實(shí)際應(yīng)用,在日常生活中,可將編碼器應(yīng)用與智能小車(chē)等一系列智能運(yùn)動(dòng)的控制中,通過(guò)車(chē)輪的轉(zhuǎn)動(dòng)帶動(dòng)編碼器的來(lái)捕獲小車(chē)的運(yùn)動(dòng)方向以及更加精確的控制小車(chē)的速度,以下為編碼器在大學(xué)生智能汽車(chē)競(jìng)賽中的實(shí)際圖片,當(dāng)然編碼器的應(yīng)用遠(yuǎn)不止如此,更是涉及到身邊的工業(yè)機(jī)械、工程機(jī)械建筑設(shè)備、石化設(shè)備、醫(yī)療設(shè)備、航空航天儀器儀表、國(guó)防工業(yè)等旋轉(zhuǎn)速度和角度的測(cè)量。
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")
#記數(shù)變量定義
pcnt = 0 #脈沖計(jì)數(shù)器,用于計(jì)算脈沖數(shù)量
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
#脈沖捕獲中斷函數(shù)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)
#設(shè)置脈沖捕獲
_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))
評(píng)論