Forum: Mikrocontroller und Digitale Elektronik Jitter bei optischem Encoder


von Roland83 (Gast)


Lesenswert?

Hallo,

als Mikrocontrolleranfänger befasse ich mich gerade mit dem Thema 
(inkrementeller) "optischer Drehgeber" , den ich über einen 
Flankeninterrupt auswerte. Dabei löst ein steigender Flankenwechsel des 
A-Signals eine Interruptroutine aus, in der die Zustände von A und B 
verglichen werden. U.a. laut Vertriebsmitarbeiter des Drehgebers die 
effektivste Art einen optischen Encoder auszulesen. Zudem habe ich ggf. 
geplant, das Auslösen der Routine sowohl bei steigender als auch 
fallender Flanke durchzuführen und so die doppelte Auflösung zu 
erhalten.

Grundsätzlich würde mich nun nur allgemein interessieren, wie ich einen 
Jitter, der ggf. auftritt, rausfiltern könnte.
Eine Möglichkeit, die ich mir überlegt habe wäre vorab den zeitlichen 
Abstand zweier Flankenwechsel bei max. Drehzahl des Motors zu bestimmen. 
Am Anfang der Interruptroutine wird ein Timer, (der am Ende der Routine 
wieder 0 gesetzt wird) mit der verstrichenen Zeit seit dem letzten 
Auslösen der Routine verglichen. Ist dieser kleiner als der Abstand bei 
max. Drehzahl so muss es sich um einen Jitter handeln.

Was haltet ihr von der Idee, bzw wie könnte man es verbessern oder gar 
ganz anders und besser machen?

Vielen Dank für eure Hilfe

Roland

: Verschoben durch Admin
von Falk B. (falk)


Lesenswert?

@  Roland83 (Gast)

>als Mikrocontrolleranfänger befasse ich mich gerade mit dem Thema
>(inkrementeller) "optischer Drehgeber" , den ich über einen
>Flankeninterrupt auswerte.

Was schon mal der erste Fehler ist. Siehe Artikel Drehgeber.

>Grundsätzlich würde mich nun nur allgemein interessieren, wie ich einen
>Jitter, der ggf. auftritt, rausfiltern könnte.

Mit der richtigen Auswertung.

MFG
Falk

von Roland83 (Gast)


Lesenswert?

Hallo Falk,

den Artikel habe ich mir auch schon angeschaut und den 
Vertriebsmitarbeiter darauf angesprochen. Der hat mich "belächelt" und 
gesagt dass optische Encoder nicht prellen(!). Es kann eben max zu einem 
Jitter kommen wenn die Lichtschranke auf dem Zustandswechsel stehen 
bleibt und es durch Vibrationen zu "unrechtmäßigen" Flankenwechseln 
kommt. Und aufgrund der starken Mikrocontrollerauswertung eines 
timergesteuerten Interrupts (vgl. Code von Herrn Dannegger) hat er mir 
empfohlen einen Flankengesteuerten zu verwenden.

Insofern... wäre es schön wenn ihr mir Tipps geben könnt wie ich Jitter 
bei meinem Anwendungsfall rausfiltern könnte.

Danke

von Duke Scarring (Gast)


Lesenswert?

Sehe ich das richtig: Der Encoder hängt an einem Motor?
Von welchen Drehzahlen bzw. Frequenzen reden wir hier eigentlich?
Welche Auflösung hat der Encoder?

Und welchen Mikrocontroller bzw. welche Architektur möchtest Du 
einsetzen?

Roland83 schrieb:
> Und aufgrund der starken Mikrocontrollerauswertung eines
> timergesteuerten Interrupts (vgl. Code von Herrn Dannegger) hat er mir
> empfohlen einen Flankengesteuerten zu verwenden.
???

Der Code von Peter Dannegger ist wunderbar für manuelle Drehencoder 
geeignet. Also bitte erstmal die Fragen oben beantworten. Erst dann kann 
man nach einem Lösungsansatz suchen.

Duke

von Peter II (Gast)


Lesenswert?

Roland83 schrieb:
> Insofern... wäre es schön wenn ihr mir Tipps geben könnt wie ich Jitter
> bei meinem Anwendungsfall rausfiltern könnte.

dann teste doch mal die andere Möglichkeit, wenn dann kein Jitter da ist 
kannst du ja noch mal mit dem Vertriebsmitarbeiter reden.

Bist du der Entwickler oder der Vertriebsmitarbeiter?

von Klaus F. (kfalser)


Lesenswert?

Vielleicht solltest Du deine Anwendung ein wenig beschreiben.

Da Du Flanke zu Flanke messen möchtest, nehme ich an dass Du so etwas 
wie die Drehzahl des Motors oder ähnliches bestimmem möchtest.
Muss es dafür wirklich jede Flanke sein?
Eine Mittelwertbildung oder die Zeit über 100 Flanken erhöht die 
Messgenauigkeit genauso.

von Roland83 (Gast)


Lesenswert?

@ Peter 2: nene, bin nur n Azubi, der sich erstmal anhören darf was die 
anderen sagen :).

Habe einen Atmega2560 zur Verfügung (ich weiß völlig überdimensioniert, 
aber das einzige gescheite was grad da ist, evtl bestellen wir aber noch 
n anderen). Encoder liefert bei 1 flankenauswertung 180 
Impulse/Umdrehung. Wollte aber über eine Übersetzung kleinere gerade 
Bewegungen erreichen.

Bei dem Ding handelt es sich in erster Linie um eine Übung wo wir einen 
einen kleinen Werktisch bauen sollen der in einer Achse verfahren wird 
(Motorumdrehung ca. 200 U/min) . Stehe noch relativ am Anfang, das mit 
dem Jitterfilter wäre optional, habe mir aber gedacht dadurch noch gute 
tipps zu erhalten :)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Roland83 schrieb:
> den Vertriebsmitarbeiter darauf angesprochen. Der hat mich "belächelt"
> und gesagt dass optische Encoder nicht prellen(!). Es kann eben max zu
> einem Jitter kommen wenn die Lichtschranke auf dem Zustandswechsel
> stehen bleibt und es durch Vibrationen zu "unrechtmäßigen"
> Flankenwechseln kommt.
Da sollte sich der Herr Verkäufer aber nochmal schlau machen, was 
"Jitter" ist. Bei optischen Encodern ist Jitter die Abweichung eines 
Pulses von der erwarteten Position.
Wenn also z.B. bei einem 180-Pulse-pro-Umdrehung-Drehgeber die erste 
Flanke bei 0° kommt, die nächste aber nicht bei 2°, sondern bei 1,99° 
und die übernächste nicht bei 4° sondern bei 4,01°, dann hast du einen 
Jitter von 0,02°...

Das Gezappel, wenn der Geber grad doof dasteht, hat keinen Namen, denn 
es hat seine Ursache nicht im Geber sondern in einem daran 
angeschlossenen System! Auf englisch heißt es dann auch "shaft jitter" = 
Wellenzittern.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Roland83 schrieb:
> Und aufgrund der starken Mikrocontrollerauswertung eines
> timergesteuerten Interrupts (vgl. Code von Herrn Dannegger) hat er mir
> empfohlen einen Flankengesteuerten zu verwenden.

Das ist viel schlimmer, weil du jetzt eine variable, nicht vorhersagbare 
Auslastung des Controllers hast - in einem Echtzeitsystem absolut 
unerwünscht. Von der "gesparten" Rechenzeit im Fall einer niedrigen 
Interruptrate kannst du dir nichts kaufen, dafür ist im Extremfall der 
Controller nur noch damit beschäftigt, Flankeninterrupts zu bearbeiten, 
und die restliche Programmausführung kommt zum Erliegen.

von W.S. (Gast)


Lesenswert?

Roland83 schrieb:
> Grundsätzlich würde mich nun nur allgemein interessieren, wie ich einen
> Jitter, der ggf. auftritt, rausfiltern könnte.

Gar nicht. Wozu auch?

Du solltest aber einen Komparator benutzen, damit du ne Hysterese im 
Empfangszweig hast, denn optische Encoder haben keinen Sprung im Signal 
wie z.B. ein mechanischer Schalter, sondern deren Signal sieht eher 
"weichflankig" aus bis hin zu einer Art gekapptem Sinus.

Ansonsten kann ich nur von dem hier offensichtlich allgegenwärtigen 
Atmel AVR ab- und zu einem kleineren Cortex von NXP zuraten. Grund: 
Einige dieser Cortexe haben nämlich zusammen mit ein wenig 
Motorsteuer-Peripherie auch eine Hardware eingebaut, wo man Encoder 
anschließen kann. Diese Chips haben also etwas, das bei den meisten 
anderen uC nicht vorhanden ist. Wenn ich mich recht erinnere, dann kann 
das Teil vor- und rückwärts zählen und sogar einen Wert über die 
Drehgeschwindigkeit liefern. Ach schau doch selber mal bei NXP nach.

W.S.

von Jan H. (jan_h74) Flattr this


Lesenswert?

Ich bin da von Meinung das bei eine doppelte Auswertung von A und B 
encoder das "jitteren" eigentlich keine Falschtellung verursacht. Nemen 
wir mal an das der Antrieb steht genau auf das Schaltpunkt von A 
encoder. A encoder schaltet dan ohne Grund. Bei eine positive Flanke von 
A wird erst B angeschaut. B steht hoch : bedeutet positions Zaehler 
erhohen. Jetzt komt wieder eine negative Flanke von A. Wir schauen B an, 
der steht noch immer hoch : bedeutet positions Zaehler niedriger !!
Solange das jittern nur auf A oder B passiert, gibt kein Problem. Und da 
A und B spur um die 90° versetzt sein, soll das auf diesen Weise 
abgesichert sein.
Wen ihre Hardware so schlecht ist, das A und B zusammen jitteren, ist 
naturlich ende.

von Falk B. (falk)


Lesenswert?

@  Jan H. (jan_h74) Flattr this

>Ich bin da von Meinung das bei eine doppelte Auswertung von A und B
>encoder das "jitteren" eigentlich keine Falschtellung verursacht.

Meinen kann man viel. Wissen ist was anderes.

> Nemen
>wir mal an das der Antrieb steht genau auf das Schaltpunkt von A
>encoder. A encoder schaltet dan ohne Grund. Bei eine positive Flanke von
>A wird erst B angeschaut. B steht hoch : bedeutet positions Zaehler
>erhohen.

So schön, so gut.

> Jetzt komt wieder eine negative Flanke von A. Wir schauen B an,
>der steht noch immer hoch : bedeutet positions Zaehler niedriger !!

Wer sagt dir, dass dieses Jittern immer vollstängig vom u erfasst wird? 
Was ist, wenn die Frequenz so hoch ist, dass er es bsiweilen nicht mehr 
verarbeiten kann?

>Solange das jittern nur auf A oder B passiert, gibt kein Problem. Und da
>A und B spur um die 90° versetzt sein, soll das auf diesen Weise
>abgesichert sein.

Tja, das ist eine sehr vereinfache Betrachtung, die in der harten 
Realität auf Dauer nicht bestehen wird, wenn gleich es oft recht gut 
funktioniert.

>Wen ihre Hardware so schlecht ist, das A und B zusammen jitteren, ist
>naturlich ende.

Dann ist er kaputt. Ausserdem ist der von dir beschriebene Effekt KEIN 
Jitter. Jitter ist ein zeitlicher Fehler eines Signals, meist einer 
Taktflanke. Dieses "Flattern" kann man am ehesten als "Prellen" 
bezeichnen, wenn gleich die Ursache nicht von Kontakten kommt.

MfG
Falk

von Werner (Gast)


Lesenswert?

Jan H. schrieb:
> Ich bin da von Meinung das bei eine doppelte Auswertung von A und B
> encoder das "jitteren" eigentlich keine Falschtellung verursacht.

Jitter ist nicht das Gezappel auf der Schaltschwelle.

siehe:
Lothar Miller schrieb:
> Wenn also z.B. bei einem 180-Pulse-pro-Umdrehung-Drehgeber die erste
> Flanke bei 0° kommt, die nächste aber nicht bei 2°, sondern bei 1,99°
> und die übernächste nicht bei 4° sondern bei 4,01°, dann hast du einen
> Jitter von 0,02°...

von Roland83 (Gast)


Lesenswert?

@ andreas. wie gesagt ich bin nicht so bewandert in der mikrocontroller 
Programmierung. aber wieso ist denn ein flankengesteuerter Interrupt 
schlechter, der nur im betrieb  ausgelöst wird und sich sogar der 
drehgeschwindigkeit des Motors anpasst oder ein  timergesteueruter 
interrupt, der die ganze zeit ausgelöst wird und so schnell eingestellt 
sein muss wie die max. Drehgeschwindigkeit und auch im falle der 
Ruhezeit arbeitet?

@Jan. Vielen Dank. das macht sinn. Dann werde ich beide flanken 
auswerten und somit auch die doppelte Auflösung haben :)

von Falk B. (falk)


Lesenswert?

@  Roland83 (Gast)

>Programmierung. aber wieso ist denn ein flankengesteuerter Interrupt
>schlechter, der nur im betrieb  ausgelöst wird

Steht alles im Artikel Drehgeber.

MfG
Falk

von Jan H. (jan_h74) Flattr this


Lesenswert?

Falk Brunner schrieb:
> @  Jan H. (jan_h74) Flattr this
>>
> Wer sagt dir, dass dieses Jittern immer vollstängig vom u erfasst wird?
> Was ist, wenn die Frequenz so hoch ist, dass er es bsiweilen nicht mehr
> verarbeiten kann?
>
Das ist eigentlich eine schone Frage. Kan an einen Pin zwei Positive 
Flanke Interrupts hinter ein ander ausgelost werden ? Ohne 
zwischenliegende Negativ Flanke interupt ? Das ist in diesen Fall 
notwendig um eine falsche Zaehlung zu bekommen.
Aber wahrscheinlich ist dan den µ schon lange abgesturzt wegend 
overflow...
Und ja, jitter ist nicht die richtige Ausdruckung.

von Falk B. (falk)


Lesenswert?

@Jan H. (jan_h74) Flattr this

>Das ist eigentlich eine schone Frage. Kan an einen Pin zwei Positive
>Flanke Interrupts hinter ein ander ausgelost werden ? Ohne
>zwischenliegende Negativ Flanke interupt ?

Kommt auf den uC an. Aber selbst wenn beide Flanke als Auslöser 
eingestellt sind wie z.B. beim AVR an INT0, muss die Plarität der Flanke 
im Interrupt per Software ermittelt werden, das dauert schon einige 
Takte.

> Das ist in diesen Fall
>notwendig um eine falsche Zaehlung zu bekommen.
>Aber wahrscheinlich ist dan den µ schon lange abgesturzt wegend
>overflow...

Warum? Auch bei 100% Interruptlast gibt es keinen Stack overflow, aber 
dein Hauptprogramm kommt nur noch in Zeitlupe voran.

MFG
Falk

von Reinhard Kern (Gast)


Lesenswert?

Falk Brunner schrieb:
> Aber selbst wenn beide Flanke als Auslöser
> eingestellt sind wie z.B. beim AVR an INT0, muss die Plarität der Flanke
> im Interrupt per Software ermittelt werden, das dauert schon einige
> Takte.

Korrekte Lösung ist, nach einem LoHi-Interrupt nur eine negative Flanke 
als IR-Request zuzulassen und umgekehrt. Dann kommt es weder zu einer 
Überlastung noch zu einer falschen Zählung.

Gruss Reinhard

von Timm T. (Gast)


Lesenswert?

Diese Interrupt-Routine wertet beide Encoder-Kanäle auf steigende und 
fallende Flanke aus, damit vierfache Auflösung. Funktioniert zuverlässig 
bis 10kHz oder so.

Der Encoderstand aus ENCNT wird in einem Timerinterrupt regelmäßig 
ausgelesen und daraus eine Geschwindigkeit / eine Position berechnet. 
Damit wird ein Motor über einen PID drehzahlgeregelt und definierte 
Positionen angefahren.

Heute würde ich es wahrscheinlich auch mit einer timergesteuerten 
Zustandsabfrage machen, zumal dann beliebige Eingänge für den Encoder 
genutzt werden können.
1
.ORG  INT0addr      ;External Interrupt0
2
  rcall  enc_int      ;Encoder Interrupt Handler
3
.ORG  INT1addr      ;External Interrupt1
4
  rcall  enc_int      ;Encoder Interrupt Handler
5
6
  ;**** Init Encoder ExtInterrups ****
7
8
  clr  ENSPD
9
  clr  ENCNT      ;Init Encoder
10
11
  in  TEMP1,PINint    ;Encoderstand einlesen, Bit 3+2
12
  cbr  TEMP1,0xFF-((1<<Pint1)+(1<<Pint0))
13
  mov  ENOLD,TEMP1    ;Encoderstand ablegen
14
  
15
  ldi  TEMP1,(1<<ISC11)+(1<<ISC01)  ;ExtInt setzen, je nach Encoderstand
16
  sbrs  ENOLD,Pint1    ;prüfen auf ExtInt 1 high
17
  sbr  TEMP1,1<<ISC10    ;wenn low, Trigger 1 auf rising Edge
18
  sbrs  ENOLD,Pint0    ;prüfen auf ExtInt 0 high
19
  sbr  TEMP1,1<<ISC00    ;wenn low, Trigger 0 auf rising Edge
20
  out  MCUCR,TEMP1    ;Externe Interrupts 1 und 0 setzen, rising Edge
21
  ldi  TEMP1,(1<<INT1)+(1<<INT0)
22
  out  GIMSK,TEMP1    ;Externe Interrupts 1 und 0 enablen
23
24
25
;Main
26
27
28
  ;**** Encoder Interrupt beide Kanäle ****
29
30
enc_int:        ;Interrupt-Flags werden automatisch gelöscht
31
  push  TEMP1
32
  in  TEMP1,SREG
33
  push  TEMP1
34
35
  in  TEMP1,PINint    ;Encoderstand einlesen, Bit 3+2
36
  cbr  TEMP1,0xFF-((1<<Pint1)+(1<<Pint0))
37
  mov  ENNEW,TEMP1    ;neuen Encoderstand sichern
38
39
  ldi  TEMP1,(1<<ISC11)+(1<<ISC01)  ;ExtInt setzen
40
  sbrs  ENNEW,Pint1    ;prüfen auf ExtInt 1 high
41
  sbr  TEMP1,1<<ISC10    ;wenn low, Trigger 1 auf rising Edge
42
  sbrs  ENNEW,Pint0    ;prüfen auf ExtInt 0 high
43
  sbr  TEMP1,1<<ISC00    ;wenn low, Trigger 0 auf rising Edge
44
  out  MCUCR,TEMP1    ;Externe Interrupts 1 und 0 setzen, rising Edge
45
46
  ldi  TEMP1,0x00    ;Operation AneuBneu und BaltnichtAalt
47
  sbrs  ENOLD,Pint1    ;prüfen auf Old 1 high
48
  sbr  TEMP1,1<<Pint0    ;wenn low, 3 nach 2 schieben, invertiert
49
  sbrc  ENOLD,Pint0    ;prüfen auf Old 0 low
50
  sbr  TEMP1,1<<Pint1    ;wenn high, 2 nach 3 schieben, nicht invertiert
51
52
  mov  ENOLD,ENNEW    ;neuen Encoderstand ablegen
53
54
  eor  TEMP1,ENNEW    ;verbinden alt und neu
55
  brne  enc_down    ;wenn nicht 00, nächste
56
57
  inc  ENCNT      ;Inc SpeedCounter, Vorwärts 
58
59
  rjmp  enc_out
60
enc_down:
61
  cpi  TEMP1,(1<<Pint1)+(1<<Pint0)  ;prüfen
62
  brne  enc_out      ;wenn nicht 11, nächste
63
64
  dec  ENCNT      ;Dec SpeedCounter, Rückwärts
65
66
enc_out:
67
  pop  TEMP1
68
  out  SREG,TEMP1
69
  pop  TEMP1
70
71
  reti        ;Encoder Interrupt zurück

Statt 1<<Bitx + 1<<Bity besser 1<<Bitx | 1<<Bity zuweisen.

von Falk B. (falk)


Lesenswert?

@  Reinhard Kern (Firma: RK elektronik GmbH) (rk-elektronik)

>Korrekte Lösung ist, nach einem LoHi-Interrupt nur eine negative Flanke
>als IR-Request zuzulassen und umgekehrt. Dann kommt es weder zu einer
>Überlastung noch zu einer falschen Zählung.

Wunschdenken. Wer verbietet dem Encoder, schneller zu zappeln als der 
Mikrocontroller die Flanken auswerten kann?

Ich glaube ich werd mal ein Testprogramm schreiben, das einen zappligen 
Encoder emuliert. Das kann man dann auf die "sicheren 
Flankenauswertungen" loslassen. Mal sehen wer dann weint . . .

MFG
Falk

von smude (Gast)


Lesenswert?

Nach dem möglichen Problem, daß man Schritte verliert, weil 
zwischendurch die Abarbeitung der requests nicht nachkommt hatte ich im 
"Schwesterthread" 'wie viele Quadraturencoder hat ein uc' gefragt. Da 
hatte ich den Schwerpunkt meiner Sorge eher darauf gelegt, die letzte 
Flanke nicht mitzukriegen. Ist spezieller, aber geht ja in die selbe 
Richtung.
Scheint so, als ob die Meinungen da getrennt sind. Es scheint sogar so 
zu sein, daß da professionelle Meinungen auseinandergehen. Im Moment 
noch sehr schwierig für mich, mir meine Meinung zu bilden :-(

von m.n. (Gast)


Lesenswert?

Falk Brunner schrieb:
> Wunschdenken. Wer verbietet dem Encoder, schneller zu zappeln als der
> Mikrocontroller die Flanken auswerten kann?

Ganz einfach: D-FFs an den Eingängen, welche die Siganle synchronisieren 
und die Änderungen auf die D-CLK Frequenz beschränken.
Nimmt man zum Beispiel für D-CLK 100kHz, können die Flankenwechsel nicht 
kürzerer als 10µs sein und im Ruhezustand des Gebers wird 0% 
Prozessorleistung benötigt. Andererseits werden Flankenwechsel bis 
<100kHz sicher erkannt.

Hardware Quadratur-Dekoder machen es ebenso, nur dass dort mit einigen 
MHz Taktfrequenz gearbeitet wird und die Flankenwechsel noch aufbereitet 
werden.

von Timm T. (Gast)


Lesenswert?

Falk Brunner schrieb:
> Ich glaube ich werd mal ein Testprogramm schreiben, das einen zappligen
> Encoder emuliert.

Ach, das ist doch Tinneff: Erstens hat ein optischer Encoder auch eine 
Hysterese, zumindest die integrierten mit 3 Empfängerdioden und 
Schmitt-Trigger. Damit muss sich das Encoderrad nennenswert bewegen, um 
einen Pegelwechsel auszulösen. Und da ist der Interrupt allemal schnell 
genug durch...

Ich hab das damals lang und breit an einem realen Encoder getestet. 
Probleme gabs mit verschluckten Impulsen, wenn die Drehzahl zu hoch 
wurde => was mein Motor real nie erreichen kann und was bei 
timergesteuerten Abfragen auch auftritt. Aber nicht mit Zappeln bei 
stillstehendem Motor.

Höchstens Störungen auf den Encoderleitungen können ausreichend 
hochfrequent sein, um den Interrupt an die Grenze zu fahren. Aber wenn 
ich derart massive hochfrequente Einstreuungen habe, liegt mein Problem 
woanders.

Obiger Code funktioniert. Wenn ich es jetzt anders machen würde, dann 
weil ich von den Interrupt-Pins unabhängig bin und die Abfrage 
möglicherweise einfacher ist (ständiges Umsetzen der aktiven 
Pegelwechsel fällt weg). Mit widerstrebte damals einfach der Gedanke, 
einen Timer ständig so schnell laufen zu lassen, obwohl die meiste Zeit 
gar keine Ereignisse anstehen.

von m.n. (Gast)


Angehängte Dateien:

Lesenswert?

Timm Thaler schrieb:
> Mit widerstrebte damals einfach der Gedanke,
> einen Timer ständig so schnell laufen zu lassen, obwohl die meiste Zeit
> gar keine Ereignisse anstehen.

Mit dieser völlig unqualifizierten Meinung stehen wir beide wohl allein 
auf weiter Flur.
Anbei ein Codeschnipsel, der beide Flanken von INT0 und INT1 auswertet. 
Daran kann man abzählen, wie schnell ein ATmega48 die INTs verwurschteln 
kann. Init-Routinen und weitere Verarbeitung erspare ich mir.

von Falk B. (falk)


Lesenswert?

@  Timm Thaler (timm-thaler)

>> Ich glaube ich werd mal ein Testprogramm schreiben, das einen zappligen
>> Encoder emuliert.

>Ach, das ist doch Tinneff:

Nö, es ist ein HANDFESTER Test, nicht nur seichtes Forumsgeplänkel!
Stay tuned!

MFG
Falk

von Clemens M. (panko)


Lesenswert?

"Init-Routinen und weitere Verarbeitung erspare ich mir."

Die weitere Verarbeitun und was sonst noch so auf dem Controller läuft 
finde ich schon wichtig.

Wenn der alleinige Daseinszweck der Encoder ist, kommst du so natürlich 
schon schnell zu rande. Aber zusätzliche Auslastung kann dann schon zu 
sporadischen Problemen führen, die Falk meint. Hat ja keiner behauptet, 
daß das immer knallt.
Wenn cnt in irgendeiner Berechnung gebraucht wird, musst du ja für die 
Zeit schon mal den int dichtmachen.
Und wenn usb oder so was auf dem Controller läuft funkt eine Menge 
anderes dazwischen.

von akaDem (Gast)


Lesenswert?

Falk Brunner schrieb:
> @  Timm Thaler (timm-thaler)
>
>>> Ich glaube ich werd mal ein Testprogramm schreiben, das einen zappligen
>>> Encoder emuliert.
>
>>Ach, das ist doch Tinneff:
>
> Nö, es ist ein HANDFESTER Test, nicht nur seichtes Forumsgeplänkel!
> Stay tuned!
>
> MFG
> Falk

Mich würde mal ein originales Oszillogramm eines "zappelnden" optischen 
Encoders interessieren. Den Nachweis, dass sowas in echt auftritt hat 
hier noch keiner erbracht.

von Clemens M. (panko)


Lesenswert?

Klar, wäre eine Diskussionsgrundlage...

Aber was ist DAS Referenzgezappel? Muss sich ja nicht jegliches Gezappel 
an das halten was da aufgenommen wurde.

von m.n. (Gast)


Lesenswert?

Clemens M. schrieb:
> Wenn cnt in irgendeiner Berechnung gebraucht wird, musst du ja für die
> Zeit schon mal den int dichtmachen.

Dann schreib Dir die Routine und zähle die Takte dafür. Dann kannst Du 
abschätzen, wie lange es braucht.

> Und wenn usb oder so was auf dem Controller läuft funkt eine Menge
> anderes dazwischen.

Und Du glaubst, wenn ein periodischer Timer aktiv ist, ginge das alles 
schneller?
Immer nur Meckern :-(

von Kara Ben Nemsi (Gast)


Lesenswert?

akaDem schrieb:
> Mich würde mal ein originales Oszillogramm eines "zappelnden" optischen
> Encoders interessieren. Den Nachweis, dass sowas in echt auftritt hat
> hier noch keiner erbracht.

Jeder, der schon mal Positioniersteuerungen entwickelt hat, weiß dass es 
dieses Zappeln gibt.
Sei es durch externe Belastung der Welle, auf die der Encoder sitzt, 
oder nur durch den Stoppvorgang der Welle. Beim Stoppen kann auch nur 
ein einmaliger Richtungswechsel stattfinden.

Wenn das alles korrekt erfasst und bilanziert wird ist das alles "kein 
Problem". ;)

von Clemens M. (panko)


Lesenswert?

"Immer nur Meckern :-("

Hä? Das hat doch wirklich nichts aber auch gar nichts mit Meckern zu tun 
sondern mit einer (von meiner Seite aus) konstruktiven Diskussion über 
ein Problem. Bin weder festgefahren, noch voreingenommen, sondern offen 
für jegliche Argumente und Fakten.
Gerade das, was zwischen das irq funken kann ist doch eine potentielle 
Ursache dafür, daß dieser eben ein von zig Tausend mal ärger macht. Und 
das wollen wir doch besprechen oder hab ich das falsch verstanden?

Frage ist für mich: IST die irq Lösung eine Potentielle Quelle für 
sporadische Fehler, wie groß ist die und ist das vertretbar einzugehen.

Verstehe ich wirklich nicht.

von Falk B. (falk)


Lesenswert?

@  m.n. (Gast)

>> Und wenn usb oder so was auf dem Controller läuft funkt eine Menge
>> anderes dazwischen.

>Und Du glaubst, wenn ein periodischer Timer aktiv ist, ginge das alles
>schneller?

DETERMINISTISCH!

>Immer nur Meckern :-(

Lesen, geschweige Verstehen, ist wohl nicht deine Kernkompetenz? Der 
"Trick" des Polling per Timer-Interrupt ist, dass es Zappel kann wie es 
will, die CPU-Last ist konstant und deterministisch und Trotzdem wird 
nicht ein eiziger Schritt verschluckt, selbt bei 1 GHz Zappeln.

MFG
Falk

von Reinhard Kern (Gast)


Lesenswert?

Falk Brunner schrieb:
> Wunschdenken. Wer verbietet dem Encoder, schneller zu zappeln als der
> Mikrocontroller die Flanken auswerten kann?

Nein, schlichte Logik. Wenn beim Zappeln eine Hi-Flanke erfasst wurde 
und danach eine Lo-Flanke übersehen, wird so auch noch die nächste 
Hi-Flanke ignoriert - und damit ist GENAU NICHTS passiert, ein 
schnellerer Zähler hätte eins rauf gezählt und dann wieder eins runter - 
überflüssigerweise.

Bei einem sorgfältig entworfenen Quadratur-Decoder in Hardware passiert 
das gleiche und deswegen sind sie gegen Zappeln immun.

Nach dem Verlauf des Threads scheint ein Quadratursignal in erstaunlich 
vielen Fällen die Denkfähigkeit zu überfordern.

Gruss Reinhard

von Horst H. (horst_h44)


Lesenswert?

Hallo

Der Artikel Drehgeber ist schon sehr gut verständlich, aber vielleicht 
hilft das Bild 2 in dieser Applikation: 
http://www.ichaus.biz/upload/pdf/EncoderAnschluss%20-WP22102011de.pdf 
die Funktionsweise der Quadratursignale in seiner Abfolge besser zu 
verstehen. Die Vorwärts-/Rückwärtsrichtung ist in der Flankenfolge A-->B 
und B-->A codiert. Ein guter Encoder verliert keine Impulse und es ist 
ein minimaler Flankenabstand definiert. Schafft der Mikrocontroller es 
nicht diesen Flankenwechsel zu verarbeiten, muss ein 
Richtungsdiskriminator und ein Hardware-Zähler her. Hier gibt es noch 
mehr Hinweise für eine Erfassung der Geschwindigkeit: 
http://imperia.mi-verlag.de/imperia/md/content/ai/ae/fachartikel/ei/2008/07/ei08_07_030.pdf 
.

VG  Horst

von Kara Ben Nemsi (Gast)


Angehängte Dateien:

Lesenswert?

Im Anhang ein Vorschlag, der auf "Siemens Halbleiter-Schaltbeispiele 
1973" zurück geht.

von Timm T. (Gast)


Lesenswert?

Falk Brunner schrieb:
> Nö, es ist ein HANDFESTER Test, nicht nur seichtes Forumsgeplänkel!

Es ist eine Simulation. Klar kannst Du den in der Simulation auch mit 1 
MHz zappeln lassen. Oder mit 10 MHz. Ist nur völlig unrealistisch.

Ich habe das real ausprobiert. Also genau so versucht, den Encoder 
(Sharp GP1A70R und ähnliche) auf eine Flanke zu setzen und dann springen 
zu lassen, und das Ganze auf dem Oszi beobachtet. Er tut es nicht.

Liegt einfach daran, dass der detektierte Lichtstrahl nicht unendlich 
schmal ist. Damit ergibt sich kein abrupter Hell-Dunkel-Übergang, 
sondern eine Flanke mit einer Steigung dU / dw. Die Flanke wird über 
einen Schmitt-Trigger mit Hysterese (noch im Encoder) ausgewertet. Um 
einen Pegelwechsel H-L-H zu erreichen, muss die Hysterese überwunden 
werden, dazu muss der Winkel dw sich signifikant ändern. Da wir hier von 
realen Systemen und nicht von einer Simulation reden, geht eine 
Winkeländerung nur durch Überwinden einer gewissen Massenträgheit. Und 
dazu benötigt ein reales System Zeit.

Für ein "Zappeln" muss sich der Encoder also erstmal bewegen, und das 
kann er nicht beliebig schnell.

Disclaimer: Das gilt für optische Encoder, bei mechanischen Drehencodern 
mit Kontaktprellen sieht das anders aus.

von Falk B. (falk)


Lesenswert?

@  Timm Thaler (timm-thaler)

>> Nö, es ist ein HANDFESTER Test, nicht nur seichtes Forumsgeplänkel!

>Es ist eine Simulation.

Nö, eher Emulation eines Worst Case Szenarios.

> Klar kannst Du den in der Simulation auch mit 1
>MHz zappeln lassen. Oder mit 10 MHz. Ist nur völlig unrealistisch.

Hast du eine Ahnung von realen Störsignalen. Und selbst wenn es deutlich 
über reale Störsignal hinausgeht. Es zeigt prinzipielle Stärken oder 
auch Schwächen von Decodern.

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.