www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM mit ATmega


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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();
  };
}

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  while(1)
  {
    Timer_0();
  };

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guck mal hier:

Beitrag "Re: Jamara 9g Servo"

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

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deswegen lohnt sich sowas nur, wenn man 16 Bit PWM nimmt.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.