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.







Zitieren


Lesezeichen