Hallo Alle,
Zitat von
damaltor
hrhr, der ist ja schnucklig... damit wir weiter mitverfolgen können.
Danke damaltor. Es ging - zwei vor und einer zurück. Schritte. Also ein bisschen Fortschritt und ein Beinahe-Flop-des-Monats (aber es floppt noch und der Monat ist noch brandneu). Will sagen: Es ging zäh, aber immerhin.
Die Abstandsmessung mit mehreren irDME´s nach der Grundidee von waste und Sternthaler läuft zu meiner Zufriedenheit. Und ich habe sogar interessante Details entdeckt, siehe Link. Die Routine läuft im Interrupt und braucht für alle drei Sensoren und für insgesamt je sechs Messungen pro Sensor und Sekunde 1,2 % der CPU-Zeit.
Hier die Testkonfiguration:......... Bild hier
Man sieht angeklammert an die obere Abschlussplatine mit dem Servo, auf den später der Sharp kommt, links oben die drei Miniplatinchen mit der SFH415/SFH5110-Kombination ( japanische Klemmmontage à la Geisha-Frisur ). Das ist wirklich nur zum Testen so angebracht - auch der Sharp-Sensor wird später nicht senkrecht, sondern leicht schräg nach unten sehen. Anmerkung: die beiden LED´s am I2C-Stecker sind praktisch: im Bild hängt der Tastkopf des Oskars dran um den Zeitbedarf einer Routine zu messen.
Die Motoren laufen. Der eine deutlich flotter bzw. leichter als der andere. Der braucht also nur den halben bis dritttel OCR0x Wert. Ich habe die Motoren mit verschiedenen Werten angesteuert und das Teil fuhr in der Testkonfiguration, also ohne Dose, ganz hübsch rum. Leider noch ohne Geschwindigkeitsregelung. Also kam einiges dazu: Sprungantwort aufnehmen (separates Testprogramm), Sprungantwort ausmessen bzw. auswerten und so weiter - eben Regelungsparameter bestimmen.
Dann, nachdem ich wochenlang (na ja, es waren schon etliche Tage; Anmerkung: Regelungstechnik im Studium 4,0) mich mit den theoretischen Grundlagen der Regelungstechnik beschäftigt hatte, um den Code für die Regelung zu programmieren, habe ich mich mal ans Programmieren gemacht. Jämmerlich - die Routine brauchte mit der floating point Rechnung so elend viel Zeit, über zwei bis drei Millisekunden.
y12 = 5 * e_mot12 + 0.6 * esum12;
das dauert in floating point 2 bis 2,5 ms und ist für eine ISR nun wirklich zu lange.
Ich hatte programmiert, getestet, Zeit gemessen, Code optimiert, getestet . . . und so weiter. Schließlich hatte ich das ganze in Integer programmiert, ein bisschen tricky mit den Parametern - und es läuft . . . . in einem prächtigen Geradeauslauf. Obwohl also die beiden Antriebe deutlich unterschiedliche Ansteuerungswerte benötigen und auch markant unterschiedliche Zeitkonstanten haben (12 und 8 ms), laufen sie mit identischem Code in der Regelung so, dass ich beim einfachen Geradeauslauf über max. 1 m noch keine Abweichung festgestellt hatte - so +/- wenige Millimeter - genauer kann ich es derzeit nicht messen. Ausserdem wäre mir dazu die Zeit zu schade. Die ganze Routine dauert mittlerweile zwischen Aufruf der Routine bis zur abgeschlossenen Rückkehr (getestet ohne Interrupt) deutlich weniger als 50 µs und damit deutlich weniger als die kürzeste ISR. Auch das könnte ich als hübschen Erfolg zählen.
Die Sensoren haben auch brav sensort und die Motoren motort und das Ganze lief brav auf der Tischplatte, bis die Sensoren ein Hindernis erkannten (es funktioniert mit drastisch reduziertem Abstand sogar bei entsprechend hohen Gläsern!). Dann stoppte das Vehikel, machte eine 60°-Drehung "rückwärts auf dem linken Rad" - also nur das rechte läuft rückwärts - genau
Code:
while ( 1 )
{
if ( Iencdr0 >= 1068) break;
}
. . . genau 60° . Also weitermachen.
Für einen Zusammenbau mit "Karosserie" - die Dose ist ja ein gewisser Pfiff an der Sache - musste ich meine IR-Sensoren montieren, nachdem die ganze Elektronik in die Dose eingeführt wurde. Einfach weil die Elektronik - Akkus, Steuerungsplatine, Servo etc. von unten eingefädelt werden, aber die Sensoren sollen oben rausschauen und schräg nach unten linsen, das ist ja im Testaufbau im Bild oben angedeutet. Also musste ich eine Zwischenplatine einbauen - mit Zwischenstecker und den ummontierten Sensoren (vorläufig noch an biegsamen Flachkabeln).
Zwischenplatine + Stecker:........Bild hier
Die Platine wird auf den geänderten Grundaufbau gesteckt. Das geht eben auch, wenn der Rumpf in der Dose steckt .
.................................................. .Bild hier
Seit dieser Zeit funktioniert die Sache ohne Zwischenplatine - - - aber mit Zwischenplatine schiesse ich regelmässig ein bis zwei Infrarotdioden. Schiessen ist das richtige Wort - na ja, eine CQY99 glüht einfach auf und stirbt mit Gestank, aber die vorwiegend verwendeten SFH415 schiessen mit lautem Knall ihre vordere Linse weg. Und ich habe gemessen und gemessen und die Platine geprüft und geändert und Kurzschlüsse entfernt - im Moment läuft nix - ausser dass wieder LED´s mit lautem Knall sterben. Aber - bisher hatte ich noch jeden Fehler gefunden. Übrigens: die LEDs leben "ewig" wenn ich sie in die Buchsenleiste des Rumpfteils stecke. Irgendwo habe ich einen Kurzen in der Zwischenplatine .
Trotzdem habe ich die Weiterarbeit etwas unterbrochen (die irLED´s sind alle ) und die Zeit genutzt diesen langatmigen Bericht zu schreiben.
Viele Grüße mit Gewitterknallen - das klingt viel angenehmer als geschossene LED´s.
Lesezeichen