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

評論