Drehgeber/Encoder: Auflösung/Frequenz zu hoch

OP #3199735
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.
#3199781
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.
OP #3199799
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
#3199805
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?
OP #3199823
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.
Gast #3199871
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
Gast #3199905
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.
#3199909
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.
Persönliche Seite #3199927
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...
#3199950
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.
OP #3200024
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.
Gast #3200045
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

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