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
Wo hängt's denn? Einfach maximalen Prescaler nehmen und dann manuell je nach Takt noch ein paar mal teilen.
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)
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
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.
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.
Dann machs gleich richtig und synchronisiere das ganze mit der Netzfrequenz. Nulldurchgänge erkennen, ganze Perioden einschalten oder aus lassen.
>> 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!
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.
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...
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.
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.