Forum: Mikrocontroller und Digitale Elektronik Drehgeber/Encoder: Auflösung/Frequenz zu hoch


von Thomas Z. (tezet)


Lesenswert?

An einem Motor mit Getriebe befindet sich auf der Motorachse der 
Drehgeber/Encoder. Durch das Getriebe ergeben sich auf der Abtriebsachse 
1.200 Steps pro Umdrehung. Bei einer Drehzahl von 500 U/min ergeben sich 
10.000 Steps/Sekunde. Lt. Drehgeber-Artikel müsste ich also mit 200kHz 
abtasten. Das ist zuviel.

Idee: einfach mit zwei Binär-Zählern die Signale durch 16 teilen.

Frage: Hat jemand dieses Problem in der Praxis so gelöst? Oder anders?

Lösungen mit FPGA, CPLD & Co. scheiden mangels Technik und Synapsen aus.

von Falk B. (falk)


Lesenswert?

@Thomas Z. (tezet)

>An einem Motor mit Getriebe befindet sich auf der Motorachse der
>Drehgeber/Encoder. Durch das Getriebe ergeben sich auf der Abtriebsachse
>1.200 Steps pro Umdrehung. Bei einer Drehzahl von 500 U/min ergeben sich
>10.000 Steps/Sekunde.

Was sind bei dir Steps? Codewechsel oder Puls auf dem Signal. Das wird 
oft vermischt.

>Idee: einfach mit zwei Binär-Zählern die Signale durch 16 teilen.

Nö, das geht nur, wenn man EINEN Kanal als einfachen Drehzahlgeber 
nutzen will. Will man aber die Encoderfunktion erhalten, geht nichts an 
einem echten Decoder vorbei.

>Lösungen mit FPGA, CPLD & Co. scheiden mangels Technik und Synapsen aus.

Dann nimmt old school CMOS, Lösung ist im Artikel enthalten. Oder nimm 
einen passenen PIC/AVR whatever, der so einen Decoder als Hardware drin 
hat. Oder einen, mittlerweile eher schwer erhältlichen Decoder-IC mit 
SPI oder sonstiger Schnittstelle.

von Thomas Z. (tezet)


Lesenswert?

Falk Brunner schrieb:

> Was sind bei dir Steps? Codewechsel oder Puls auf dem Signal. Das wird
> oft vermischt.

Gute Frage. Zitat: "an integrated quadrature encoder that provides a 
resolution of 64 counts per revolution of the motor shaft, which 
corresponds to 1200 counts per revolution of the gearbox’s output shaft"

Link: http://www.pololu.com/catalog/product/1442

> Dann nimmt old school CMOS, Lösung ist im Artikel enthalten.

Das habe ich befürchtet oder Umstieg auf XMega

Danke

von Falk B. (falk)


Lesenswert?

@ Thomas Z. (tezet)

>Gute Frage. Zitat: "an integrated quadrature encoder that provides a
>resolution of 64 counts per revolution of the motor shaft, which
>corresponds to 1200 counts per revolution of the gearbox’s output shaft"

Ist nicht eindeutig, das könnten 1200 Takte bzw. 4800 Codes sein, aber 
auch nur 1200 Codes. Man weiß es nicht.

Was willst du denn mit dem Ding machen? Positionierung?

von Thomas Z. (tezet)


Lesenswert?

Falk Brunner schrieb:

> Was willst du denn mit dem Ding machen? Positionierung?

Einfach einen kleinen Roboter (Hobby/Entspannung). Es geht eher um 
kurzfristige Soll-/Ist-Drehzahl/-Richtung. Eine Positionsbestimmung im 
Zimmer auf Basis der Encoderdaten ist meines Erachtens sinnfrei ;-)

Ein kleinerer Motor (andere Bauart/Encoder auf Radachse) würde 
überschlagsmäßig reichen. Ich weiß noch nicht, für welchen ich mich 
entscheide.

von c-hater (Gast)


Lesenswert?

Thomas Z. schrieb:

> An einem Motor mit Getriebe befindet sich auf der Motorachse der
> Drehgeber/Encoder. Durch das Getriebe ergeben sich auf der Abtriebsachse
> 1.200 Steps pro Umdrehung.

Häh?!

Wo ist denn das Ding nun, auf der Motorachse oder auf der Abtriebsachse?

von MaWin (Gast)


Lesenswert?

> Lt. Drehgeber-Artikel müsste ich also mit 200kHz abtasten.
> Das ist zuviel.
> Idee: einfach mit zwei Binär-Zählern die Signale durch 16 teilen

Also 12500Hz wären ok ?

Dann rechne doch einfach noch mal nach,
10000 Steps, 4 Zustände, macht 40000 Hz Abtastung,
weit weniger als deine befürchteten 200000,
und sollten doch "drin" sein.

Natürlich kann man Incrementaldecoderauswertung auch in Hardware machen.

http://www.dse-faq.elektronik-kompendium.de/dse-faq.htm#F.29

von Michael A. (Gast)


Lesenswert?

Thomas Z. schrieb:
> Gute Frage.

Wenn der Motor nicht gerade mit 500 U/min dreht, sollte sich ein 
Unsicherheitsfaktor von 4 mit ein paar Leuchtdioden (evtl. mit Treiber) 
an den Encoderausgängen doch ausräumen lassen.

Und ob man jeden Step 20 mal abtasten muss, damit man ihn mitkriegt, sei 
jetzt mal dahingestellt. Für die richtige Dekodierung muss man jede 
Phase des AB-Signals genau ein Mal erwischen.

von Marian (phiarc) Benutzerseite


Lesenswert?

http://www.elektrik-trick.de/sminterf.htm

An /CLK noch einen ripple counter ran und fertig is.

von Falk B. (falk)


Lesenswert?

@Thomas Z. (tezet)

>Einfach einen kleinen Roboter (Hobby/Entspannung). Es geht eher um
>kurzfristige Soll-/Ist-Drehzahl/-Richtung. Eine Positionsbestimmung im
>Zimmer auf Basis der Encoderdaten ist meines Erachtens sinnfrei ;-)

Sag das nicht. Bring einen Zeiger am Getriebausgang an. Nun fahre wilde 
Muster, beschleuningen, bremsen, Richtungswechsel etc. Im Controller 
hast du die Position. Wenn an Ende der Zeiger wieder genau auf Null 
steht, ist deine Auswertung korrekt.

von Falk B. (falk)


Lesenswert?

@ Marian B. (phiarc)

>http://www.elektrik-trick.de/sminterf.htm

>An /CLK noch einen ripple counter ran und fertig is.

NEIN! Siehe Drehgeber !

von Clemens S. (zoggl)


Lesenswert?

hat dein geber einen referenzausgang? den könntest du bei hohen 
drezahlen verwenden und bei geringen drezahlen wieder auf die normaile 
auswertung wechseln.

von Marian (phiarc) Benutzerseite


Lesenswert?

Falk Brunner schrieb:
> @ Marian B. (phiarc)
>
>>http://www.elektrik-trick.de/sminterf.htm
>
>>An /CLK noch einen ripple counter ran und fertig is.
>
> NEIN! Siehe Drehgeber !

Heh? Ja ich weiß was ein Drehgeber ist... mein Vorschlag war in Hardware 
ein Taktsignal aus AB abzuleiten und mit einem INT nur jede x-te Flanke 
zu erfassen. Damit würde die Auflösung um Faktor x reduziert...

Allerdings müsste man AB wohl vorher noch in HW entprellen, ein Problem 
was man bei den Schrittmotörchen nicht hat...

von Clemens S. (zoggl)


Lesenswert?

du hast kein 1200*500 sondern 64*500 (der geber ist vor dem getriebe!!!) 
das sind nur noch 500 pulse pro sec, das schafft ein µC durchaus noch 
ohne große anstrengungen.

von Falk B. (falk)


Lesenswert?

@Clemens S. (zoggl)

>du hast kein 1200*500 sondern 64*500 (der geber ist vor dem getriebe!!!)

Am Motor.

>das sind nur noch 500 pulse pro sec, das schafft ein µC durchaus noch
>ohne große anstrengungen.

Nö, er hat schon 1200 Pulse / U am Getriebeausgang mit bis zu 500 U/min 
am Getiebeausgang.

von Thomas Z. (tezet)


Lesenswert?

Danke für die vielen Beiträge. Ein IC-Grab will ich ungern machen und 
Spezialchips sind auch nicht gut. Ich denke gerade darüber nach, einen 
Tiny zu nehmen, und die Signale von zwei Encodern in der Hauptschleife 
auszuwerten, korrekt runterzuteilen und Pins zu wackeln. Der Haupt-myC 
"denkt" das wären entsprechend langsame Encoder.

von Falk B. (falk)


Lesenswert?

Ist eine Möglichkeit.

von Quad-decoder in Verilog (Gast)


Lesenswert?

Eigentlich fällt mir zu diesem Problem nur eine einfach Hardware-Lösung 
ein die mit Hilfe einer CPLD gelöst wurde und 2-Quad-Decoder in 
Richtung/Schritt wandelt. Es ist dafür nur ein einfacher TTL-Oszillator 
mit um die 1-2Mhz und eine XC9536 nötig. Ob der TTL-Oszillator nun 1,8 
oder 1Mhz hat, ist eigentlich egal. Bei 1Mhz Takt gehen auf jeden Fall 
250Khz am Eingang. Bei schnelleren Signalen müsste man zunächst mal 
etwas am Eingang filtern. Man kann dass auch in HDL schreiben, ich habe 
jedoch darauf mangels Bedarf darauf verzichtet. Das Mapping der 
Funktionen zum Pin des Chips macht man am besten in einer Datei oder 
erzeugt sie in der ISE (Xilinx

Der Dekoder ist kein Hexenwerk wie man sehen kann. Am Ausgang kommt der 
Takt und die Richtung an - der Takt geht in einen Counter-Eingang des 
AVR und mit dem Richtungsausgang an ein Portbit. Nun muss der Controller 
nur noch den IRQ für das Richtungsportbit bedienen und bei Änderung 
entweder vor- oder rückwärts zählen lassen.


Ich habe in einer weiteren Version ein 32Bit Vorwärts/Rückwärts Zähler 
implementiert. Der wird einfach mit 8Bit breiten Leitungen zum Chip 
ausgelesen  gesetzt  rückgesetzt. Der lies sich jedoch nicht mehr im 
xc9536 (5V) synthetisieren und musste in einem XC9572XL (3.3V) umziehen.
Die Schaltung kostete knapp €3.- gekostet und funktioniert bis ca. 
170Mhz.

 http://www.mikrocontroller.net/part/XC9536


// 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+++++++++
// Modifiziert 04/2010 von G. Wesser, DD4DA zur Ausgabe der 
Ticks,Richtung
// Ein zweiter Decoder wurde integriert -- mit je ein 4-Bit Zählregister
// in dem XC9536 lassen sich keine zwei 8-Bit Zähler unterbringen
// da zu wenige IOB's da sind. Ein XC9572 würde jedoch funktionieren.
// vy 73 de DD4DA
// 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+++++++++


// Initiated in 08/2009 and modified in 04/2010 by G. Wesser.
// This Project build two Quad-Decoder (gray code) for decoding the A 
and B Signal
// of an incremental encoder  to Ticks and Direction of each Incremental 
encoder.
// In addition, i add a 4 Bit binary counter for each decoder. This 
should gives a MCU
// the posibility to use normal I/O Ports instead Tick and Direction. 
IT's also usable
// as a prescaler 1/2, 1/4, 1/8 and 1/16 of the Ticks to get different 
resolutions.
// Use one of them and the direction signal instead the TICK output.


module quad(clk, quadA, quadB,quadC, quadD, count1, count2, richtung1, 
richtung2, ticks1,ticks2);

input clk, quadA, quadB, quadC, quadD;

output [3:0] count1;      // Output Register ist 4 Bit breit
output [3:0] count2;      // Output Register ist 4 Bit breit
output richtung1, ticks1,  richtung2, ticks2;



reg [2:0] quadA_delayed, quadB_delayed, quadC_delayed, quadD_delayed;
always @(posedge clk) quadA_delayed <= {quadA_delayed[1:0], quadA};
always @(posedge clk) quadB_delayed <= {quadB_delayed[1:0], quadB};
always @(posedge clk) quadC_delayed <= {quadC_delayed[1:0], quadC};
always @(posedge clk) quadD_delayed <= {quadD_delayed[1:0], quadD};


wire count_enable1 = quadA_delayed[1] ^ quadA_delayed[2] ^ 
quadB_delayed[1] ^ quadB_delayed[2];
wire count_direction1 = quadA_delayed[1] ^ quadB_delayed[2];

wire count_enable2 = quadC_delayed[1] ^ quadC_delayed[2] ^ 
quadD_delayed[1] ^ quadD_delayed[2];
wire count_direction2 = quadC_delayed[1] ^ quadD_delayed[2];



reg [3:0] count1;    // 4-Bit Zähler - kann ggf erweiter werden
reg richtung1;      // Richtung Rechts=Low Links=High
reg ticks1;        // Impulse für den Weg



reg [3:0] count2;    // 4-Bit Zähler - kann ggf erweiter werden
reg richtung2;      // Richtung Rechts=Low Links=High
reg ticks2;        // Impulse für den Weg




// Erster Quad-Decoder

always @(posedge clk)
begin

 if(count_enable1)
  begin
   if (ticks1 == 1 ) ticks1 <= 0;
  else  ticks1 <= 1;
   if (count_direction1)
    begin
   count1 <= count1 + 1;    // Zähler um 1 erhöhen
   richtung1 <= 1;        // Richtung ausgeben - High
    end
  else
    begin
    count1 <= count1 - 1;    // Zähler um 1 mindern
     richtung1 <= 0;        // Richtung ausgeben - LOW
   end
  end

end



// Second Quad-Decoder

always @(posedge clk)
begin

if(count_enable2)
  begin
   if (ticks2 == 1 ) ticks2 <= 0;
  else  ticks2 <= 1;
   if (count_direction2)
    begin
   count2 <= count2 + 1;    // Zähler um 1 erhöhen
   richtung2 <= 1;        // Richtung ausgeben - High
    end
  else
    begin
    count2 <= count2 - 1;    // Zähler um 1 mindern
     richtung2 <= 0;        // Richtung ausgeben - LOW
   end
  end
end


endmodule

von Thomas Z. (tezet)


Lesenswert?

Ja, genau sowas meine ich - nur in einem Tiny. Wenn ich im Haupt-myC 
zwei Timer/Counter frei habe, dann ist natürlich ein 
Takt/Richtungssignal sinnvoller als ein runtergeteiltes A/B-Signal.

von Thomas Z. (tezet)


Lesenswert?

Nur zur Info, da die Frage offen war, ob Flankenwechsel oder ganze 
Perioden in der Produktbeschreibung gemeint waren:

Der Encoder hat 64 Flankenwechsel pro Umdrehung.

Also sollte man mit 20kHz Abtastfrequenz hinkommen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.