Liste der Anhänge anzeigen (Anzahl: 1)
PollSwitch() beeinflußt unangenehm die encoder[]-Werte
Hallo marvin,
ich glaube da gibt es ein heftiges Problem in der Lib.
Denn PollSwitch() beeinflußt unangenehm die encoder[]-Werte. Obwohl dies doch die Verwendung von autoencode verhindern sollte.
Ich habe mal die Werte von WHEEL_LEFT und WHEEL_RIGHT in Deiner Interrupt-Routine recorded. Während dessen habe ich 6 mal (um den Effekt hier deutlicher zu zeigen) PollSwitch() aufgerufen. In der angehängten Grafik sieht man den desaströsen Effekt auf die WHEEL_LEFT- und WHEEL_RIGHT-Werte. Entsprechend falsch erhöhen sich dadurch die encoder[]-Werte rasant.
(In meiner konkreten Anwendung, flippt mein PID Regler durch diesen falschen Input, genau in dem Augenblick aus, wo er eigentlich vor einer Wand zum halten kommen sollte :( )
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo marvin,
ok, habe ich gemacht. Siehe patch.zip Datei im Anhang.
Ich bin ausgegangen von eurer SVN Revision 192. Im Patch befinden sich nur die Änderungen welche relativ zu dieser Revision notwendig sind. Das sind 7 geänderte Dateien plus eine readme.txt.
Durch diese Änderung sind alle ADC auf Interrupt umgestellt. Dabei habe ich besonders auf die Rückwärtskompatibilität geachtet.
Die encoder werden weiter unterstützt allerdings so verbessert wie von mir hier in
https://www.roboternetz.de/phpBB2/ze...=367880#367880
vorgestellt.
Die gesammelten Kommentare zum Patch finden sich in der Datei readme.txt.
Ich hoffe es gefällt Dir.
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo rossir,
ich habe mal einen Blick in deinen Code geworfen.
Schon mal vorab: Mir gefällt vor allem deine intergrierte Gleitwertberechnung für die TIK-Zählerei.
Eine Anmerkung zu der Reihenfolge in asuro.c Init() beim Setzen von ADCSRA und ADMUX. Sollte man nicht umgedreht vorgehen da du mit ADFR und ADSC den Wandler ja schon im 'free running'-Mode startest ohne vorher explizit den Kanal ausgewählt zu haben.
Das folgende sei() erlaubt dann ja nur noch, dass der ADC auch in der Interruptfunktion ankommt.
Ansonsten finde ich extreme Ähnlichkeiten in deinem Aufbau wie ich es schon seit einiger Zeit auch mache.
Auslagern der Datenermittlung in den Interrupt und die 'alten' Funktionen liefern nur noch die Ergebnisse aus der Variablen adcValue[].
Hierzu noch ein Tip. Diese Variable sollte als volatile angelegt werden und in den 'alten' Funktionen sollte vor dem Zugriff auf die Variable der Interrupt gesperrt und danach wieder zugelassen werden.
Liegt daran, dass du sinnvollerweise int-Daten nutzt, die aber dann mehrere Maschinenzyclen zum Auslesen benötigen und somit vom ADC-Interrupt mittendrin unterbrochen werden können. Ein Byte also vom vorletzten ADC-Wert, das andere Byte aber schon vom letzten ADC-Wert.
Hat mich etliche graue Haare gekostet diesen Sachverhalt in der ATmega-Doku zu finden um diese unerwarteten falschen ADC-Werte zu finden.
Ansonsten könnte ich hier noch etwas zu Zeiten beim Ein-/Ausschalten der Sensorbeleuchtungs-LEDs und anderem los werden, aber da kannst du mal bei mir nachsehen. Kommentare sind reichlich vorhanden.
Vorsicht falls du das Programm laufen lässt. Der Asuro fährt mit ein paar Kurven ca. 3-4 Meter weit.
Gruß Sternthaler