PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Seltsames Phänomen mit Gabellichtschranken



Rabenauge
01.01.2021, 23:27
Hallöle.
Ich hab hier zwei Motoren (die berühmtem gelben TT-Motoren).
Motortreiber ist ein MX1508.

Unter den Motoren hockt jeweils eine Gabellichtschranke (fertige Module), und die werden von selber gedruckten Encoderscheiben auf der Abtriebswelle unterbrochen.
Die Scheiben haben 20 Öffnungen, das müsste also pro Radumdrehung 40 Ticks geben.
Ausgelesen wird per Interrupts:


attachInterrupt(digitalPinToInterrupt(odoLinksPin) , odometerLinks, CHANGE); // Gabellichtschranken an Interrupts
Die ISR haben ne kleine Entprellung (20ms) drin:


void odometerLinks() // ******************** ISR linkes Odometer ****************************************
{
if((millis() - alteZeitL) > entprellZeit) {
odoTickLinks ++;
alteZeitL = millis(); // letzte Schaltzeit merken
}


Das Testprogramm, was da läuft, sieht so aus:


void motorTest()
{
analogWrite(motorR1,255); // einmal Vollgas bitte
analogWrite(motorR2,0);
analogWrite(motorL1,255);
analogWrite(motorL2,0);
delay(3000);
analogWrite(motorR1,0); //alles stop
analogWrite(motorR2,0);
analogWrite(motorL1,0);
analogWrite(motorL2,0);


Serial.print("Links= "); // was haben wir denn da....
Serial.print(odoTickLinks);
Serial.print(" ");
Serial.print("Rechts= ");
Serial.println(odoTickRechts);
odoTickLinks=0; // Odos auf Null setzen
odoTickRechts=0;

Serial.println("Odometer zuerueckgesetzt!");
Serial.println();

Also nix besonderes: Motoren starten, 3 Sekunden laufen lassen, stoppen, die Odoticks ausgeben, zurücksetzen und das Ganze von vorne.
Das läuft auch, nur sieht die Ausgabe so aus:

35407

Das Ganze ist reproduzierbar- immer die ersten vier Male tauchen wesentlich weniger Odoticks auf als dann später.
Ausser den Odoticks, die in jeder Pause zurückgesetzt werden, wird _nichts_ im Programmablauf während der Zeit geändert.
Die Ausgabe der Odoticks nach dem zurücksetzen hab ich als Kontrolle eingebaut, weil ich dachte, das zurücksetzen klappt nicht- aber das tut es ja, wie man sieht.

Jemand eine Idee?

Moppi
02.01.2021, 07:26
Sieht so aus, als ob die eine kleine Zeit brauchen, bis die schneller drehen (Masse in Schwung bringen z.B.). Von Mal zu Mal werden die angezeigten Zählerstände größer: 126, 138, 139, 1017 dann scheint es zu nach unten und oben zu pendeln.

oberallgeier
02.01.2021, 09:02
N guten Morgen Sly,
und alles Gute im Neuen Jahr.


.. Ich hab hier zwei Motoren (die berühmtem gelben TT-Motoren) ..
.. analogWrite(motorR1,255); // einmal Vollgas bitte ..Also nix besonderes .. immer die ersten vier Male tauchen wesentlich weniger Odoticks auf als dann später ..

Das passt nach meinen Erfahrungen zu der Testaufgabe.

Ich hatte mit meiner ersten fahrenden Coladose beim Ausarbeiten der Regelung zum Bestimmen der Regelungsparameter umfangreiche Tests mit Sprungantworten (Drehzahländerung über die Zeit nach Bestromen der noch NICHT geregelten Motoren) durchgeführt. Dabei wurden immer die Ticks der Gabellichtschranken (https://www.roboternetz.de/community/threads/32293-DC-Kleinstmotor-mit-Getriebe-Drehsensor-5V-510-Upm?p=316156&viewfull=1#post316156) beider Fahrmotoren des Zweiräders mit Zeitwerten erfasst, gespeichert und nach Testende als Liste ausgegeben - genau wie Du das tust. Also keine Datenausgabe während der kurzen Hochfahrphase! Damit ist die Datenerfassung in einem sehr feinen Zeitraster möglich. Gesamter Zeitbedarf meist im zwei- bis dreistelligen Millisekundenbereich. Zeitbasis ein Timer mit 50µs-Interrupts ("tupsi" = TimerUnitsPerSensorInterrupt)

Die ersten Ergebnisse noch etwas diffus (https://www.roboternetz.de/community/threads/36121-Autonom-in-kleinen-Dosen-R2_D03-Nachfolger-R3D01?p=398840&viewfull=1#post398840). Später wurden zeitliche Unterschiede im Anfahrverhalten (https://www.roboternetz.de/community/threads/36121-Autonom-in-kleinen-Dosen-R2_D03-Nachfolger-R3D01?p=400139&viewfull=1#post400139) deutlicher. Mit einiger Erfahrung und einer besser - "gleichzeitigeren" - Ansteuerung der Motoren konnten die Daten sauberer erfasst bzw. dargestellt (https://www.roboternetz.de/community/threads/36121-Autonom-in-kleinen-Dosen-R2_D03-Nachfolger-R3D01?p=404730&viewfull=1#post404730) werden. Das Ziel waren möglichst genaue Werte zu Motorzeitkonstanten und Totzeiten (nicht nur vom Antriebsstrang sondern meist von Antrieb mit dem gesamten Gefährt!). Damit konnte ich nach dem ziemlich guten Regelungsbeitrag im RN-Wissen von waste et alii (https://rn-wissen.de/wiki/index.php?title=Regelungstechnik#Dimensionierung_n ach_Einstellregeln) für meine DC-angetriebenen (nicht Schrittmotoren) Gefährtchen wirklich gut passende Regelparameter errechnen - das ist aber dann ein anderer Abschnitt - wäre hier OT (geht etwa so weiter (https://www.roboternetz.de/community/threads/37518-Linie-Folgen?p=357670&viewfull=1#post357670) - siehe Regelschema und Diagramm . . .), hatte sich aber in den folgenden Projekten sehr bezahlt gemacht.

Wünsch Dir guten Fortgang!

Nachtrag: ein mögliches Drehzahl-Regelschema (https://www.roboternetz.de/wiki/uploads/Main/drehzahl2.gif) aus dem Forumswissen "Regelungstechnik"

RoboHolIC
02.01.2021, 11:54
In 3 Sekunden Zählzeit passen bei 20ms Entprellzeit maximal 150 +/-2 Inkrementierungen; mehr können das eigentlich nicht werden.

Eine Entprellung von 20 ms kommt mir unnötig lang vor, sollte das Ergebnis aber nur nach _unten_ verfälschen können.

Hast du nach der "Methode des genauen Hinsehens" mal abgeschätzt, wieviele Signalflanken in 3 Sekunden etwa auftreten können?

Willst du wirklich die Beschleunigungsphase mitzählen lassen, die Bremsphase aber abschneiden? Es könnten z.B. die Motoren gestartet werden, dann 1000ms Wartezeit zur Stabilisierung, dann Zähler nullen und Zeitmerker mit millis() initialisieren, dann 3000ms Meszeit. danach sofort Zählerstände kopieren, Motoren abschalten und die serielle Ausgabe abwickeln. (ggf. noch ein delay vor erneutem Messzyklus).

@Moppi, @oberallgeier: Sprungantworten und Trägheitsmomente scheinen hier nicht im Fokus zu stehen.

Rabenauge
02.01.2021, 12:04
Hm, Missverständnis: die Motoren drehen 3s Vollgas, dann werden sie gestoppt. Dort erfolgt die Ausgabe und anschliessend das Zurücksetzen der Zähler.
Dann wird der Zyklus wiederholt.
Die starten jedesmal aus dem Stand raus.

Getestet hab ich aufgebockt (naja, ich hatte Freddie II in der Hand..da konnten die Räder frei drehen), als ohne Last- die Motoren mussten nur die Encoderscheibchen und die Räder drehn.
Dass das aussieht, als würde da erst was hochlaufen, ist mir auch aufgefallen- kann aber nicht sein.
Ich hab sogar die Gegenprobe gemacht (um, auch wenns eh hirnrissig wäre, auch noch Sachen wie kalte Lager ausschliessen zu können): den Zyklus sechs-achtmal durchlaufen, das Programm gestoppt, und wieder neu gestartet- auch_dann_ ergeben die ersten vier Zyklen viel niedrigere Werte als die späteren.

Und, richtig vermutet, Jo: das Ganze war dazu gedacht, um rauszufinden, wieviele Ticks pro Zeiteinheit ich habe- die will ich nämlich als Basis für eine Regelung benutzen.
Grob sieht der Plan so aus, dass die PID-Regler einfach eine Sollgeschwindigkeit /Ticks/Zeiteinheit) vorgesetzt kriegen.
Theoretisch sollte, wenn die Regler gut eingestellt sind, die Fuhre dann schnurgerade fahren.

Moppi
02.01.2021, 12:28
Dann probiere doch mal folgendes und mache am Schleifenanfang auch das delay(3000) rein. So dass wirklich alles richtig zur Ruhe kommen kann, bevor es neu startet. Schau Dir die Werte dann noch mal an.

MfG

Rabenauge
02.01.2021, 17:34
Hab ich eben auch versucht.
Das Resultat bleibt das gleiche- mehr oder weniger (mal passiert es beim dritten Durchlauf, mal beim vierten).
Aber offenbar haut was mit dem entprellen nicht hin.
Im Anhang hab ich das Entprellen mal auf einer Seite komplett rausgenommen, das sieht dann schon besser *) aus.
35408

*) Allerdings bin ich skeptisch bei dem Wert: so weit ich es mit den Augen mitzählen konnte, gibts aktuell etwa 15 Umdrehungen in 3s.
Da die Odoscheiben nur 20 Fensterchen haben, und ich die Interrupts auf CHANGE stehen hab, dürften da nur ungefähr 600 Ticks rauskommen.
Das probiere ich gleich noch mal mit niedrigerer PWM, so dass ich mitzählen kann.
Aber vorher muss ich mal den Akku laden- Freddie ist ein ziemlicher Stromfresser...

Searcher
02.01.2021, 18:35
Vielleicht wird der Motortreiber warm und gibt dann mehr Strom ab :confused:

Gruß
Searcher

Moppi
02.01.2021, 18:41
Deine Encoderscheibe hat 20 Löcher. Erzeugt 40 Impulse pro Umdrehung, bei "change". Bei 4 Umdrehungen pro Sekunde bekommst Du 4 mal 40 Impulse, also 160 pro Sekunde. 1 durch 160 sind 0,00625. Also 6.25ms pro Impuls. bzw. 6250 µs. Wenn Impulse eintreffen und Du zählst nur einen Impuls alle 6ms, kann ein Rad nicht schneller drehen, als 4 Umdrehungen pro Sekunde. Bei 20ms Wartezeit kämst Du auf etwa 1 Umdrehung pro Sekunde. Wenn es langsamer dreht, sollten also alle Impulse gezählt werden. Etwa 15 Umdrehungen in 3s sind 5 Umdrehungen pro Sekunde. "entprellZeit" müsstest Du auf th. 5ms herunter setzen. Besser weniger, wenn Du denkst, dass es noch schneller drehen könnte.

MfG

Rabenauge
02.01.2021, 23:33
Das Problem scheint vom Tisch gefallen zu sein.
Mich hatte ja die ganze Zeit gewundert, wieso ich einen CHANGE-Interrupt überhaupt entprellen soll....
Nach meiner Logik ist das völlig unnötig- und es stimmt auch.

Auf die Spur des Übels (viel zu viele Ticks für die paar Umdrehungen) hat mich dann das hier (https://androminarobot.blogspot.com/2016/04/tutorial-sobre-el-encoder-fotoelectrico.html) geführt.
ich benutze zwar nicht genau diese Lichtschrankenmodule, aber bekanntlich gucken die Chinesen ja gerne voneinander ab, und die Bauteile auf dem Ding sehen meinen zu ähnlich, um es nicht einfach mal auszuprobieren...
Also hab ich kurzerhand mal nen Kondensator mit 100nF an den Stecker, zwischen Signal und Masse, gelötet.
Und schon funktionierts- entprellen erübrigt sich nun.

Bei ungefähr zehn Radumdrehungen hab ich rund 400 Impulse, das passt.
Auch bei höherer oder niedrigerer Geschwindigkeit sind die Impulszahlen stimmig.
Ich werd noch einige Tests veranstalten (mal ein Rad ne halbe Umdrehung drehen lassen, sowas), aber ich glaube, ich habs.

Falls wer ähnliche Probleme mit diesen Dingern hatte (Moppi-sagtest du nich neulich auch sowas..?)-einfach mal ausprobieren.

Moppi
03.01.2021, 08:01
wieso ich einen CHANGE-Interrupt überhaupt entprellen soll.... Nach meiner Logik ist das völlig unnötig- und es stimmt auch.

Du hattest schon selber mal an anderer Stelle mechanische Probleme angeführt, vielleicht erinnerst Du Dich.

Ich habe tatsächlich auch mal drüber nachgedacht, einen C anzulöten. Habe aber darin keinen Sinn gesehen. Ich habe mir Anfangs die Impulse auch mit einem Oszi angesehen und nichts gesehen, was mich verwundert hätte. Dies wären nur Signale, die zwischen LOW-und HIGH wechseln, also die mit ihrem Ausschlag diese Schwellen überschreiten. Man müsste dann auch wissen, welche Frequenz man filtern möchte. Bei den 3D-gedruckten Scheiben, wie die, die ich benutze, kommen noch Eigenheiten durch Ungenauigkeit des 3D-Drucks hinzu. Bzw. auch des Schrittmotors, eventuell fällt der in eine Vollschrittposition zurück, nachdem die Lichtschranke schon einen Signalwechsel hatte, was im ungünstigen Fall auch zu einer Doppelzählung führen kann. Ähnliche Probleme könnten auch bei normalen DC-Motoren auftreten, wenn die erst einmal Gewicht transportieren. Und wenn es durch das Profil oder andere Eigenheiten der Räder zustande kommt, dass nach Anhalten das Rad ein Tick zurückdreht. Dies Wackeln ist dann aber mechanisch bedingt.
Ich glaube aber, auf einen Tick mehr oder weniger kommt es dann praktisch nicht unbedingt an. Das hat auf eine Regelung kaum Einfluss. Wenn erst mal Hindernisse überfahren werden, könnte auch, wenn man zwischendrin stoppen muss, ein Zurückrollen stattfinden und wieder hat man mehr Ticks gezählt. Auch aufgrund der Belastung beim Überfahren von Hindernissen könnte man unterschiedlich viele Ticks zwischen den Rädern zählen. Vieles lässt sich dann auch durch Software kompensieren, wenn ein C hilft, ist es aber auch gut. Zumindest kann man in Zukunft daran verstärkt denken und schauen, ob ein C was nützen würde.

MfG

Rabenauge
03.01.2021, 09:27
Sehe ich ähnlich.
Ich meine, im Grunde ist es eine rein mechanische Lösung (und nich eben die beste, dazu müssten die Encoder wenigstens am Motor sitzen, und nich erst am Getriebeausgang).
Wenn sich Freddie II bewährt, kriegt der ordentliche TT-Motoren rein (die dann vielleicht auch mit Encodern am Motor, gibts ja welche bei DF robot).
Die jetztigen sind ohnehin recht schnell (ich musste mit der PWM runter auf 70, um die Radumdrehungen überhaupt mitzählen zu können).
In dem Link zu dem Blog waren Oszi-Screenshots, die das mit den Ripples zeigen, wenn man in höhere Auflösung umschaltet.

Heut muss ich erstmal arbeiten, aber danach schaue ich mal, wie präzise das jetzt wirklich funktioniert.

Moppi
03.01.2021, 10:02
Ich habe mir das jetzt mal ganz genau angeschaut, also so weit reingezoomt, wie es mir möglich war, ist eben nur ein günstiges Oszi. Ich habe das Signal im Betrieb gemessen, als die Motoren liefen. Dabei habe ich tatsächlich etwas gefunden, ich denke, das ist das, was in dem andern Beitrag auch gemeint war. Hier mal die Bilder:

https://www.roboternetz.de/community/attachment.php?attachmentid=35411&d=1609667413

Ich habe extra einen 100nF raus gesucht. Auf dem Breakout ist ein LM393 verbaut, mit zwei Komparatoren. Die erzeugen aber oft kein eindeutiges Signal auf der Platine. Der Ausgang springt auch mal schnell hin und her. Weiter rein zoomen in den zeitlichen Verlauf kann ich mit meinem Oszi nicht und erst dort sehe ich das. Die Ausschläge sind auch sehr groß. Dieses Verhalten zeigt sich bei fallenden und steigenden Flanken. Mit einem nachgeschalteten 100nF sieht es dann besser aus. Wie es aussieht, überbrückt er die Zeit, in der diese unerwünschten Zustände aufreten.

Nachtrag:

Noch was, folgend, wie ich dieses Signal per Software auswerte.
Ich arbeite mit einer variablen Frequenz über einen Timer. Ähnlich wie das Oszi eigentlich, nur mit einer viel geringeren Auflösung (diese Frequenz bestimmt die Schrittgeschwindigkeit meines Motors). Maximal kann ein Intervall der ISR aber etwa 10µs kurz sein (meist viel länger).
Beim ersten Auftreten des Timer-Interrupts frage ich das Signal der Lichtschranke ab, wenn das nicht denselben Zustand hat (0 oder 1), wie bei der letzten Abfrage, wird dieser Wechsel (von 0 auf 1 oder 1 auf 0) nicht gezählt. Also die erste Abfrage erfolgt und das Signal wird gespeichert, bei Zeitpunkt "0". Bei Zeit "10µs" erfolgt die nächste Abfrage, ergibt die dasselbe Ergebnis, wird dieses Ereignis gezählt. Damit muss ein Signal stabil für mindestens 10µs anliegen. Ist das Signal vor den 10µs ein anderes, als danach, wird der neue Zustand, nach den 10µs, gespeichert, aber das Ereignis eben nicht gezählt. Je langsamer die Motoren drehen, desto größer wird der Zeitabstand bis zum Erfassen des Eingangszustandes. Somit habe ich die Entprellung, die man hier, für das oben gezeigte Beispiel, auch durch einen Kondensator bekommen kann.

Rabenauge
03.01.2021, 15:16
Auch ne Idee, deine Entprellung....die merk ich mir mal.

Zu deinem Oszi: ist das so ein DSO 138?
Das Ding interessiert mich nämlich auch...

Moppi
03.01.2021, 15:44
Ja, DSO Shell und irgend eine Nummer bei der Firmware. Letztens hatte ich Probleme wollte, zwei Signale vergleichen. Hat aber keine zwei Tastköpfe. Das ist nur ganz einfach gehalten, mit Kroko-Klemmen. Wenn man das Oszi mit Batterie betreibt, bekommt man weniger Störungen im Signal, da ist ein Netzteil dazu, aber dann hat man eben mehr Störungen. Das DSO liefert nie eine saubere stabile Nulllinie, da ist immer irgendwas dabei. Muss man sich dran gewöhnen. Vielleicht kaufe ich mal ein etwas Besseres, als dieses.

MfG