www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik HW PWM für zwei LEDs mit einem Timer?


Autor: derJens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Freunde,

hab momentan ein kleines Problem.

Und zwar möchte ich zwei ~200Hz PWMs mit 10bit Auflösung realisieren.

Dazu wollte ich jeweils 2 HW PWMs erzeugen.

Nun möchte ich den Timer1 des ATmega16 verwenden und bekomme es einfach 
nicht gebacken.

Bei den avr freaks gibt es ein Tutorial zu Timern wo drin steht das 
Timer ohne ISR besser wären als mit weils nochmal Zeit und Code spart.

So nun wollte ich den CTC Modus verwenden und jeweils bei OC1A und OC1B 
den Entsprechenden Port toggeln lassen. Geht aber nicht. Er löscht immer 
beim compare mit dem kleineren Wert. Und nen Modus wie "Zähle bis 
Overflow und toggel unterwegs OCR1A und OCR1B" finde ich nicht

Hab dann im Forum gelesen, dass der Peter hierzu folgendes geschrieben 
hat:

"Das mit dem ICR1 ist Quatsch, damit sind die beiden Compares nicht
unabhängig.

Du mußt in den Interrupts einfach nur OCR1A/B += Intervall_A/B; machen
und aus die Maus.
Der Timer muß durchlaufen ohne Clear on Compare, sonst geht die Addition
nicht.

Und den Overflow- und den Capture-Interrupt kannst Du dann auch noch
uneingeschränkt benutzen.


Peter"

das versteh ich leider nicht. Also im speziellen "OCR1A/B += 
Intervall_A/B". Und er benutzt doch jetzt ne ISR die ja laut den AVR 
Freaks auch nicht die beste Variante für ne HW PWM sein soll..

Wäre nett wenn mir einer helfen könnte.

Danke,

Jens

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

Bewertung
0 lesenswert
nicht lesenswert
derJens schrieb:

> Freaks auch nicht die beste Variante für ne HW PWM sein soll..

Vergiss das mit 'der besten Variante' gleich wieder.

Wenn eine Hardware etwas nicht kann, dann muss man mit Software 
aushelfen.
Da kannst du dich Kopf stellen.

Autor: derJens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK.

Dann sollte ich also eine ISR aufrufen lassen und da drin folgendes 
machen:

"OCR1A/B +=Intervall_A/B"

Aber was zum Kukuk ist damit gemeint? Mir ist ja bewußt, dass es eine 
zeitliche differenz zwischen OCR1A und OCR1B gibt (oder auch nicht, je 
nachdem) aber was soll ich da jetzt genau machen? Mir nen Flag in der 
ISR basteln und je nach Differenz den Kollegen toggeln?

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

Bewertung
0 lesenswert
nicht lesenswert
Angenommen dein Timer ist ein 3 Bit Timer. Er zählt also immer

 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7

Jetzt willst du einen Interrupt alle 3 Timerklicks.
Der erste ist bei 0.
Du bekommst deinen Interrupt. Bei welchem Zählerstand muss der nächste
Interrupt ausgelöst werden?
0 + 3 = 3
Bei einem Zählerstand von 3 muss also der nächste Interrupt kommen.

Der Interrupt kommt. Wann muss der nächste Interrupt kommen, wenn er 3
Timerklicks später erfolgen soll?
3 + 3 = 6
Also setzt du den Vergleiswert auf 6.
Bei 6 kommt der nächste Interrupt und im Zuge der Behandlung fragen wir
uns: Wann muss der nächste kommen?
6 + 3 = 9.
Der Timer kann aber nur bis 7 zählen (8 Zustände), also muss der
Interrupt bei 9 % 8 = 1, also bei 1 kommen.
etc. etc.

Und natürlich geht das dann auch, wenn der nächste Interrupt nicht nach 
3 Timerticks sondern zb 5 Timerticks später kommen soll. Dann zählt man 
halt 5 dazu.

Der Timer läuft durch und aus der Kentnis des aktuellen Zählerstandes,
zusammen mit der Anzahl der Timerticks die vergehen sollen, kann man
ausrechnen, wann der nächste Interrupt kommen muss, damit eine bestimmte
Anzahl Timerticks vergangen sind.

Machst du doch auch jeden Tag!
Oder benutzt du eine Stoppuhr, wenn du, gerechnet von jetzt, in 7 
Minuten etwas erledigen sollst. Du nimmst die aktuelle Uhrzeit, zählst 
im Kopf die 7 Minuten dazu und merkst dir die Uhrzeit, wann deine Aktion 
erforderlich ist. Mit dieser Uhrezeit vergleichst du ständig die 
aktuelle Uhrzeit und wenn sie gleich sind, sind deine 7 Minuten um.

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
derJens schrieb:
> So nun wollte ich den CTC Modus verwenden und jeweils bei OC1A und OC1B
> den Entsprechenden Port toggeln lassen. Geht aber nicht. Er löscht immer
> beim compare mit dem kleineren Wert. Und nen Modus wie "Zähle bis
> Overflow und toggel unterwegs OCR1A und OCR1B" finde ich nicht

Der gesuchte Modus ist natürlich einer der PWM-Modi! Welcher davon, ist 
für LEDs relativ egal.

Autor: derJens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Angenommen dein Timer ist ein 3 Bit Timer. Er zählt also immer
>
>
>
>  0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7..........

Hmm.. Also im späteren Verlauf wollte ich dann die Werte faden lassen 
bzw. beide LEDs unterschiedlich bepulsen.

Wäre dann nicht die Variante ICR1 sinnvoller, da ich, wenn ich es 
richtig verstanden hab, beide OCR's dann einfacher unabhängiger 
voneinander verändern könnte?

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

Bewertung
0 lesenswert
nicht lesenswert
derJens schrieb:

> Wäre dann nicht die Variante ICR1 sinnvoller, da ich, wenn ich es
> richtig verstanden hab, beide OCR's dann einfacher unabhängiger
> voneinander verändern könnte?

1) Ist das völlig egal.
   Das Fading bestimmt dir nur den Wert der zu den OCR Registern
   dazugezählt werden muss

2) Wenn du einen Timer hast, der einen PWM Modus beherrscht, bei dem
   man 2 OCR Register als unabhängige PWM benutzen kann:
   Super, nimm sie

3) Ging es in dem von dir benutzten Artikel nicht einfach nur
   um 2 PWM, sondern darum, dass man die PWM Frequenz auch noch
   im laufenden Betrieb ändern können möchte. Wenn ich das noch
   richtig im Kopf habe. Den Fall hast du ja gar nicht.

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat ein ATMEGA16 denn einen PWM-Modus bei dem man zwei Compare-Werte 
gleichzeitig benutzen kann? Weiss ich jetzt aus dem Stehreif auch nicht, 
aber sowas muesste ja in Datenblatt zumindest mal kurz erwaehnt werden, 
oder? ;)

Volker

Autor: gastlich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
FAST-PWM kann dass ...

gruss claudio

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gastlich schrieb:
> FAST-PWM kann dass ...

Spassbremse! ;)

Volker

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

Bewertung
0 lesenswert
nicht lesenswert
Volker Schulz schrieb:
> gastlich schrieb:
>> FAST-PWM kann dass ...
>
> Spassbremse! ;)

:-)
Er hat ja nicht gesagt, welche Biteinstellung in den Registern dafür 
vorgenommen werden müssen.
Da lauert noch Potential

Autor: gastlich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Blick ins Datenblatt muss er schon nach wagen :-)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde mich einfach ganz dumm stellen und das Datenblatt befragen.

Und siehe da, in Tabelle 47 steht: Mode 3: 10Bit-PWM
Fertisch ist die Laube.

Mode 7, 8, 10, 14 gehen auch noch, suchs Dir aus.


Peter

Autor: derJens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ich hab mir jetzt mal die PWM mit Datenblatt gebastelt.

zuerst im TCCR1A: COM1A0 und COM1BO gesetzt, da dort steht "Toggle 
OC1A/OC1B on compare match".

So, dann will ich ja nen "immediate" Update von OCR1x und als TOP 
meinetwegen erstmal nen 0xFFFF. Sprich WGM Mode 0.

Prescaler bleibt auch weg.

Dann habe ich also eine PWM die von 0 nach 0xFFFF läuft mit EINEM Timer 
wo "unterwegs" die OCR1n PINs immediately gesetzt werden und oben drein 
hab ich noch das TOV1 Flag am Ende was ich für nen Interrupt nutzen 
kann..

RICHTIG???

:)

Autor: derJens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ähm. ich muß noch das CS10 im TCCR1B Register setzen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
derJens schrieb:
> zuerst im TCCR1A: COM1A0 und COM1BO gesetzt, da dort steht "Toggle
> OC1A/OC1B on compare match".

Na prima, Toggle macht also ne PWM ???


> So, dann will ich ja nen "immediate" Update von OCR1x und als TOP
> meinetwegen erstmal nen 0xFFFF. Sprich WGM Mode 0.

Doppel prima, Mode 0 ist also ein PWM-Mode ???


Woran hängts denn mit dem Datenblatt, ist es das Englisch?


Peter

Autor: derJens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmpf.

also für mein Verständnis is das ne PWM.

Er zählt in diesem Fall von 0...0xFFFF. Und das macht er bei 8MHz 123mal 
pro Sekunde.

Sprich ich hab ne 16bit PWM mit 123Hz!

((kann auch sein, dass ich irgendwo nen Verständnis Problem hab, ich 
weiß aber nicht wo das liegen sollte))

Autor: derJens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so ich hab das Ganze nochmal überdacht und gesehen, dass ja jeden 
einzelnen der "PWM" Takte nen Toggle stattfinden würde was ja kein Sinn 
macht. Ich hab jetzt die den PWM Modus 12 eingstellt wie folgt:
  TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<COM1A0)|(1<<COM1B0); //beide Kanäle inv

  OCR1A = 0x003F;
  OCR1B = 0x00FF;
  ICR1 = 0x02FF; // Top

  TCCR1B = (1<<CS10)|(1<<WGM13)|(1<<WGM12); // kein Prescaler und Modus 12
komischerweise zählt er jetzt trotzdem bis OCR1A obwohl ich WGM13 
gesetzt habe.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ummmpf.


Wo steht denn bei Mode 12 das Wort PWM???


TCCR1A = 1<<COM1A1|1<<COM1A0|1<<COM1B1|1<<COM1B0| // inv PWM
         1<<WGM11|1<<WGM10;                       // mode 3: 10 bit PWM
TCCR1B = 1<<CS10;                                 // start PWM

OCR1A = 0x100;                                    // z.B. 25% PWM
OCR1B = 0x300;                                    // z.B. 75% PWM


Peter

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.