Hallo Leute. :-) Wer kann mir und einem oder anderem helfen, der sich mit dem Thema auseinander setzt. Ich habe einen Atmega88 mit 12Mhz laufen, CKDIV8 ist ausgeschaltet. Mein Ziel ist den Servo ansteuern. Rechnerisch klappt es einwandfrei, praktisch dreht der Servo nur links. Habe folgendes ausgewählt: Fast PWM mit TOP 0xFF Non-inverting mode Prescaler 1024 Etwas Theorie: 12Mhz / (1024*256)=45,77..Hz Tperiode=1/45,77..Hz=21,85..ms Ttakt=21,85..ms/256=85,3..µs OCR0A: Servo Stellung links: 1ms/85,3..µs=11,71 aufrunden 12 Servo Mittelstellung: 1,5ms/85,3..µs=17,57 aufrunden 18 Servo Stellung rechts: 2ms/85,3..µs=23,43 aufrunden 24 Das interessante ist, der Servo dreht bei jedem OCR0A Wert nur links? //Quelcode #include <avr/io.h> void init_0(void) { DDRD |= (1<<PD6)|(1<<PD3); PORTD |= (0<<PD6)|(0<<PD3); }; void Timer_0(void) { OCR0A = 24; // 1ms entspricht 11,71 => 12 // 1,5ms entspricht 17,57 => 18 // 2ms entspricht 23,43 => 24 TCCR0B |= (0<<WGM02)|(1<<CS02)|(0<<CS01)|(1<<CS00); //Prescaler 1024 TCCR0A |= (1<<COM0A1)|(0<<COM0A0)|(1<<WGM01)|(1<<WGM00); //Fast PWM, TOP 0xFF, non-iverted }; void main(void) { init_0(); while(1) { Timer_0(); }; }
Hi Deine Berechnungen sehen erst mal korrekt aus. Aber was macht 'Timer_0();' in der Hauptschleife? MfG Spess
Guck mal hier: Beitrag "Re: Jamara 9g Servo" mit ein paar Änderungen sollte der Code auch für den Mega88 funktionieren.
In deiner Endlosschleife rufst du immer wieder dein Timer_0 auf, dort wird der Timer neu initialisiert. Wenn du die PWM einmal gestartet hast brauchst/darfst du das nicht. Timer_0 wie Init vor die Schleife, wenn sich was ändern soll (hier pwm-wert) nur dieses in der while ändern (OCR0A=neuer Wert). avr
Ich bedanke mich bei euch erstmal für die Antworten. Dass die Zählervariable immer wieder aufgerufen wird, habe ich aus dem Buch "AVR Hardware und C-Programmierung in der Praxis" gelernt.
>OCR0A: Servo Stellung links: 1ms/85,3..µs=11,71 aufrunden 12 > Servo Mittelstellung: 1,5ms/85,3..µs=17,57 aufrunden 18 > Servo Stellung rechts: 2ms/85,3..µs=23,43 aufrunden 24 12 Positionen sind wirklich hoch auflösend...
>Deswegen lohnt sich sowas nur, wenn man 16 Bit PWM nimmt.
Auch mit 8 Bit kann man 2ms relativ gut auflösen.
Die Angelegenheit erfordert nur etwas mehr Hirnschmalz und
Programmieraufwand. Ist aber lösbar.
Die mesten haben scheinbar das Problem, dass sie sich zu sehr auf die
20ms Periodendauer festlegen - wichtiger wäre aber eine sinnvolle
Auflösung des Steuerimpulses...
Daniel schrieb: > Ich bedanke mich bei euch erstmal für die Antworten. > > Dass die Zählervariable immer wieder aufgerufen wird, habe ich aus dem > Buch > "AVR Hardware und C-Programmierung in der Praxis" gelernt. Eine 'Zählervariable' wird nicht aufgerufen. Eine Funktion wird aufgerufen, aber eine Variable bekommt einen Wert oder man fragt einen Wert ab. Aber auch das machst du ja im Grunde nicht. Du konfigurierst den Timer. Und etwas auf Arbeitsbedingungen konfigurieren macht man im Normalfall nur einmal beim Programmstart. In seltenen Fällen wird ein Timer im Laufe eines Programmes umkonfiguriert (in einen anderen Modus geschaltet), aber das ist eher der Ausnahmefall.
> Dass die Zählervariable immer wieder aufgerufen wird, habe ich aus dem > Buch > "AVR Hardware und C-Programmierung in der Praxis" gelernt. Da sollte man entweder das Buch verbrennen, oder lesen lernen...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.