- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 9 von 9

Thema: ASURO - Odometrie funktioniert nicht richtig

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.05.2005
    Ort
    Stuttgart
    Beiträge
    260

    ASURO - Odometrie funktioniert nicht richtig

    Hio. Also ich habe nur Probleme mit den Odometriezähler von Asuro. Als nach einiger Zeit immer noch jedes Programm das mit den Odometriezähler gearbeitet hat, hab ich mal einen kleinen Test durchgeführt und bekamm bizarre Ergebnisse.
    Ich hab den Programmcode im Anhang drin. (Falls sich jemand wundert: Das ist die erweiterte Bibliothek von Weja. Ich hab noch ein bisschen dran gebastelt und alles Kommentiert.). Wenn man jetzt unter Windows HyperTerminal startet und auf Empfang geht, wird man sich schnell wundern. Der Asuro dreht sich ganz langsam und gibt die aktuellen Odometriwerte auf der Konsole aus. Allerdings gibt's da manchmal extreme Sprünge (also von 18 auf 250). Woran liegt das? Selbst wenn ich das Ding anschalte und es dann festhalte (es sich also nicht bewegt) gibt Asuro schon einen Wert > 0 zurück!?! Hää!? Kann mir da vielleicht jemand helfen. Ich wäre ihm sehr dankbar!
    Im Anhang ist der Code. Ich habe noch ein paar Fragen dazu:
    Linie 63: Wiese wird toggle nicht erst initialisiert? Wieso ist toggle static und was bedeutet static? Wiso wird der AD-Wandler so ausgelesen? Da sind doch immer 2 Schritte nötig (x = ADCL; und x += (ADCH<<8);)?!?
    Linie 70 & 75: Wiso werden da nur so kleine Werte getestet? Ich dachte die liegen zw. 0 und 1023?
    Was ist ADLAR und was bewirkt es?

    Danke für eure Hilfe. Lutz
    Angehängte Dateien Angehängte Dateien

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    16.05.2005
    Beiträge
    734
    Hallo luma

    static bedeutet dass die Variable ihren Wert auch nach Verlassen der Routine behält. Das muss so sein, sonst wäre toggle nach jedem neuen Aufruf 0.
    In der Routine wird der AD-Wandler linksbündig ausgelesen (ADLAR = 1). Dann reicht es, wenn man nur die 8 höchstwertigen Bits ausliest und auf die 2 niederwertigsten verzichtet. Deshalb wird auch nur auf 128 getestet. Für eine detailierte Erklärung, such im Datenblatt nach ADLAR.

    Zu deinem eigentlichen Problem kann ich nichts sagen, hab dein Programm nicht getestet.

    Waste

  3. #3

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    16.05.2005
    Beiträge
    734
    Bei mir sind auch schon Anfangswerte zu sehen. Probier mal meine angehängte hex-Datei. Die sollte funktionieren. Wenn sie bei dir auch funktioniert, dann kommen wir der Ursache hoffentlich bald näher.

    Waste
    Angehängte Dateien Angehängte Dateien

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.05.2005
    Ort
    Stuttgart
    Beiträge
    260
    Hio waste. Das Programm funktioniert wunderbar! Hast du mir vielleicht den Code dazu? Hab noch ne kleine Abdeckung in Form von 2 Tesastreifen über die Lichtschrankenbauteile geklebt und die dann geschwärtzt so das von Außen kein/wenig Licht den Fototransistor erreicht.
    Also, schick mir doch bitte den Code.

    Lutz

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    16.05.2005
    Beiträge
    734
    Ich hab dein Programm genommen und auf die Funktionen der originalen asuro.c zurück geändert (siehe Code) und dann mit den ursprünglichen asuro.c und asuro.h compiliert.

    Irgendwo hast du bei deinen Änderungen in asuro.c oder asuro.h einen Bug eingebaut.

    Waste
    Code:
    #include "asuro.h"
    
    int main(void)
    {
    	Init();
    	Encoder_Init();
    	
    	StartSwitch();
    	MotorDir(FWD, BREAK);
    	MotorSpeed(101, 0);
    	do
    	{
    		PrintInt(encoder[0]);
    		PrintInt(encoder[1]);
    	}
    	while(!switched);
    	MotorSpeed(0, 0);
    	
    	return 0;
    }

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.05.2005
    Ort
    Stuttgart
    Beiträge
    260
    Hio. Ich hatte einfach ne zu kleine Zahl bei der if-Abfrage in der ADC-... IRS (normal 160, ich 12. Wär wohl besser wenn man den ganzen Wert aus dem AD-Wandler auslesen würde und nicht nur einen Teil. Wie macht man denn das?

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    16.05.2005
    Beiträge
    734
    Zitat Zitat von luma
    Wär wohl besser wenn man den ganzen Wert aus dem AD-Wandler auslesen würde und nicht nur einen Teil. Wie macht man denn das?
    Indem ADLAR nicht auf 1 gesetzt wird und der ADC folgendermassen ausgelesen wird:
    Code:
    data = ADCL + (ADCH << 8);
    Siehe auch die Funktion OdometrieData, da wird es so gemacht.

    Ich würde auch noch eine Hysterese einbauen und den unteren Wert auf < 550 und den oberen Wert auf > 650 abfragen.

    Waste

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.05.2005
    Ort
    Stuttgart
    Beiträge
    260
    data = ADCL + (ADCH << 8);
    Das hatte ich schon probiert.

    Ich würde auch noch eine Hysterese einbauen und den unteren Wert auf < 550 und den oberen Wert auf > 650 abfragen.
    Weil ich das machen wollte.

    Hatte aber nicht funktioniert weil ich das nicht hatte:
    Indem ADLAR nicht auf 1 gesetzt wird
    ;)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test