PWM mit ATmega

Gast #1427391
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();
  };
}
Gast #1427417
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
Gast #1427567
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.
Gast #1427665
>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...
Gast #1428014
>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...
#1428019
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.
Gast #1428022
> 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...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.