www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWN erzeugen mit Atmega 644


Autor: Timer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mein Ziel ist es auf 2 Pins ein PWN Signal zu erzeugen (OC0A und OC2A). 
Die Anforderungen sind folgende:

Die Low Dauer soll fest sein z.B. 1uS. Die Dauer des Highpegels und 
somit die Frequenz soll variierbar sein. Der Controller ist mit 20MHz 
getaktet.

Könnte mir jemand an diesem Beispiel erklären, wie ich die Timer 
konfigurieren muss? Mit Timern habe ich leider noch nicht gearbeitet, 
und deshalb sehe ich in dem Datenblatt noch nicht so recht durch.

Danke, und viele Grüße

Autor: Timer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PWM meine ich.

Autor: Timer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also jetzt habe ich ein Wenig das Datenblatt verstanden. Also ich würde 
sagen, das ich folgendes benötige:

Ich geh jetzt mal von einem etwas längeren Low Pegel aus so um die 50us.

Also wahrscheinlich brauche ich dieses non inverting fast PWM.

COM0A1=1, COM0A0=0

Wenn ich es jetzt richtig verstanden habe kann ich hiermit den Topwert 
einstellen, wobei ich den Topwert in 0CRA speichern muss:

WGM2=1, WGM1=1, WGM0=1

Als Prescaler würde ich 1024 nehmen:

CS02=1, CS01=0, CS00=1

Bei der nicht invertierenden PWM wird ja der Pin beim erreichen des 
Comparewertes auf 0 gesetzt, und beim Bottom auf 1.

Wo kann ich jetzt den Comparewert einstellen? Ich habe mir das jetzt so 
vorgestellt, dass ich den Topwert regle und damit die Frequenz und den 
Comparewert immer auf Top-1 setze, was dann ca. den 50us entsprechen 
sollte.

Autor: Serieller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> PWM meine ich.

Schade :(

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Wo kann ich jetzt den Comparewert einstellen? Ich habe mir das jetzt so
>vorgestellt, dass ich den Topwert regle und damit die Frequenz und den
>Comparewert immer auf Top-1 setze, was dann ca. den 50us entsprechen
>sollte.

Mit OCR0B. Ausgang ist dann OC0B.

MfG Spess

Autor: Timer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich möchte schon den OC0A Pin nutzen. Da wird doch aber der Topwert 
in OCR0A gespeichert und nciht der Comparewert, oder?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Also ich möchte schon den OC0A Pin nutzen. Da wird doch aber der Topwert
>in OCR0A gespeichert und nciht der Comparewert, oder?

Richtig. Bei Mode7 hast du nur einen PWM-Kanal. Und das ist OC0B.

MfG Spess

Autor: Timer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist natürlich ungünstig, da ich das in einer Schaltung habe, wo OC0A 
verkabelt ist. Gibt es eine Möglichkeit, etwas ähnliches mit diesem Pin 
zu erreichen?

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timer schrieb:
> Die Dauer des Highpegels und
> somit die Frequenz soll variierbar sein

Die Dauer des Highpegels hat nichts mit der Frequenz zu tun. Die 
Frequenz ist bei einem PWM-Signal fest.

Autor: Timer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier nochmal als Grafik, was ich erreichen möchte.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Gibt es eine Möglichkeit, etwas ähnliches mit diesem Pin
>zu erreichen?

Möglich schon. Compare- und Overflow-Interrupt aktivieren und Pin 
löschen bzw. setzen.

MfG Spess

Autor: Timer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chris schrieb:
> Die Dauer des Highpegels hat nichts mit der Frequenz zu tun. Die
> Frequenz ist bei einem PWM-Signal fest.

Also ist PWM doch das falsche, da benötige ich wohl CTC. Nur wie 
konfiguriere ich das?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Also ist PWM doch das falsche, da benötige ich wohl CTC. Nur wie
>konfiguriere ich das?

Lass dich doch nicht durcheinander bringen. CTC nützt dir nichts.

>Die Dauer des Highpegels hat nichts mit der Frequenz zu tun. Die
>Frequenz ist bei einem PWM-Signal fest.

Aber wenn er die Dauer der Low-Phase ändert, ändert er auch das 
Tastverhältnis. Also doch PWM.

MfG Spess

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timer schrieb:
> Die Low Dauer soll fest sein z.B. 1uS

Wenn er die aber Fest haben möchte dann hat er einen High-Pegel der 
abhäning ist von der Frequenz.
Also kann er nicht beides variierbar machen.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
>Wenn er die aber Fest haben möchte dann hat er einen High-Pegel der
>abhäning ist von der Frequenz.
>Also kann er nicht beides variierbar machen.

Das hatte ich übersehen. Aber mit invertierter PWM machbar. Dann 
bestimmt OCR0B die Low-Phase und High-Phase und Frequenz ist über OCR0A 
einstellbar.

MfG Spess

Autor: Timer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe jetzt erst einmal versucht ein einfaches Rechteck zu bekommen. 
Leider ohne Erfolg:
TCCR0A |= (1<<COM0A0) | (1<<WGM01);
TCCR0A &= ~( (1<<COM0A1) | (1<<WGM00) );
TCCR0B |= (1<<CS00) | (1<<CS02);
TCCR0B &= ~( (1<<CS01) | (1<<WGM02) );
OCR0A=0x00;

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich es richtig sehe benutzt du den CTC-Mode.
OCR0A auf Null zu setzten bringt dir kein Rechtecke, der Wert muss schon 
größer sein.

Das löschen der Bits muss man nicht machen, wenn man da nicht aufpasst 
überschreibt man sich die eigentliche Einstellung. Wenn du sicher gehen 
willst dass nur die Bits gesetzt sind dann schreib 0x00; vor dem Setzten 
der Bits ins Register.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>OCR0A=0x00;

Was soll da herauskommen? Außerdem kannst du mit CTC nur ein 
Rectecksignel.

Hast du das Pin auf Ausgang gesetzt?

MfG Spess

Autor: spess53 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Schnell mal getestet. Mit der Initialisierung (Timer2)
                      ;************ TIMER_COUNTER_2 ***************

                      ldi r16,1<<COM2B1|1<<COM2B0|1<<WGM21|1<<WGM20  
                      sts TCCR2A,r16

                      ldi r16,1<<WGM22|1<<CS20   
                      sts TCCR2B,r16

                      ldi r16,$20
                      sts OCR2A,r16

                      ldi r16,$01
                      sts OCR2B,r16

                      sbi DDRD,PD6    ; OC2B Ausgang

lässt sich deine gewünschte Kurvenform (Anhang) erzeugen.

MfG Spess

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.