Moin,
Ich hab ein DC brushed Motor mit Hall Encoder. Da ich beim Auslesen über
einen Teensy 3.5 feststellen musste, dass ich immer wieder einige Ticks
verliere hab ich mein logic Analyzer angeschlossen. Es handelt sich um
einen Encoder mit 2 Channel, single ended. Im Anhang ist ein Bild der
Signalverläufe. Dort ist eine Störung zu erkennen die leider zu einem
flaschen Erkennen eine Flanke führt.
Ich hab schon die Signalleitungen verdrillt und auch 5V/GND verdrillt.
Zum Testen habe ich auch mal einen eher guten Encoder (PWB ME22)
getestet. Hier kommt es beim Auslesen am Teensy zu keinerlei
Impulsverlust.
Muss also an der Signalleitung liegen.
Anregungen wie ich die Encodersignale entstört bekomme?
Vielen Dank
Jacko91 schrieb:> Moin,> Ich hab ein DC brushed Motor mit Hall Encoder. Da ich beim Auslesen über> einen Teensy 3.5 feststellen musste, dass ich immer wieder einige Ticks> verliere hab ich mein logic Analyzer angeschlossen. Es handelt sich um> einen Encoder mit 2 Channel, single ended. Im Anhang ist ein Bild der> Signalverläufe. Dort ist eine Störung zu erkennen die leider zu einem> flaschen Erkennen eine Flanke führt.
Dann ist aber ggf. auch deine Auswertung zu empfindlich oder gar falsch.
Denn ein Drehgeber wird NICHT mit Flankenauswertung betrieben
sondern über die Codefolge. Denn dadurch wird so eine Störung wie diese
kurzen Pulse bestenfalls als ein Schritt vor und zurück gewertet, die
Auswertung verliert aber keine Schritte.
> Ich hab schon die Signalleitungen verdrillt und auch 5V/GND verdrillt.
Schon mal ein Anfang.
> Zum Testen habe ich auch mal einen eher guten Encoder (PWB ME22)> getestet. Hier kommt es beim Auslesen am Teensy zu keinerlei> Impulsverlust.> Muss also an der Signalleitung liegen.
Komische Logik. Ich würde eher sagen, es liegt am Encoder.
Zeig uns ein Bild von deinem Gesamtaufbau und der Kabelführung. Ein
Schaltplan wäre auch fein.
> Anregungen wie ich die Encodersignale entstört bekomme?
Da der Störpuls deutlich kürzer als die normalen Pegelwechsel ist, kann
man ihn mit einem passenden RC-Tiefpass + Schmitt-Trigger filtern.
Jacko91 schrieb:> Muss also an der Signalleitung liegen.
Oder die ist der berühmte Tropfen, der das Fass zum überlaufen bringt.
> Anregungen wie ich die Encodersignale entstört bekomme?
Ich würde da mal mit einem Oszilloskop messen. Der LA zeigt doch ein arg
vereinfachtes Bild der Umwelt.
Aber eigentlich ist das Quadratursignal dank Gray-Codierung bei der
geeigneten Auswertung gegen solche Störungen immun und wird genau
deshalb dafür verwendet. Dort sieht man im unteren Screnshot, dass bei
richtiger Auslegung solche kurzen Spikes auf einer der beiden Spuren
nichts ausmachen:
http://www.lothar-miller.de/s9y/archives/53-Drehgeber,-Encoder,-Quadraturdecoder.html
In deinem Fall dürfte das Ding also schlimmstenfalls mal einen Schritt
hoch und sofort wieder runterzählen. Oder je nach Abtastzeitpunkt den
Störimpuls auch einfach "übersehen"...
Karl M. schrieb:> Nutze die Timer-Pollmethode zum Verarbeiten von Encodern.
Für handbediente Encoder ok.
Für Motor Encoder dürften die Timer der ARM (z.B. STM32) besser geeignet
sein. Die können in Hardware dekodieren.
Die kommen quasi ohne Prozessorlast klar.
Jacko91 schrieb:> Anregungen wie ich die Encodersignale entstört bekomme?
Bei einer korrekten Auswertung des Encoders machen solche Stör-Impulse
kein Problem.
Dein Problem ist also deine Auswertungsmethode, wohl flankenbasiert.
MaWin schrieb:> Oder mit ohne?
Auslesen der Timer und Über-/Unterläufe abhandeln wird Prozessorzeit
kosten.
Aber das weißt du doch genau!
Warum fragst du so doof?
> Für handbediente Encoder ok.> Für Motor Encoder dürften die Timer der ARM (z.B. STM32) besser geeignet
Quatsch mit Sosse. Ich hab schon solche Motorencoder in Software mit dem
Mega8 gemacht. Da lief der Timer mit 40khz fuer den Encoder. Ausserdem
waren Stromregelung, Geschwindigkeitsregler und Lageregler auch noch
drin. Damit konnte man so mit 1m/s auf 0.1mm positionieren
Olaf
Arduino Fanboy D. schrieb:> Karl M. schrieb:>> Nutze die Timer-Pollmethode zum Verarbeiten von Encodern.>> Für handbediente Encoder ok.
Auch für maschinengetriebe! Klar kommt man da irgendwann an Grenzen,
aber wo kommt man das nicht?
> Für Motor Encoder dürften die Timer der ARM (z.B. STM32) besser geeignet> sein. Die können in Hardware dekodieren.> Die kommen quasi ohne Prozessorlast klar.
So what! Für ein paar Dutzend kHz reicht auch noch eine Softwarelösung
(Timerinterrupt) auf einem Teensy.
Wow, danke für den vielen Input.
So Oszi Bild eines Channels im Anhang. Die Encoder habe ich derzeit an
3.3V VCC betrieben. Zusätzlich habe ich 4.7k Widerstände pro Channel auf
GND angeschlossen. Daher auch nicht 3.3V Amplitude sondern ca 2.2V beim
Bild des Oszis.
Um den Störungen bei der Auswertung entgegen zu wirken haben ich statt
Interrupt basierte Zählung auf abtasten der Digitalen Pins zu festen
Frequenzen gewechselt. Dazu nutze ich die Lib Altencoder. (hier noch der
Thread: https://forum.pjrc.com/threads/38736-Encoder)
Ein händischer Schaltplan ist auch angehängt.
Danke
Jacko91 schrieb:> So Oszi Bild eines Channels im Anhang.
Da hat irgendwer ein Darstellungsproblem... :/
Sieht aber eigentlich gar nicht so übel aus.
1
newEncoder(3,4),
2
newEncoder(5,6),
3
newEncoder(7,8),
4
newEncoder(9,10),
5
newEncoder(11,12),
6
newEncoder(14,15),
Du hast da gleich 6 von den Encodern dran?
Und du verlierst immer Schritte, also hast du niemals zu viele
gezählt?
Was passiert, wenn du nur 1 Encoder verwendest?
dann zeichne doch mal eben beide Kanäle gleichzeitig auf. Das Oszi wird
ja zwei Kanäle haben...
Wofür sind denn die 4.7K gegen GND? Ich hätte eher 1K gegen 3V3 gelegt.
Jacko91 schrieb:> Dort ist eine Störung zu erkennen die leider zu einem> flaschen Erkennen eine Flanke führt
Das spielt keine Rolle: bei korrekter Auswertung führt der Spike (der ja
aus 2 ! Flanken besteht) entweder dazu, dass der Zähler sich um 1 ändert
und sofort wieder zurück, oder der Spike wird komplett übersehen weil zu
kurz. Daher arbeiten Positioniersysteme mit Quadratur-Encodern auch im
industriellen Umfeld Stunden und Tage ohne sich zu verzählen, wovon man
sich an Millionen CNC-Maschinen überzeugen kann.
Für eine Eingabe als Poti-Ersatz ist das Verzählen zwar ziemlich egal,
aber es spricht ja auch nichts dagegen, die Encoder-Signale so
auszuwerten wie es dem Stand der Technik seit Jahrzehnten entspricht.
Und zusätzlich spricht auch nichts dagegen solche Störungen zu
vermeiden, z.B. durch passende Verkabelung.
Übel wird es natürlich, wenn sowohl die Hardware als auch die Auswertung
(egal ob durch Hard- oder Software) fehlerhaft entworfen sind, was hier
wohl der Fall ist.
Georg
georg schrieb:> Jacko91 schrieb:>> Dort ist eine Störung zu erkennen die leider zu einem>> flaschen Erkennen eine Flanke führt>> Das spielt keine Rolle: bei korrekter Auswertung führt der Spike (der ja> aus 2 ! Flanken besteht) entweder dazu, dass der Zähler sich um 1 ändert> und sofort wieder zurück, oder der Spike wird komplett übersehen weil zu> kurz. Daher arbeiten Positioniersysteme mit Quadratur-Encodern auch im> industriellen Umfeld Stunden und Tage ohne sich zu verzählen, wovon man> sich an Millionen CNC-Maschinen überzeugen kann.>> Für eine Eingabe als Poti-Ersatz ist das Verzählen zwar ziemlich egal,> aber es spricht ja auch nichts dagegen, die Encoder-Signale so> auszuwerten wie es dem Stand der Technik seit Jahrzehnten entspricht.> Und zusätzlich spricht auch nichts dagegen solche Störungen zu> vermeiden, z.B. durch passende Verkabelung.>> Übel wird es natürlich, wenn sowohl die Hardware als auch die Auswertung> (egal ob durch Hard- oder Software) fehlerhaft entworfen sind, was hier> wohl der Fall ist.>> Georg
Die verwendete Lib. (AltEncoder.h) ist an
https://www.mikrocontroller.net/articles/Drehgeber#Solide_L.C3.B6sung:_Beispielcode_in_C
angeleht. Würden Sie das nicht als gute Auswertung einstufen? Sonst
Alternative Quellen?
MaWin schrieb:> Jacko91 schrieb:>> encoder.ino (762 Bytes, 7 Downloads)>> Oh, eine Salamischeibe mehr.>> Die Encoderlib von luni verliert wohl Impulse.>> https://forum.pjrc.com/threads/45672-Can-a-teensy-3-5-handle-5-encoders-and-5-PIDs>> Er versteht ja nichtmal, warum man 16 bit volatile Werte auf 8 bit> Prozessoren nicht ohne locking lesen und schreiben darf.
Versteh ich leider nicht ganz, die variable counter in der AltEncoderlib
ist doch int, also 32bit. Oder was meinst du genau?
äxl schrieb:> dann zeichne doch mal eben beide Kanäle gleichzeitig auf. Das Oszi> wird> ja zwei Kanäle haben...> Wofür sind denn die 4.7K gegen GND? Ich hätte eher 1K gegen 3V3 gelegt.
Dies hatte ich aus
(https://electronics.stackexchange.com/questions/271869/removing-digital-noise-on-quadrature-encoder-signals).
Die Idee ist es etwas mehr Last auf die Leitung zu bringen. Wozu wäre
der pullup gedacht?
Lothar M. schrieb:> Jacko91 schrieb:>> Ich nutze derzeit nur einen Encoder.> Dann zeig doch mal deinen Code, der deinen Fehler produziert...
Ich nutze den BeispielCode, eben nur mit einem Encoder angeschlossen.
Danke
Jacko91 schrieb:>> Er versteht ja nichtmal, warum man 16 bit volatile Werte auf 8 bit>> Prozessoren nicht ohne locking lesen und schreiben darf.>> Versteh ich leider nicht ganz, die variable counter in der AltEncoderlib> ist doch int, also 32bit. Oder was meinst du genau?
Man muss die Variable atomar lesen und schreiben.
https://www.mikrocontroller.net/articles/Interrupt#Atomarer_Datenzugriff>> Wofür sind denn die 4.7K gegen GND? Ich hätte eher 1K gegen 3V3 gelegt.>> Dies hatte ich aus>
(https://electronics.stackexchange.com/questions/271869/removing-digital-noise-on-quadrature-encoder-signals).
> Die Idee ist es etwas mehr Last auf die Leitung zu bringen.
Unsinn. Wenn schon, dann den Pull-Up kleiner machen. Aber nicht Pull Up
UND Pull Sown WIderstand gleichzeitig!
> Wozu wäre> der pullup gedacht?
Eben darum, das Signal auf HIGH zu ziehen, wenn der Schalter im Encoder
öffnet.
> Ich nutze den BeispielCode, eben nur mit einem Encoder angeschlossen.
Verdammt nochmal, man zeigt den 100% Originalcode, nicht irgendwas, das
ungefähr so aussieht!
Jacko91 schrieb:> Ich nutze den BeispielCode, eben nur mit einem Encoder angeschlossen.
Dann laufen auch alle FSM der anderen Encoder in der ISR mit.
Instanziiere mal nur den einen, den du tatsächlich brauchst. Müssen ja
nicht gleich alle Lichter im Haus an sein, nur weil man mal in den
Keller muss...
Jacko91 schrieb:> Die Idee ist es etwas mehr Last auf die Leitung zu bringen. Wozu wäre> der pullup gedacht?
Es kommt auf den Ausgang deines Gebers an. Wenn das ein Open-Collector
Ausgang ist, dann zieht der Ausgang nur nach GND. Und für den High-Pegel
ist ein (externer) Pullup zuständig.
Jacko91 schrieb:> habe ich auch mal einen eher guten Encoder (PWB ME22) getestet.
Welche? PU oder LD?
Der PU hat einen internen Pullup mit 2,7k. Zeichen den mal zusammen mit
deinem Pulldown in deine Schaltung ein und du erkennst einen
Spanungsteiler für den High-Pegel. War es das, was du wolltest?
Jacko91 schrieb:> So Oszi Bild eines Channels im Anhang.
Welche High-Pegel hast du denn da? Echt nur etwa 2,5V? Erscheint mir
unnötig knapp für einen 3,3V-Eingang...
AltEncoder::Controller::begin(encoderList,5/*µs*/);// choose a sampling period which is at least a factor of two smaller than the shortest time between two encoder signal edges.
12
13
}
14
voidloop()
15
{
16
for(inti=0;i<1;i++)
17
{
18
Serial.println(encoderList[i]->counter);
19
}
20
delay(5);
21
}
Falk B. schrieb:> Jacko91 schrieb:>>>> Er versteht ja nichtmal, warum man 16 bit volatile Werte auf 8 bit>>> Prozessoren nicht ohne locking lesen und schreiben darf.>>>> Versteh ich leider nicht ganz, die variable counter in der AltEncoderlib>> ist doch int, also 32bit. Oder was meinst du genau?>> Man muss die Variable atomar lesen und schreiben.>> https://www.mikrocontroller.net/articles/Interrupt#Atomarer_Datenzugriff>
Das Teensy 3.5 nutzt einen ARM Cortex M4, 32Bit CPU. Memory Access ist
32Bit. Dürfte also kein Problem darstellen.
Lothar M. schrieb:> Es kommt auf den Ausgang deines Gebers an. Wenn das ein Open-Collector> Ausgang ist, dann zieht der Ausgang nur nach GND. Und für den High-Pegel> ist ein (externer) Pullup zuständig.
Es ist kein Open-Collector. Der IC am Encoder ist push pull.
Jacko91 schrieb:> this is the code I use:
Ja, wir wissen inzwischen daß du ALtEncoder von luni verwendest.
Nein, du hast immer noch nicht verstanden, daß der verlinkte Artikel
darauf hindeutet, daß IN der Library ein bug ist.
Immerhin kommt von dir versehentlich eine weitere Salamischeibe die du
bisher unterdrückt hast:
Jacko91 schrieb:> AltEncoder::Controller::begin(encoderList, 5/*µs*/);
5 dürfte zu kurz sein.
Jacko91 schrieb:> Der IC am Encoder ist push pull.
Warum kommt der dann nur auf 2,5V?
Jacko91 schrieb:> ein DC brushed Motor mit Hall Encoder.
Welcher denn? Und wie ist der versorgt?
Michael B. schrieb:> 5 dürfte zu kurz sein.
Das Encodersignal liegt bei ca 2kHz. Dann ist doch eine Abtastfrequenz
von 200kHz deutlich ausreichend. Dürfte auch mit deutlich weniger
fuktionieren.
Jacko91 schrieb:> Michael B. schrieb:>> 5 dürfte zu kurz sein.>> Das Encodersignal liegt bei ca 2kHz. Dann ist doch eine Abtastfrequenz> von 200kHz deutlich ausreichend.
Sicher, aber deine CPU wird bei 200kHz Interruptfrequenz arg ins
Schwitzen kommen. Oder macht das dort eine reiner Hardwaredecoder?
> Dürfte auch mit deutlich weniger fuktionieren.
Dann probier das mal!
Jacko91 schrieb:> Der IC am Encoder ist push pull.
Dann ist jegliche Diskussion über Pullup/-down für die Katz!
Der Gedanke daran ist flüssiger als Wasser. Überflüssig.
Falk B. schrieb:> Sicher, aber deine CPU wird bei 200kHz Interruptfrequenz arg ins> Schwitzen kommen. Oder macht das dort eine reiner Hardwaredecoder?>>> Dürfte auch mit deutlich weniger fuktionieren.>> Dann probier das mal!
ja hab es mit 5khz betrieben. Funktioniert soweit gut. Ne ist ein
Softwareinterrupt. Unnötig so eine hohe Interruptfrequenz zu haben. 5-10
mal schneller als die Encodersignale sind sollte ausreichend sein.
Absolut richtig. Erste Tests zeigen eine deutliche Verbesserung
Jacko91 schrieb:> Sorry, du hast recht, das ist ein open collector.
Dann hängt man da evtl. einen stärkeren Pullup mit dran, wenn es nötig
wird.
Aber keinen Pulldown.
Oder?
Lothar M. schrieb:> annmannmann, dass man sich jedes Salamischeibchen rausbetteln muss, das> macht das Helfen echt schwer.... :-/
Dann sollte man es ab und an auch mal lassen und den Kandidaten
weiterwurschteln lassen. Er muss gescheite Informationen liefern. Wenn
er das nicht kann oder will, Pech gehabt!
Jacko91 schrieb:> Dieser Pegel entsteht nur wenn ich den 4.7k anhänge. Ohne zusätzlichen> Widerstand ist der Pegel auf 3.3V.
Das würde MIR zu DENKEN geben!
Falk B. schrieb:> Lothar M. schrieb:>> annmannmann, dass man sich jedes Salamischeibchen rausbetteln muss, das>> macht das Helfen echt schwer.... :-/>> Dann sollte man es ab und an auch mal lassen und den Kandidaten> weiterwurschteln lassen. Er muss gescheite Informationen liefern. Wenn> er das nicht kann oder will, Pech gehabt!
Danke euch für die Hilfe, und sorry wenn ich nicht den vollen
Informationsgehalt geliefert habe. Bitte um Nachsicht. Wird nächstes Mal
voll umfänglich gemacht.
Falk B. schrieb:> Jacko91 schrieb:>> Dieser Pegel entsteht nur wenn ich den 4.7k anhänge. Ohne zusätzlichen>> Widerstand ist der Pegel auf 3.3V.>> Das würde MIR zu DENKEN geben!
Hmmm. Also eigentlich hat man da ja dann einen Spannungsteiler. 10k
Pullup und 4.7k Pulldown. Teilt die Spannung in ca 2.3V (zwischen
Messpunkt und 3.3V) und 1V (zwiscchen Messpunkt und GND).