Forum: Mikrocontroller und Digitale Elektronik PWM Mode 15 funktioniert nicht


von Oz z. (ozzy)


Lesenswert?

Hi,

ich würde gerne mit einem ATmega128 eine Frequenzmodellierung basteln, 
und dachte eigentlich, dass dafür Mode 15 ganz gut geeignet wäre:
1
DDRB=0xff;
2
PORTB=0x00;
3
OCR1A = 100;
4
TCCR1A = (1<<COM1A1)|(1<<COM1A0)|(1<<WGM11)|(1<<WGM10);
5
TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS10);
Was jetzt passieren "sollte", ist, dass er im fast-pwm Modus zwischen 
high- und low "toggelt", und jedes mal OCR1A als Counter benutzt, also 
On-und Off-Phasen gleich lang sind.

Doch leider passiert gar nichts! PWM an sich funktioniert (mit anderem 
Code getestet, der leider auch etwas anderes macht...).
Könnt Ihr denn da einen Fehler entdecken???

MfG, und vielen Dank schon einmal, Ozzy

von Johannes M. (johnny-m)


Lesenswert?

Du hast den Modus anscheinend nicht verstanden. Das OCR1A definiert den 
TOP-Wert der PWM und damit die PWM-Periodendauer. Um ein PWM-Signal zu 
erhalten, musst Du in OCR1B einen Wert schreiben, der dann das 
Tastverhältnis bestimmt. Getoggelt wird dann der OC1B-Pin 
(vorausgesetzt, er ist richtig konfiguriert).

von Oz z. (ozzy)


Lesenswert?

Hi,

ich denke, ich habe das wirkich nicht so ganz verstanden. Was bedeutet 
denn "Tastverhältnis"? Also ich möchte ja, dass ON- und OFF-Phase gleich 
lang sind.

Ist dann der OC1B-Pin nicht PB5 beim 128?

MfG, und vielen Dank, Ozzy

von Karl H. (kbuchegg)


Lesenswert?

Christoph O. wrote:
> Hi,
>
> ich denke, ich habe das wirkich nicht so ganz verstanden. Was bedeutet
> denn "Tastverhältnis"?

Das Verhältnis von Einschalt zu Ausschaltzeit.

> Also ich möchte ja, dass ON- und OFF-Phase gleich
> lang sind.

Dann gibst du in OCR1B immer die Hälfte vom OCR1A Wert.

>
> Ist dann der OC1B-Pin nicht PB5 beim 128?
>

Doch. Aber wenn du den OCR1B nicht besetzt, dann ist der immer 0

von STK500-Besitzer (Gast)


Lesenswert?

>Tastverhältnis

Das ist das Verhältnis zwischen Einschalt- und Ausschaltdauer innerhalb 
einer Periode.
Auch Duty-Cycle genannt.
Das was du machen willst, lässt sich mit dem CTC-Modus erreichen, wobei 
man ihn mit doppelter Frequenz laufen lassen muß.

von Johannes M. (johnny-m)


Lesenswert?

Bei einer PWM brauchst Du immer zwei Werte:
1. den TOP-Wert, der bestimmt, bis wohin der Zähler (Timer) zählen soll 
(in diesem Fall OCR1A) und
2. den Wert, bei dem (innerhalb des Zählintervalls) der Ausgang 
umgeschaltet werden soll (in diesem Fall OCR1B oder auch OCR1C).

Der Timer zählt aufwärts, bis der Wert in TCNT1 den Wert in OCR1B (oder 
OCR1C) erreicht hat. Beim folgenden Timertakt wird der entsprechend 
konfigurierte Ausgangspin (OC1B oder OC1C) umgeschaltet. Der Timer zählt 
weiter bis TOP (in Deinem Fall bis OCR1A) und wird dann zurückgesetzt. 
Beim Zurücksetzen wird gleichzeitig der Ausgangspin wieder in seinen 
Ausgangszustand gebracht.

von Oz z. (ozzy)


Lesenswert?

Hi,

also ich habe jetzt OCR1A mal den Wert 500, und OCR1B den Wert 250 
gegeben.
Aber es funktioniert immer noch nicht. Es bleiben knappe 0 V (etwas 
Rauschen). Oder sind die 14,7456Mhz einfach zu viel? Doch ein Prescaler?

MfG, Ozzy

von Johannes M. (johnny-m)


Lesenswert?

Hast Du den OC1B-Pin auch konfiguriert?

von Oz z. (ozzy)


Lesenswert?

Johannes M. wrote:
> Hast Du den OC1B-Pin auch konfiguriert?

Nein, ich muss auch gestehen, dass ich nicht weiß, wie...
Aber macht man das nicht mit
1
DDRB=0xff;
2
PORTB=0x00;
?

@Johannes M.: vielen Dank, jetzt ist mir das Prinzip wirklich klar!

von Johannes M. (johnny-m)


Lesenswert?

Christoph O. wrote:
> Nein, ich muss auch gestehen, dass ich nicht weiß, wie...
Du hast doch oben den OC1A mit den COM1An-Bits konfiguriert. Mit dem 
OC1B funktioniert das praktisch genauso. Auch zu dem Pin gibt es zwei 
Bits, mit denen man bestimmen kann, was der Pin bei einem bestimmten 
Ereignis machen soll. Abgesehen davon muss der Pin natürlich über das 
entsprechende Datenrichtungsregister (DDRx) als Ausgang konfiguriert 
sein, sonst kommt gar nichts raus.

von Oz z. (ozzy)


Lesenswert?

Johannes M. wrote:
> Christoph O. wrote:
>> Nein, ich muss auch gestehen, dass ich nicht weiß, wie...
> Du hast doch oben den OC1A mit den COM1An-Bits konfiguriert. Mit dem
> OC1B funktioniert das praktisch genauso. Auch zu dem Pin gibt es zwei
> Bits, mit denen man bestimmen kann, was der Pin bei einem bestimmten
> Ereignis machen soll. Abgesehen davon muss der Pin natürlich über das
> entsprechende Datenrichtungsregister (DDRx) als Ausgang konfiguriert
> sein, sonst kommt gar nichts raus.

Öhm, dann stehe ich aber doch gerade auf dem Schlauch: Ich muss also 
OC1A und OC1B konfigurieren, benutze aber statt OC1A OC1B als Ausgang? 
Ist das richtig? Kann ich den dann genauso konfigurieren?

MfG, Ozzy

von Johannes M. (johnny-m)


Lesenswert?

Christoph O. wrote:
> Öhm, dann stehe ich aber doch gerade auf dem Schlauch: Ich muss also
> OC1A und OC1B konfigurieren, benutze aber statt OC1A OC1B als Ausgang?
> Ist das richtig? Kann ich den dann genauso konfigurieren?
Nein, OC1A brauchst Du nicht zu konfigurieren! Das PWM-Signal wird 
(bei Benutzung von OCR1B als Compare-Wert) an OC1B ausgegeben. OC1A hat 
im Modus 15 keine Funktion, weil das dazugehörige Compare-Register durch 
den TOP-Wert belegt ist. Es muss nur OC1B (mit den entsprechenden 
COM-Bits) konfiguriert werden. Und die dazu erforderlichen Daten stehen 
in den Tabellen im Datenblatt.

von Oz z. (ozzy)


Lesenswert?

Hi,

vielen Dank an Euch alle, besonders an Johannes, jetzt funktioniert 
wirklich alles super!!!

Vielen, vielen Dank noch einmal, Ozzy

von Oz z. (ozzy)


Lesenswert?

Hi,

eine Frage hätte ich jetzt noch: wie schaffe ich es denn, das Signal 
invertiert auf einem anderen Pin auszugeben? Bekomme das irgendwie nicht 
hin...

MfG, Ozzy

von Johannes M. (johnny-m)


Lesenswert?

Auf einem beliebigen anderen Pin geht natürlich nur per Software (und 
dementsprechend verzögert gegenüber dem hardwaremäßigen Signal am 
OCnx-Pin). Die einfachste Methode geht über zwei Interrupts (Overflow 
und der entsprechende Compare-Interrupt). Musst eben in einem 
Interrupt-Handler den gewünschten Pin setzen und im jeweils anderen 
wieder löschen.

Wenn vom selben Timer noch eine Compare-Einheit frei ist und der 
dazugehörige Ausgangspin auch, dann gehts natürlich auch, indem man in 
das entsprechende OCR denselben Wert schreibt wie in das andere, aber 
die Steuerung des Pins "umdreht".

von Oz z. (ozzy)


Lesenswert?

Vielen Dank, hatte den Pin noch frei, das klappt jetzt echt super!!!

Vielen Dank noch einmal, Ozzy

von A. C. (michael1988)


Lesenswert?

Mal ne Frage: wo bitte steht im Datenblatt dass man im Modus 15 OCR1B 
als comparewert nehmen soll???

Wie soll man denn da drauf kommen.....

von spess53 (Gast)


Lesenswert?

Hi

>Mal ne Frage: wo bitte steht im Datenblatt dass man im Modus 15 OCR1B
>als comparewert nehmen soll???

Weil auf S.135 steht, daß OCR1A der Top-Wert ist.

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.