Forum: Mikrocontroller und Digitale Elektronik PWN erzeugen mit Atmega 644


von Timer (Gast)


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

von Timer (Gast)


Lesenswert?

PWM meine ich.

von Timer (Gast)


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.

von Serieller (Gast)


Lesenswert?

> PWM meine ich.

Schade :(

von spess53 (Gast)


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

von Timer (Gast)


Lesenswert?

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

von spess53 (Gast)


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

von Timer (Gast)


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?

von Chris (Gast)


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.

von Timer (Gast)


Angehängte Dateien:

Lesenswert?

Hier nochmal als Grafik, was ich erreichen möchte.

von spess53 (Gast)


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

von Timer (Gast)


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?

von spess53 (Gast)


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

von Chris (Gast)


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.

von spess53 (Gast)


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

von Timer (Gast)


Lesenswert?

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

von Chris (Gast)


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.

von spess53 (Gast)


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

von spess53 (Gast)


Angehängte Dateien:

Lesenswert?

Hi

Schnell mal getestet. Mit der Initialisierung (Timer2)
1
                      ;************ TIMER_COUNTER_2 ***************
2
3
                      ldi r16,1<<COM2B1|1<<COM2B0|1<<WGM21|1<<WGM20  
4
                      sts TCCR2A,r16
5
6
                      ldi r16,1<<WGM22|1<<CS20   
7
                      sts TCCR2B,r16
8
9
                      ldi r16,$20
10
                      sts OCR2A,r16
11
12
                      ldi r16,$01
13
                      sts OCR2B,r16
14
15
                      sbi DDRD,PD6    ; OC2B Ausgang

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

MfG Spess

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.