Forum: Mikrocontroller und Digitale Elektronik PWM mit ATmega


von Daniel (Gast)


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();
  };
}

von STK500-Besitzer (Gast)


Lesenswert?

1
  while(1)
2
  {
3
    Timer_0();
4
  };

mach das so:
1
  Timer_0();
2
  while(1)
3
  {
4
  };

von spess53 (Gast)


Lesenswert?

Hi

Deine Berechnungen sehen erst mal korrekt aus. Aber was macht 
'Timer_0();'
in der Hauptschleife?

MfG Spess

von STK500-Besitzer (Gast)


Lesenswert?

Guck mal hier:

Beitrag "Re: Jamara 9g Servo"

mit ein paar Änderungen sollte der Code auch für den Mega88 
funktionieren.

von avr (Gast)


Lesenswert?

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

von Daniel (Gast)


Lesenswert?

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.

von STK500-Besitzer (Gast)


Lesenswert?

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

von Simon K. (simon) Benutzerseite


Lesenswert?

Deswegen lohnt sich sowas nur, wenn man 16 Bit PWM nimmt.

von STK500-Besitzer (Gast)


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

von Karl H. (kbuchegg)


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.

von STK500-Besitzer (Gast)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.