Encoder SSI, Gray auswerten

OP #7548586
Lesenswert?

Guten Abend, ich möchte mit einem Mikrocontroller einen SSI Encoder mit 25 Bit Graycodierung auslesen. Die Hardware ist mir klar. Das raus takten der Psition sollte kein Problem darstellen. Was ich nicht verstehe ist was es mit dem Graycode auf sich hat? Kann mir bitte jemand erklären? Danke für die Hilfe

Moderator #7548602
Lesenswert?

Du möchtest den Graycode in gewöhnlichen Binärcode konvertieren?

Das geht ganz einfach: Hat der Code n Bits und die Graybits und die Binärbits sind jeweils von 0 (LSB) bis n-1 (MSB) durchnumeriert, dann lassen sich die Binärbits (b) aus den Graybits (g) wie folgt ermitteln:

$$\begin{align*} b_{n-1}&=g_{n-1} \\ b_i&=b_{i+1}\oplus g_i\quad\text{für $0\le i<n-1$} \end{align*}$$

⊕ ist dabei der XOR-Operator.

(Firma: matzetronics) #7548603
Lesenswert?

Hier ein praktisches Beispiel für den Sick Stegmann AG661 Encoder:

1
/* Read the Sick Stegmann Encoder AG661
2
 * This is done by bringing the clock low first - After rising the clock again,
3
 * the first bit is sent by the encoder. 24 bits are sent followed by the PF bit 
4
 * indicating a Power fail. A break with a minimum of 20 uS will reset the encoder to start
5
 * 
6
 */
7
void Read_Angle(void) {
8
uint8_t n;
9
uint32_t temp = 0;
10
  ENCODER_CLOCK_PORT &= ~(1 << ENCODER_CLOCK1_PIN);   // initial clock low
11
  _delay_us(5);
12
  for (n=0;n<25;n++) {
13
    ENCODER_CLOCK_PORT |= (1 << ENCODER_CLOCK1_PIN);  // clock high
14
    _delay_us(5);
15
    temp <<= 1;
16
    if (bit_is_set(ENCODER_PIN,ENCODER_RX1_PIN)) temp |= 1;
17
    ENCODER_CLOCK_PORT &= ~(1 << ENCODER_CLOCK1_PIN);  // clock low
18
    _delay_us(5);
19
  }
20
  ENCODER_CLOCK_PORT |= (1 << ENCODER_CLOCK1_PIN);  // clock high
21
// now convert gray to binary
22
  for (n=1;n<32;n=2*n){
23
      temp = temp ^ (temp >> n);
24
   }
25
// mask out rotation and angle
26
  rotationValue =(uint16_t) ((temp & 0x01ffe000) >> 13);
27
  angleValue =(angleValue + (uint16_t) ((temp & 0x00001ffe) >> 1)) >> 1;  
28
//  _delay_us(100);
29
}

Das differentielle Clock Signal sende ich mit einem Inverter an den Encoder. Ein Beispiel für einen Haidenhein hätte ich auch noch da.

Gast #7548616
Lesenswert?

Mein_erstes_Mal schrieb:

Was ich nicht verstehe ist was es mit dem Graycode auf sich hat?

Der Hintergrund des Graycodes: von Schritt zu Schritt, d.h. von einer Codeposition zur nächsten ändert sich jeweils nur ein einziges Bit. Genial. Sieht beim langsamen Durchdrehen des Encoders per Hand auf dem Oszilloskop sehr beeindruckend aus.

OP #7548747
Lesenswert?

Matthias S. schrieb:

Hier ein praktisches Beispiel für den Sick Stegmann AG661

// mask out rotation and angle rotationValue =(uint16_t) ((temp & 0x01ffe000) >> 13); angleValue =(angleValue + (uint16_t) ((temp & 0x00001ffe) >> 1)) >> 1; // _delay_us(100); }

Danke für das Beispiel. sind die oberen 13 Bit nicht der Multiturn Teil? und warum wird bei der Winkel berechnung nochmal 13 Bit Maskiert?

Bernd G. schrieb:

Mein_erstes_Mal schrieb:

Was ich nicht verstehe ist was es mit dem Graycode auf sich hat?

Der Hintergrund des Graycodes: von Schritt zu Schritt, d.h. von einer Codeposition zur nächsten ändert sich jeweils nur ein einziges Bit. Genial. Sieht beim langsamen Durchdrehen des Encoders per Hand auf dem Oszilloskop sehr beeindruckend aus.

Werde ich mir mal auf dem Oszilloskop ansehen, danke

Gast #7549092
Lesenswert?

Mein_erstes_Mal schrieb:

ja gerne den hier 8.5883.5426.G322

Schönes Teil, ich benutze die Ausführung mit normaler Welle in meinem Prüfgerät für SSI-Lichtwellenleiter-Übertragungen . Du brauchst hier in jedem Falle einen RS422-Treiber/Empfänger. Mein Lieblingstyp dafür: ST490 (Transceiver). Die vorgeschlagene Bastelei mit Inverter wird hier garantiert in die Hose gehen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren