PWM mit ATmega

Gast #1427391
Lesenswert?

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 #1428014
Lesenswert?

>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
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren