Forum: Mikrocontroller und Digitale Elektronik AVR OC1A Pin auf Low bringen


von Bert S. (kautschuck)


Lesenswert?

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?

von Achim S. (Gast)


Lesenswert?

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)

von Reiner_Gast (Gast)


Lesenswert?

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.

von Thomas E. (thomase)


Lesenswert?

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.

von Chris S. (Firma: hier&da) (keiningenieur)


Lesenswert?

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

von Thomas E. (thomase)


Lesenswert?

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.

von Ingo Less (Gast)


Lesenswert?

Du musst die COM Bits wieder auf normal operation stellen, dann wird 
wieder auf das PORT-Register zugegriffen

von Felix F. (wiesel8)


Lesenswert?

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

von Thomas E. (thomase)


Lesenswert?

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.

von Reiner_Gast (Gast)


Lesenswert?

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...

von Harry L. (mysth)


Lesenswert?


von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von Chris S. (Firma: hier&da) (keiningenieur)


Lesenswert?

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...

von Arne (Gast)


Lesenswert?

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.

von Thomas E. (thomase)


Lesenswert?

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.

von Thomas E. (thomase)


Lesenswert?

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.

von Chris S. (Firma: hier&da) (keiningenieur)


Lesenswert?

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
Noch kein Account? Hier anmelden.