Hi, Ich generiere auf einem ATMega328p ein PWM signal und möchte bei Duty Cycle 0 auch wirklich keinen Ausgang mehr generieren (bleibt etwa 7us auf High). Ich schalte also den Timer ab bei Duty Cycle 0, jedoch bleibt dann der Ausgang auf HIGH, auch wenn ich den Pin mit "PORTB &= ~(1<<PB1);" resete. Wie kann ich den Pin am besten auf LOW setzten?
Bert S. schrieb: > Ich schalte also den Timer ab Wie genau machst du das? Schau dir die Funktion der COM-Bits im Timer Control Register A an (also z.B. COM1A in TCCR1A)
Bert S. schrieb: > Ich generiere auf einem ATMega328p ein PWM signal und möchte bei Duty > Cycle 0 auch wirklich keinen Ausgang mehr generieren (bleibt etwa 7us > auf High) Hier mal einen Auszug aus dem Datenblatt: The extreme values for the OCR1x Register represents special cases when generating a PWM waveform output in the fast PWM mode. If the OCR1x is set equal to BOTTOM (0x0000) the output will be a narrow spike for each TOP+1 timer clock cycle. Setting the OCR1x equal to TOP will result in a constant high or low output (depending on the polarity of the output set by the COM1x1:0 bits.) D.h. beim 0% Duty Cycle ist es besser die PWM Generierung abzuschalten, um keinen Spike zu bekommen.
Bert S. schrieb: > Wie kann ich den Pin am besten auf LOW setzten? Indem du die PWM im Phase Correct Mode betreibst. Dann ist 0 wirklich 0. Oder du nimmst bei 0 dem Ausgang einfach das DDR-Bit weg, also schaltest auf Eingang. Oder du setzt bei 0 OCR auf 0xFF und invertierst den Ausgang mit den COM-Bits.
in dem du nicht die Hardware toggeln lässt, sondern die Option der COM1x bits umsetzt das der Ausgang auf High oder Low gesetzt wird und dort bleibt. Oder in der ISR des OCR1x das Bit immer invertieen: wenn 1 mach 0 wenn 0 mach 1
Chris H. schrieb: > in dem du nicht die Hardware toggeln lässt Genau. Benutz das einfach nicht, dann macht es auch keine Probleme. Toller Tip.
Du musst die COM Bits wieder auf normal operation stellen, dann wird wieder auf das PORT-Register zugegriffen
Thomas E. schrieb: > Bert S. schrieb: >> Wie kann ich den Pin am besten auf LOW setzten? > > Indem du die PWM im Phase Correct Mode betreibst. Dann ist 0 wirklich 0. > > Oder du nimmst bei 0 dem Ausgang einfach das DDR-Bit weg, also schaltest > auf Eingang. Ich hatte das gleiche Problem im Phase correct mode. Habe dann DDR auf Input gesetzt. Damit hats dann funktioniert. mfg
Felix F. schrieb: > Ich hatte das gleiche Problem im Phase correct mode. Nein. Entweder hattest du das Problem nicht oder keinen Phase Correct Mode. Beides zusammen geht nicht.
Thomas E. schrieb: > Oder du nimmst bei 0 dem Ausgang einfach das DDR-Bit weg, also schaltest > auf Eingang. Dann hättest du ohne externe Beschaltung einen floatenden Eingang...
Schau dir die Funktion set_pwm an! https://github.com/HarryLipphaus/PiXTend/blob/master/raw_io/pwm.c
Man kann die PWM auch im Inverted PWM Modus laufen lassen. Dann ist das Problem bei 0 weg. Dafür taucht es dann aber bei 100% auf. Jetzt kommt es auf die Anwendung an. Bei Dimmen einer LED stört das z.B. nicht, ob die LED mit 100% oder mit 255/256 angesprochen wird.
Thomas E. schrieb: > Genau. > Benutz das einfach nicht, dann macht es auch keine Probleme. Toller Tip. Das hab ich nicht geschrieben aber du scheinst dich nicht mit den AVR's auszukennen. Toggeln oder die Bits setzen oder löschen oder normal port operation sind möglich gesteuert über die COMAxy Bits sonst gucke er ins DB rein...
Um einen Stellbereich von 0% bis 100% zu erhalten, kann man auch Fast PWM (invertierend) mit TOP=ICR1 verwenden und dann ICR1 mit 65534 laden. Dann bekommt man mit OCR1A im Bereich von 65535 bis 0 eine PWM-Tastung von exakt 0% bis 100%, ohne Spikes an beiden Enden. Geht natuerlich nur, wenn man Input Capture nicht gleichzeitig auch braucht.
Chris H. schrieb: > du scheinst dich nicht mit den AVR's > auszukennen Stimmt. Ich weiß gar nicht, was das ist. Aber was ein Deppenapostroph ist, das weiß ich.
Reiner_Gast schrieb: > Dann hättest du ohne externe Beschaltung einen floatenden Eingang... Ich? Wenn der Ausgang nicht beschaltet ist, kann man sich die PWM komplett sparen.
Thomas E. schrieb: > Stimmt. Ich weiß gar nicht, was das ist. Aber was ein Deppenapostroph > ist, das weiß ich. Lieber nen Deppenapstroph als nur die Hälfte gelesen und ein Viertel verstanden... ;)
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.