mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM mit 2 Sekunden Periodendauer


Autor: Patrick B. (paddybo93)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich möchte gerne ein PWM Signal mit einem Atmega16 erzeugen, das problem 
es soll eine Periodendauer von 2 Sekunden haben. Das heißt bei 50% Soll 
das Signal eine Sekunde an sein und eine Sekunde aus sein, bei 25% 0,5 
Sekunden ein und 1,5 Sekunden aus usw....

Das Ganze soll eine Temperaturregelung werden, das Signal muss so 
langsam sein da es später eine Wechselspannung schalten soll und es soll 
nicht kürzer sein als eine Sinuswelle der Wechselspannung.

Ich habe im Datenblatt geschaut wie ich die Timerregister setzen muss, 
ein "normales" PWM Signal mit 20ms habe ich auch hin bekommen. Aber 
entweder sehe ich den Wald vor lauter Bäumen nicht oder es ist wirklich 
etwas komplizierter mit 2 Sekunden. Hat jemand Tipps?

vielen Dank
Paddy

Autor: Lukas T. (tapy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo hängt's denn? Einfach maximalen Prescaler nehmen und dann manuell je 
nach Takt noch ein paar mal teilen.

Autor: Matthias S. (Firma: matzetronics) (mschoeldgen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit Timer 1 im 16 Bit Modus und einem Vorteiler von 256 kommst du bei 
8MHz Taktfrequenz auf etwa 0,47 Hz - ziemlich genau das, was du 
möchtest.

Mode 14 bietet sich dafür an (Fast PWM, TOP in ICR1)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>ich möchte gerne ein PWM Signal mit einem Atmega16 erzeugen, das problem
>es soll eine Periodendauer von 2 Sekunden haben.

Kommt auf die Taktfrequenz deines ATMegas und den Timertyp (8- / 16-Bit) 
an.

MfG Spess

Autor: Patrick B. (paddybo93)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahhh, vielen dank für die schnellen Antworten. Ich werde es mal mit dem 
Mode 14 probieren. Bisher hatte ich 15, allderdings war mir nicht ganz 
klar in welches Register ich dann den Wert für das eigendliche Siganl 
eintragen muss.

Autor: Matthias S. (Firma: matzetronics) (mschoeldgen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Patrick B. schrieb:
> Bisher hatte ich 15, allderdings war mir nicht ganz
> klar in welches Register ich dann den Wert für das eigendliche Siganl
> eintragen muss.

Da in Mode 15 TOP durch OCR1A gesetzt wird, bliebe dir nur der OC1B als 
Hardware PWM Ausgang. In Mode 14 sind OC1A und OC1B verfügbar. In ICR1 
schreibst du z.B. 0xFFFF, dann nutzt du den vollen Bereich der PWM.

Autor: H.Joachim S. (crazyhorse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann machs gleich richtig und synchronisiere das ganze mit der 
Netzfrequenz.
Nulldurchgänge erkennen, ganze Perioden einschalten oder aus lassen.

Autor: Alexxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> es soll eine Periodendauer von 2 Sekunden haben...
>> und es soll nicht kürzer sein als eine Sinuswelle der Wechselspannung.

Eine Sinuswelle hat eine Periodendauer von 20ms!!!
Wenn du nicht sychronisierst - wie H.Joachim Seifert ganz richtig 
angemerkt hat - kannst du trotzdem irgendwann genau bei Maximalspannung 
schalten!
Also gleich richtig machen, dann gibt es das Problem gar nicht!

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum willst du asynchron zur zu schaltenden Wechselspannung mit deinem 
Timer irgendwo in die Phase der Wechselspannung reinhackst. Wäre es 
nicht wesentlich sinnvoller, den Takt aus dem Nulldurchgang eben der zu 
schaltenden Wechselspannung zu generierst. Dann reduziert sich dein 
Timerproblem auf Zählen im Zahlenraum bis 256 oder wie hoch auch immer 
die Auflösung deiner PWM werden soll. Allenfalls brauchst du den Timer, 
um von der Detektion eines Nulldurchgangs auf einen Zeitpunkt kurz vor 
dem echten, nächsten Nulldurchgangs zu extrapolieren und dann ggf. einem 
Opto-Triac mit Nulldurchgangsschalter den Rest zu überlassen.

Autor: Jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei einer Heizung wo einiges an Strom geschaltet werden soll,
ist die Wellenpaket-Steuerung zu bevorzugen, wobei immer
1 bis N komplette (!) Wellen (20 ms) geschaltet werden.

Also versorge deinen Timer über den external Clock mit
der Netzfrequenz. Dafür gibt es bewährte kostengünstige
Lösungen, die sehr gut den Nulldurchgang erfassen.

100 Perioden sind 2 Sekunden, dafür reicht ein 8-Bit-
Timer. Also den Max-Count = 99 einstellen.

Auf einfache Weise macht die PWM damit duty-cycle von
0 bis 100% in 1%-Schritten.

Will man es feiner auflösen, gibt man alle 2, 3, ...
2-Sekunden-Perioden 1% mehr und/oder 1% weniger aus.
- Da kann man schön spielen...

Autor: Matthias S. (Firma: matzetronics) (mschoeldgen)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Jakob schrieb:
> Also versorge deinen Timer über den external Clock mit
> der Netzfrequenz. Dafür gibt es bewährte kostengünstige
> Lösungen, die sehr gut den Nulldurchgang erfassen.

Das ist unnötig, wenn man z.B. ein SSR mit ZC Detektor oder auch den 
guten alten MOC3063 benutzt und vom MC ansteuert. Der Optokoppler selber 
hat den ZC Detektor und macht das alles richtig.

Autor: Axel S. (a-za-z0-9)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Patrick B. schrieb:
> ich möchte gerne ein PWM Signal mit einem Atmega16 erzeugen, das problem
> es soll eine Periodendauer von 2 Sekunden haben.

Wieso soll das ein Problem sein? Die Timer im ATmega haben Vorteiler. 
Die müssen nicht mit dem vollen Systemtakt laufen.

Und wenn es langsamer werden soll als es mit Vorteiler geht, dann kann 
man auch gleich eine Software-PWM machen. Dazu baut man einfach die 
Funktion von Zähler und Compare-Register nach und läßt sich den Zähltakt 
von einem Timerüberlauf liefern.

Konkret: wenn man immer ganze Perioden der Netzfrequenz schalten will, 
dann konfiguriert man einen Timer so, daß er 50 Mal pro Sekunde einen 
Interrupt liefert. Und in der ISR zählt man eine Variable (Zähler) hoch 
und vergleicht sie mit einer zweiten Variable (Compare). Und je nachdem 
ob kleiner oder größer wird die Last an- oder ausgeschaltet. War das 
jetzt schwer?

Autor: Patrick B. (paddybo93)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Zahlreichen Tipps,
Also ich werde mich erstmal darum kümmern den Timer einzustellen. Die 
Regelung muss nicht soo präzise sein von daher denke ich das ich es 
nicht mit phasenanschnitt bzw. 20ms Periodenlänge mit Nulldurchgang 
realisieren werde. Es soll nicht zu kompliziert werden ;-)
Falls ich damit Probleme bekommen sollte kann ich immernoch umdenken.

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.