Atmega32 PWM Ausgabe 4 kHz

OP #1759446
Hallo,

mit dem Timer hatte ich eine Frequenz von ca. 4 kHz erzeugt. Der Ton ist 
allerdings nicht sauber (Jitter).

Deshalb habe ich mich an den PWM gewagt. Ich kriege aber nur eine 
Frequenz zustande mit Hilfe einer while-Schleife. Das geht doch bestimmt 
auch ohne, da der PWM eine eigene Einheit im µC ist, oder?

Der Atmega32 hat einen internen Takt von 1 MHz, bei einem 8-Bit-Timer 
und einem Prescaler von 1 wäre das eine Frquenz von 3,9 kHz.
Soweit, so gut. Ich habe aber gelesen, dass man kein ISR braucht(??) und 
die while-Schleife in der Hauptroutine der Anwendung ist auch nicht sehr 
toll.

Kann mir bitte jemand helfen, wo fehlt da ein Parameter. Ihr seht schon 
an meiner Beschreibung, dass ich noch Anfänger bin und mich mit Mühe 
durch den Bit-Dschungel des Atmega taste.

Hier mein Code:
1
// Timer Testprogramm für PWM
2

3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
#include <stdint.h>
6

7
  int main(void)
8
  {  
9
  TCCR2 |= (1<<CS20);       // Prescaler 1
10
  TCCR2 |= (1<<WGM21) | (1<<WGM20);  // Timer aktivieren, 8-Bit, Fast PWM
11
  TCCR2 |= (1<<COM21) | (0<<COM20) ;  // Compare match, Fast PWM, nicht invertiert
12
  OCR2 =  255;  // Vergleichswert setzen
13

14
  DDRD |= (1<<PD7); // Port D Pin 7 als Ausgang
15

16
  uint8_t wert;
17
  while(1)
18
  {
19
    for (wert=0; wert<255; wert++)
20
    {
21
    OCR2 = wert;
22
    }
23
  }
24
  }//main
Gast
Was glaubst du wie schnell diese Schleife abgearbeitet wird?

    for (wert=0; wert<255; wert++)
    {
    OCR2 = wert;
    }

Du musst schon ein bißchen warten damit die PWM überhaupt
sinnvoll arbeiten kann.
Gast
Das sollte dein Signal sein ;)
1
// Timer Testprogramm für Rechteck ca. 4 kHz
2

3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
#include <stdint.h>
6

7
  int main(void)
8
  {  
9
  DDRD |= (1<<PD7);     // Port D Pin 7 als Ausgang
10

11
  TCCR2 |= (1<<WGM21);  // Timer CTC
12
  TCCR2 |= (1<<COM20);  // Pin (PD7) toggle
13
  OCR2 =  0x7b;         // Vergleichswert setzen
14
  TCCR2 |= (1<<CS20);   // Prescaler 1 Timer startet
15

16
  while(1); // Ich drehe Däumchen
17

18
  }//main

avr
Gast
Hi

>Das werde ich mit dem Datenblatt nochmals auflösen und dann hoffentlich
>verstehen, was ich da verkehrt gemacht habe.

Wozu eigentlich PWM? Das ist eigentlich nichts anderes als CTC.

MfG Spess

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 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.