-
        

Ergebnis 1 bis 8 von 8

Thema: Motor ohne Library starten

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    05.03.2014
    Beiträge
    8

    Motor ohne Library starten

    Anzeige

    Hallo,

    ich würde gern den rechten Motor ohne die Asuro.c steuern.
    Dazu verwende ich folgenden Code:

    Code:
    #include <asuro.h>
    
    int main(void) {
       Init();
       while (1) {
             //Rechter Motor
    
             DDRB |= ((1 << PB2) | (1 << PB4) | (1 << PB5));      //als Ausgang festlegen
             PORTB |= ((1 << PB4) | (1 << PB2));                  //auf 5V setzen, Transistor T8 schaltet
             PORTB &= ~(1 << PB5);                                //auf 0V setzen, Transistor T5 schaltet
       }
       while (1) {}
       return 0;
    }
    Nun hätte ich erwartet, dass sich der rechte Motor dreht, mit voller Geschwindigkeit. Macht er aber nicht.
    Hat jemand einen Tipp, wo mein Denkfehler liegt?

    gruß
    Andi

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Lass doch mal das Init() weg. Ich vermute, dass der OC1B-Ausgang dadurch aktiviert wird (durch die PWM-Funktion der Library) und dein HIGH an PB2 überschreibt:

    Code:
    ...
    	// for PWM (8-Bit PWM) on OC1A & OC1B
    	TCCR1A = (1 << WGM10) | (1 << COM1A1) | (1 << COM1B1);
    	// tmr1 running on MCU clock/8 
    	TCCR1B = (1 << CS11);
    ...
    	MotorDir(FWD,FWD);
    	MotorSpeed(0,0);
    (Aus Init() in asuro.c)

    Und dann wird bei MotorSpeed(0,0) das PWM-Signal auf Dauerlow gesetzt...

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    05.03.2014
    Beiträge
    8
    Danke für die schnelle Antwort, radbruch.
    Daran habe ich nicht gedacht.
    Motor dreht nun mit voller Geschwindigkeit.

    Gibt es irgendwo eine gute Anleitung wie man nun mittels Timer und PWM die Geschwindigkeit anpassen kann?
    Werde aber nicht so richtig schlau aus den Befehlen in der Asuro lib, also aus
    Code:
    OCR1B
    Code:
    _SFR_IO16(0x28)
    Code:
    #define _SFR_IO16(io_addr) ((io_addr) + __SFR_OFFSET)
    Gibt es dazu vielleicht eine verständliche Erklärung?

    gruß
    Andi

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.265
    Schau dir in einem AVR Tutorial (Kleiner Tipp schau auf mikrocontroller.net) und im Datenblatt vom Kontroller an wie man den Timer verwendet.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    05.03.2014
    Beiträge
    8
    Kann jemand erklären, was OCR macht und wie es definiert ist?

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.265
    Siehe:
    http://www.atmel.com/Images/Atmel-24..._datasheet.pdf
    Seite 75 ff.

    Und:
    https://www.mikrocontroller.net/arti...A4hler_des_AVR

    OCR1 ist das Output Compare Register des 16bit Timers des Atmega 8.
    Definiert wird es in der AVR standard Library und ist im Hintergrund nicht mehr als eine Speicheradresse.

    Genau das gleiche Thema wurde außerdem hier behandelt:
    http://www.roboternetz.de/community/...ignal-erzeugen
    Geändert von shedepe (11.03.2014 um 20:31 Uhr)

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    05.03.2014
    Beiträge
    8
    Habe es nun einigermaßen hinbekommen.

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    int main(void) {
       TCCR1A|= ((1 << WGM10) | (1 << COM1B1));      //PWM, Phasenkorrekt, 8-Bit, lösche OC1B wenn CompareMatch beim hochzählen, setze beim herunterzählen
       TCCR1B|= (1 << CS11);                         //PreScale 8 8000000Hz/8=1000000Hz, da 8-Bit: 1000000/256=3906,25Hz->3906,25 mal wird von 0..255 gezählt
       OCR1B=130;                                    //Hier Wert zwischen 0..255 für Geschwindigkeit
       TIMSK|= ((1 << TOIE1) | (1 << OCIE1B));       //Overflow Interrupt erlauben, wird nicht benötigt
       DDRB|= ((1 << PB2)|(1 << PB4)|(1 << PB5));    //Motor-Rechts, Pins als Ausgang setzen
       PORTB|= (1 << PB5);                           //Damit Motor vorwärts dreht
       PORTB&= ~(1 << PB4);                          //Damit Motor vorwärts dreht
       sei();                                        //Globale Interrupts erlauben
       while (1)
       {
       //Quellcode
       }
    
       while (1) {}
       return 0;
    }
    Zwei kleine Verständnisfragen hätte ich noch.
    OCR1B ist ja der Wert, welcher intern mit TCNT1 also dem Timer/Counter Daten Register abgeglichen wird. Wenn eine Übereinstimmung stattfindet dann wird am OC1B entsprechend der Einstellungen reagiert.
    Nun eine kleine Rechnung.
    Interner Takt ist 8MHz.
    PreScaler ist 8, also wird der Takt auf 1MHz reduziert.
    Da der Timer auf 8Bit eingestellt ist, wird 1MHz durch 2^8 geteilt --> 3906,25Hz; 1/3906,25Hz=256µs
    Also wird alle 256µs der Ausgang OC1B getoogelt.
    Die wäre Gesetz dem Fall, dass OCR1B 255 beträgt.
    Ist das soweit richtig oder habe ich hier schon einen Denkfehler?

    Die andere Frage, woher weiß ich denn mit welcher Frequenz der Motor angesteuert werden muss um eine bestimmte Drehzahl zu realisieren?
    Steht so etwas im Datenblatt? Gibt es zu den Asuro Motoren ein Datenblatt, auf der CD war keins dabei.

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Zitat Zitat von Andi1888 Beitrag anzeigen
    Also wird alle 256µs der Ausgang OC1B getoogelt.
    Die wäre Gesetz dem Fall, dass OCR1B 255 beträgt.
    Nein. Der Timer wird in einem PWM-Modus betrieben (oder sollte es zumindest). Die verbreiteten Bibliotheken nutzen 8-Bit-Phasenkorrektes PWM, d.h. der Timer zählt abwechselnd hoch und runter. Bei erreichen von OCR1 wird der Ausgang invertiert. Innerhalb von einem Zyklus (2*256µs) ist der Ausgang dabei zu OCR1/256 der Zykluszeit eingeschaltet. PWM beinflusst das Verhältnis Eingeschaltet/Ausgeschaltet, die Frequenz bleibt konstant!

    Zitat Zitat von Andi1888 Beitrag anzeigen
    Die andere Frage, woher weiß ich denn mit welcher Frequenz der Motor angesteuert werden muss um eine bestimmte Drehzahl zu realisieren?
    Gar nicht. Das hängt vom Motor, vom Getriebe, von Reibungswiderständen (die wiederum von anderen Faktoren beeinflusst werden, wie etwa der Temperatur) und der Batteriespannung ab. Wenn du eine bestimmte Drehzahl erreichen möchtest, musst du eine Drehzahlregelung programmieren. Dazu sind die Radencoder (Reflektorscheiben + Reflexlichtschranke) des ASURO da, mit ihnen kannst du die Geschwindigkeit des ASURO ermitteln und diese Information nutzen um die Motorleistung entsprechend anzupassen.

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

Ähnliche Themen

  1. DC Motor im niedrigen Drehzahlbereich ohne Drehmoment
    Von stonymontana im Forum Motoren
    Antworten: 19
    Letzter Beitrag: 14.12.2008, 14:47
  2. Erstes Projekt: auf Tastendruck soll Motor starten
    Von RN-Controler im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 11
    Letzter Beitrag: 23.07.2007, 14:00
  3. Projekt: Open Source Library / Firmware für RN- Motor Boards
    Von fwallenwein im Forum Open Source Software Projekte
    Antworten: 43
    Letzter Beitrag: 30.10.2006, 20:56
  4. Palm3 ohne Touchscreen starten
    Von frank-wob im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 7
    Letzter Beitrag: 18.09.2006, 07:46
  5. Antworten: 1
    Letzter Beitrag: 08.03.2005, 16:16

Berechtigungen

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