-         

Ergebnis 1 bis 4 von 4

Thema: Balancierender Roboter(HILFE!!SOS!!!HILFE!!)

  1. #1

    Balancierender Roboter(HILFE!!SOS!!!HILFE!!)

    Anzeige

    Hallo liebe Leute!

    Ich habe mich soeben hier in diesem Forum angemeldet, und das nicht grundlos! Mein Kollege und ich benötigen Hilfe bei der Realisierung unseres Balancierenden Roboters. Da wir beide absolute Grünschnäbel auf dem Gebiet der Microcontrollerprogrammierung sind benötigen wir nun fachmännische Hilfe.Dieses Projekt ist im Rahmen unserer Technikerausbildung zu realisieren. Die Hardware steht und scheint auch soweit richtig miteinander verbunden zu sein.
    Wir haben einen Beschleunigungssensor des Typs "adxl335" verbaut sowie eine H-Brücke mini Motortreiber tb6612fng.Diese sind mit einem Atmega 8 (MK2 Board) verbunden.
    Gänzlich falsch scheint unser Programm nicht zu sein, da der Motor bei einer ca 90° zu zucken beginnt, also einen Richtungswechsel vollzieht, allerdings sieht dies noch recht willkührlich aus.Was und wie es programmtechnisch zu verbessern ist, wissen wir nicht mehr. Wer kann uns Grünschnäbeln helfen?Wer hat Erfahrung damit?
    Hier ist unser Quellcode:


    #include <avr/io.h> // Header-Datei "io.h" einbinden

    int32_t adwert; // Variable in die der Rueckgabewert der Auslese-Funktion
    // geschrieben wird
    int32_t i; // Variable i deklarieren
    char buffer[20]; // String der L?nge 20 Zeichen deklarieren.

    // ----------------------------------------------------------------------------------------------
    // Unterprogramm "Sende"- Senden von Zeichenketten ?ber den UART --------------------------------
    // ----------------------------------------------------------------------------------------------

    void sende (char buffer[]) // Funktionsaufruf zum ?bermitteln einer Zeichenfolge
    {
    for (int i=0; buffer[i]!=0; i++) // for-Schleife: Abbruch wenn Zeichenfolge
    { // zu Ende ist, sonst "i" inkrementieren
    while (bit_is_clear(UCSRA,5)) // Solange Zeichen noch nicht vollst?ndig ?bermittelt.
    {
    ; // tue nichts! (warte)
    }
    UDR=buffer[i]; // Danach: Sende aktuelles ("i"-tes) Zeichen der Zeichenkette.
    }
    }

    // ----------------------------------------------------------------------------------------------
    // Unterprogramm "Zurück fahren des Roboters-----------------------------------------------------
    // ----------------------------------------------------------------------------------------------


    // ----------------------------------------------------------------------------------------------
    // Unterprogramm "VOR fahren des Roboters--------------------------------------------------------
    // ----------------------------------------------------------------------------------------------
    int Vor()
    {
    uint16_t ergebnis = 0; // Variable ergebnis deklarieren und auf 0 setzen.

    ADMUX |= (1<<REFS1)|(1<<REFS0); // Register ADMUX des AD-Wandlers: Nutzung der internen
    // Referenzspannung.

    ADCSR = 0b11000101; // Register ADMUX des AD-Wandlers: Frequenzvorteiler auf
    // 32 setzen und AD-Wandler aktivieren.

    while (bit_is_set(ADCSR,6)); // Warten, bis Umwandlung erfolgt ist: (ADCSR-Bit 6 ist dann "1".)

    ergebnis = ADCW; // AD-Wandlungs-Ergebnis in ADCW wird Variable "ergebnis" zugewiesen.

    return ergebnis; // Wert von ergebnis wird an die Funktion (hier "lese()" )
    // uebergeben.
    }

    // ----------------------------------------------------------------------------------------------
    // Unterprogramm "LESE"-Lesen des Poti-Wertes mit dem ADC----------------------------------------
    // ----------------------------------------------------------------------------------------------
    int lese()
    {
    uint16_t ergebnis = 0; // Variable ergebnis deklarieren und auf 0 setzen.

    ADMUX |= (1<<REFS1)|(1<<REFS0); // Register ADMUX des AD-Wandlers: Nutzung der internen
    // Referenzspannung.

    ADCSR = 0b11000101; // Register ADMUX des AD-Wandlers: Frequenzvorteiler auf
    // 32 setzen und AD-Wandler aktivieren.

    while (bit_is_set(ADCSR,6)); // Warten, bis Umwandlung erfolgt ist: (ADCSR-Bit 6 ist dann "1".)

    ergebnis = ADCW; // AD-Wandlungs-Ergebnis in ADCW wird Variable "ergebnis" zugewiesen.

    return ergebnis; // Wert von ergebnis wird an die Funktion (hier "lese()" )
    // uebergeben.
    }

    // ----------------------------------------------------------------------------------------------
    // Hauptprogramm --------------------------------------------------------------------------------
    // ----------------------------------------------------------------------------------------------

    int main(void)


    //UnknownType TCCR0A;
    //UnknownType TCCR0B;

    {
    UBRRL = 23; // Quarz: 3.6864MHz, Baudrate 9600

    UCSRB = 0b10011000; // Empf?nger, Sender ein UCR = UCSRB


    //-----------------------MOTOR-A----------------------
    TCCR1A = 0b10000011; // Timer1: 10Bit-PWM-Modus, Aufloesung=1024, nicht invertierende PWM.

    TCCR1B = 0b00000001; // Timer1: Aktivieren mit Prescaler 1, also k e i n e Frequenzteilung.

    //-----------------------MOTOR-A----------------------
    //geht nicht warum TCCR0A = 0b10000011; // Timer1: 10Bit-PWM-Modus, Aufloesung=1024, nicht invertierende PWM.

    //scheinbar gibts den tccr0 nicht TCCR0B = 0b00000001; // Timer1: Aktivieren mit Prescaler 1, also k e i n e Frequenzteilung.



    DDRB = 0b00000010; // Ausgang PB1 fuer PWM-Signal Timer1 initialisieren. (vgl. Datenblatt: OC1A)
    DDRD = 0b01001000; // Die Motorsteuerports werden initialisiert

    DDRC = 0b00000000; // Eingang PC0 (ADC0, Potentiometer) initialisieren. (vgl. Pinout Atmega



    while(1)

    {
    if(adwert < 900) {
    PORTD &= (1<<6);
    PORTD &= (1<<4);
    PORTD |= (1<<7);
    PORTD |= (1<<5);

    } else {

    PORTD &= (1<<7);
    PORTD &= (1<<5);
    PORTD |= (1<<6);
    PORTD |= (1<<4);
    }

    //PORTD |= (1<<4); // Richtung des Motors
    //PORTD |= (1<<6); // Richtung des Motors

    adwert = lese(); // Wert des AD-Wandlers aus Unterprogramm "lese()" holen.

    OCR1A = 1023; // Der gelesene Wert wird dem PWM-Vergleichswert OCR1A uebergeben.
    // Timer läuft im Hintergrund.





    sprintf(buffer, "ADC-Wert: %d #", adwert); // Der sprintf-Befehl schreibt die Dezimalwerte
    // in eine Zeichenkette um, buffer ist der Speicher der Funktion und muss
    // ausreichend gro? sein. %d ist Platzhalter f?r die umgewandelte Dezimalzahl;
    // "#" dient dem Zeilenumbruch.

    sende(buffer); // Aufruf des Unterprogramms sende. ?bergabe der Zeichenfolge buffer.

    }

    }
    // ----------------------------------------------------------------------------------------------------

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.186
    Warum den adwert als int32, ein unsigned int tut es auch.
    Den ADC initialisiert man nur einmal und nicht bei jedem Lesevorgang neu.
    Was gibt der UART aus?
    PORTD &= (1<<6); Ich nehme mal an das dieses Bit auf 0 gesetzt werden soll.
    PORTD &= ~(1<<6); Es sollte dann so sein.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  3. #3
    Benutzer Stammmitglied Avatar von Hardware-Entwickler
    Registriert seit
    18.12.2013
    Ort
    BaWü
    Alter
    27
    Beiträge
    44
    Servus,
    ich habe mir den Code jetzt nicht angeschaut, aber ihr wisst dass es sich um eine regelungstechnische Aufgabe handelt?!
    Stichwort "Inverses Pendel".

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    59
    Beiträge
    2.435
    Hallo snoopy82,

    Als allererstes müsst ihr mal die mathematische Seite aufstellen, also nicht einfach drauf los programmieren.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

Ähnliche Themen

  1. Balancierender Roboter
    Von Zwerwelfliescher im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 9
    Letzter Beitrag: 11.10.2010, 01:24
  2. Balancierender Roboter
    Von the_mephisto im Forum Vorstellungen+Bilder von fertigen Projekten/Bots
    Antworten: 10
    Letzter Beitrag: 27.03.2010, 21:40
  3. balancierender Roboter
    Von kehrblech im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 22
    Letzter Beitrag: 14.06.2008, 17:28
  4. Balancierender Roboter
    Von blan im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 5
    Letzter Beitrag: 10.03.2007, 10:37
  5. SOS - Brauche Hilfe
    Von Rollimen im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 02.04.2005, 14:04

Stichworte

Berechtigungen

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