mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM Mode 15 funktioniert nicht


Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht 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:
DDRB=0xff;
PORTB=0x00;
OCR1A = 100;
TCCR1A = (1<<COM1A1)|(1<<COM1A0)|(1<<WGM11)|(1<<WGM10);
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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du den OC1B-Pin auch konfiguriert?

Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht 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
DDRB=0xff;
PORTB=0x00;
?

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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

Vielen, vielen Dank noch einmal, Ozzy

Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, hatte den Pin noch frei, das klappt jetzt echt super!!!

Vielen Dank noch einmal, Ozzy

Autor: A. C. (michael1988)
Datum:

Bewertung
0 lesenswert
nicht 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.....

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.