Schau dir in einem AVR Tutorial (Kleiner Tipp schau auf mikrocontroller.net) und im Datenblatt vom Kontroller an wie man den Timer verwendet.
Werbung
Schau dir in einem AVR Tutorial (Kleiner Tipp schau auf mikrocontroller.net) und im Datenblatt vom Kontroller an wie man den Timer verwendet.
Kann jemand erklären, was OCR macht und wie es definiert ist?
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:
https://www.roboternetz.de/community...ignal-erzeugen
Geändert von shedepe (11.03.2014 um 19:31 Uhr)
Habe es nun einigermaßen hinbekommen.
Zwei kleine Verständnisfragen hätte ich noch.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; }
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.
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!
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
Lesezeichen