絕對編碼器中的傳感器輸出格雷碼序列,需要一些復(fù)雜的轉(zhuǎn)換方法才能正確使用。本文展示了如何獲取絕對編碼器使用的格雷碼并將其轉(zhuǎn)換為二進(jìn)制。
對于大多數(shù)使用電機(jī)和伺服機(jī)構(gòu)的旋轉(zhuǎn)運(yùn)動,反饋至關(guān)重要。這種反饋通常采用編碼器的形式。對于許多編碼器,輸出是“絕對的”,這意味著可以隨時測量位置的精確度數(shù),但它有一個缺點(diǎn):它需要大量傳感器。這些傳感器經(jīng)常輸出格雷碼序列,需要一些復(fù)雜的轉(zhuǎn)換方法才能正確使用。
二進(jìn)制如何導(dǎo)致編碼器出現(xiàn)問題
電機(jī)和其他旋轉(zhuǎn)運(yùn)動設(shè)備最常見的反饋形式是編碼器,它使用光(光學(xué))傳感器對著具有特定黑白圖案的旋轉(zhuǎn)盤來提供角位置數(shù)據(jù)。存在兩種主要類型的編碼器:增量式和絕對式。增量編碼器對亮/暗標(biāo)記轉(zhuǎn)換進(jìn)行計數(shù),以跟蹤在給定時間內(nèi)經(jīng)過了多少度的旋轉(zhuǎn)。
另一種編碼器是絕對型編碼器,這種編碼器經(jīng)常使用,因?yàn)樗梢詼y量與增量型相同的量,但它是由圓盤構(gòu)成的,圓盤具有從中心輻射的復(fù)雜標(biāo)記圖案。根據(jù)位置的不同,圖案是完全獨(dú)特的。它們通常有 256 到 1024 個不同的獨(dú)特圖案,均勻分布在圓圈周圍,分別表示 8 位或 10 位輸出。
位數(shù)等于跟蹤模式的傳感器數(shù)量,而這個數(shù)量的傳感器可能會為單個處理器創(chuàng)建一個耗時的讀取任務(wù)。為了最大程度地減少讀取錯誤,磁盤通常具有一種模式,該模式僅允許一個傳感器讀數(shù)在磁盤旋轉(zhuǎn)時隨時更改。
由于圖案只有暗色或亮色,這為每個傳感器提供了開/關(guān)或“二進(jìn)制”輸出。在典型的二進(jìn)制模式中,位序列直接對應(yīng)于一個等效的十進(jìn)制數(shù),該十進(jìn)制數(shù)會在磁盤周圍增加,從 0 到 256(或最多 1024)。標(biāo)準(zhǔn)二進(jìn)制序列的唯一問題是多個位同時改變許多計數(shù)。每次發(fā)生這種情況時,都可能會遇到讀取錯誤。
下表顯示了這種情況發(fā)生的頻率。
如圖所示,這種可能的錯誤每隔一個計數(shù)就會發(fā)生一次,這是完全不可接受的。
為什么會出現(xiàn)這樣的問題?
作為這個錯誤嚴(yán)重性的一個例子,想象一下從第九種模式到第十種模式的轉(zhuǎn)變。四個傳感器最初會讀取 1001,然后在電機(jī)旋轉(zhuǎn)時變?yōu)?1010。
控制器會以固定的快速間隔讀取傳感器,因此它可能會在模式仍為 9 時開始讀取,因此前三個傳感器可能會讀取 1 0 和 0。然后,就在它讀取最后一個傳感器之前,模式步驟最多 10 并且最終傳感器變?yōu)?0。
控制器會將整個序列串在一起為 1000。但看起來它只是倒退了,回到了 8!實(shí)際情況并非如此。
另一方面,如果只有一個位從一個計數(shù)轉(zhuǎn)換到下一個計數(shù),控制器將看到變化并識別運(yùn)動,或者它不會看到變化并識別出還沒有發(fā)生運(yùn)動。格雷碼是這種一次只更改一次的系統(tǒng)序列,但對于熟悉標(biāo)準(zhǔn)二進(jìn)制的專業(yè)人士來說,這種模式似乎很陌生。
雖然它與標(biāo)準(zhǔn)二進(jìn)制不匹配,但格雷碼到二進(jìn)制的計算可以非常簡單地完成,這里有一些標(biāo)準(zhǔn)梯形邏輯和使用 C++ 的結(jié)構(gòu)化文本中的示例。
梯形邏輯轉(zhuǎn)換
要將格雷碼位轉(zhuǎn)換為正確的二進(jìn)制位,每個格雷碼傳感器必須對應(yīng)一個布爾值,或者直接來自傳感器,或者作為整數(shù)的一部分。
此示例是用 Automation Direct 的梯形圖編程軟件編寫的,并假設(shè)“Sensor_1”是最低有效位 (LSB),傳感器沿著編碼器磁盤的外邊緣。共有八個傳感器(8 位)增加到編碼器的中心。
‘Binary_Number:1’ 是用于存儲標(biāo)準(zhǔn)二進(jìn)制等效值的整數(shù)的對應(yīng)位。對于其他軟件,例如 Rockwell 的 RSLogix,這個整數(shù)位可能看起來像 Binary_Number.0,其中 Binary_Number 是一個 INT 類型標(biāo)記,從位 0 開始。
第 1 行 - 為了正確轉(zhuǎn)換,最高有效位 (MSB) 即 Sensor_8 保持不變。
第 2 行 - 對于下一個有效位,在 Sensor_8 和 Sensor_7 之間使用“異或”的邏輯比較。如果 Sensor_7 和 _8 相同,則返回 0,如果 Sensor_7 和 _8 不同,則返回 1。
第 3 到 8 行 - 對于每個剩余位,我們繼續(xù)在前一個位和下一個 Sensor 值之間使用“異或”。
如果編碼器是 10 位的,則有 10 行,前兩行將使用 Sensor_10 和 _9 并下降,直到最后使用最后一個傳感器。
圖 1. Automation Direct 梯形圖編程軟件中使用的梯形邏輯示例。
所有前面的邏輯線都可以包裝到單個自定義指令塊或子程序中以簡化過程。
結(jié)構(gòu)化文本轉(zhuǎn)換
這個例子只是部分的,因?yàn)橛懈鞣N各樣的語言、語法和應(yīng)用程序。核心目標(biāo)仍然是將來自八個傳感器的傳感器讀數(shù)轉(zhuǎn)換為等效的二進(jìn)制數(shù)。
對于基于 C 的語言,產(chǎn)生單個位的異或 (XOR) 是 !=。MSB 與傳感器值相同,第二位是兩個傳感器的 XOR,其余每個位是前一位和下一個傳感器的 XOR。
無效轉(zhuǎn)換(){
Binary_Number_8 = Sensor_8;
Binary_Number_7 = Sensor_8 != Sensor_7;
Binary_Number_6 = Binary_Number_7 != Sensor_6;
Binary_Number_5 = Binary_Number_6 != Sensor_5;
Binary_Number_4 = Binary_Number_5 != Sensor_4;
Binary_Number_3 = Binary_Number_4 != Sensor_3;
Binary_Number_2 = Binary_Number_3 != Sensor_2;
Binary_Number_1 = Binary_Number_2 != Sensor_1;
}
剩下的步驟是將 Binary_Number 位轉(zhuǎn)換為適合應(yīng)用程序的整數(shù)。請注意,不同的語言可能遵循不同的程序。此示例僅用于概述該過程的外觀。
-
傳感器
+關(guān)注
關(guān)注
2553文章
51390瀏覽量
756569 -
編碼器
+關(guān)注
關(guān)注
45文章
3667瀏覽量
135237 -
絕對編碼器
+關(guān)注
關(guān)注
0文章
14瀏覽量
6988
發(fā)布評論請先 登錄
相關(guān)推薦
評論