Forum: Mikrocontroller und Digitale Elektronik Atmega32 PWM Ausgabe 4 kHz


von Dietmar P. (dietmar2)


Lesenswert?

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

von holger (Gast)


Lesenswert?

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.

von Dietmar P. (dietmar2)


Lesenswert?

OK,
hatte es auch schon mit einem delay in der for-Schleife probiert. Das 
ändert aber am Grundprinzip, dass es wohl ohne schleife gehen ja nichts, 
oder?

von avr (Gast)


Lesenswert?

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

von Dietmar P. (dietmar2)


Lesenswert?

Super,
das war's, danke!

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

von spess53 (Gast)


Lesenswert?

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

von avr (Gast)


Lesenswert?

spess53 schrieb:
> Wozu eigentlich PWM? Das ist eigentlich nichts anderes als CTC.

Deswegen habe ich ja Rechteck geschrieben und die
Kommentare angepast;)

Reicht ja auch für etwas Lärm.

avr

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.