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.
Lesezeichen