Forum: Mikrocontroller und Digitale Elektronik PWM gibt auch bei OCRnX = 0; noch ein Signal.


von Jan N. (jan_n497)


Angehängte Dateien:

Lesenswert?

Guten Tag,
Bei mir sind heute die 100 RGB LED's angekommen. Die LED's haben einen 
gemeinsamen Masse Pol. Ich habe drei Poti angebracht für die RGB Farben, 
und lese diese mit dem ATMega644(16 Mhz) ADC aus. Und gebe das Ergebnis 
an denn Entsprechen PWM Output weiter. Ich habe denn Timer1(16 Bit) auf 
8 Bit Fast PWM mit ein Prescaler von 64 eingestellt. Beim Timer2(8 Bit) 
auch Fast PWM und Prescaler von 64. Dieses Signale gebe ich dann an die 
einzeln Pins der LED weiter. Jedoch bleiben die Farben der LED auch bei 
0 % PWM(OCRnX im USART ausgeben. Dort kommt "0" an.) noch schwach an. 
Auf dem Oszi Bild kann man sehen wie ab und zu "störbalken" nenne, ich 
sie mal auf treten. Wenn ich mehr PWM gebe, kommt das typische PWM Bild 
mit denn Balken.
Ist das normal?

Aufbau der Schaltung sowie das Oszi Bild und meine main Klasse habe ich 
angehängt.

Mfg J. Niehes

von Falk B. (falk)


Lesenswert?

@Jan Niehes (jan_n497)

>an denn Entsprechen PWM Output weiter. Ich habe denn Timer1(16 Bit) auf
>8 Bit Fast PWM mit ein Prescaler von 64 eingestellt. Beim Timer2(8 Bit)

>Ist das normal?

Ja, das ist eine Eigenschaft der PWM des AVRs. Wenn das weg soll, gibt 
es 2 Wege.

1. Nutze Phase correct PWM, dann geht sowohl ganz aus bei 0 und ganz ein 
bei dem entsprechenden Maximalwert.
2. Behandle den Fall 0 gesondert und schalte die PWM.Funktion ab, das 
macht man mit den COMxy Bits im Timerregister A

von Jan N. (jan_n497)


Lesenswert?

Falk B. schrieb:
> Behandle den Fall 0 gesondert und schalte die PWM.Funktion ab, das
> macht man mit den COMxy Bits im Timerregister A

Sorry, das verstehe ich nicht. Fall 0?

von Falk B. (falk)


Lesenswert?

@Jan Niehes (jan_n497)

>> Behandle den Fall 0 gesondert und schalte die PWM.Funktion ab, das
>> macht man mit den COMxy Bits im Timerregister A

>Sorry, das verstehe ich nicht. Fall 0?

Wenn dein Programm eine 0 in OCRxy schreiben will, muss man das abfangen 
und getrennt behandlen
Natürlich muss man auch den Fall berücksichtigen, wenn nach 0 mal 
wierder nicht 0 geschrieben wird.
1
pwm=wasauchimmer;
2
3
if (pwm == 0) {
4
  // SOnderbehandlung, OCRxy abschalten und manuell auf LOW schalten
5
  TCCRxA = ...  // PWM ausschalten
6
7
} else {
8
  TCCRxA = ...  // PWM einschalten
9
  OCRxA = pwm;
10
}

: Bearbeitet durch User
von Felix P. (fixxl)


Lesenswert?

Im Datenblatt heißt es dazu:

The extreme values for the OCR0A Register represents special cases when 
generating a PWM waveform output in the fast PWM mode. If the OCR0A is 
set equal to BOTTOM, the output will be a narrow spike for each MAX+1 
timer clock cycle. Setting the OCR0A equal to MAX will result in a 
constantly high or low output.

Man kann also bei Invertierung der PWM ein konstantes "low" erreichen.

von Falk B. (falk)


Lesenswert?

@ Felix Pflaum (fixxl)

>Man kann also bei Invertierung der PWM ein konstantes "low" erreichen.

Kann man, aber dann hat man kein konstantes HIGH mehr. Was ist aber 
wahrscheinlich das kleinere Übel, denn ein leichte Glimmen der LEDs ist 
störender als nur 99,5% Maximalleistung.

von Jan N. (jan_n497)


Lesenswert?

Falk B. schrieb:
> pwm=wasauchimmer;
>
> if (pwm == 0) {
>   // SOnderbehandlung, OCRxy abschalten und manuell auf LOW schalten
>   TCCRxA = ...  // PWM ausschalten
>
> } else {
>   TCCRxA = ...  // PWM einschalten
>   OCRxA = pwm;
> }

Hi Falk.
Sorry für die späte Antwort. Wahr beim Sport.
Hhmm, ich glaube das ich das nicht anwenden kann. Denn mit dem 16 Bit 
Timer kontrolliere ich die Rote und die Grüne LED in der RGB Led. Also 
ausschalten. Dann wäre ja auch der Rote weg wenn Grün 0 ist und 
umgekehrt. Ich werde es mal mit PWM Phase Correct versuchen

von spess53 (Gast)


Lesenswert?

Hi

>Dann wäre ja auch der Rote weg wenn Grün 0 ist und
>umgekehrt. Ich werde es mal mit PWM Phase Correct versuchen

Dann schalte halt nur den entsprechenden Ausgangag ab.

MfG Spess

von Durchstarter (Gast)


Lesenswert?

>Kann man, aber dann hat man kein konstantes HIGH mehr. Was ist aber
>wahrscheinlich das kleinere Übel, denn ein leichte Glimmen der LEDs ist
>störender als nur 99,5% Maximalleistung.

Genau umgekehrt. Das menschliche Auge wird den Unterschied zwischen 
99,5% und 100% überhaupt nicht sehen - ein leichtes Glimmen, wenn 
eigentlich Dunkelheit sein soll sehr wohl.

von Jan N. (jan_n497)


Lesenswert?

spess53 schrieb:
> Dann schalte halt nur den entsprechenden Ausgangag ab.

Ich nutze einfach Phase Correct. Damit geht es super.

von Axel S. (a-za-z0-9)


Lesenswert?

Durchstarter schrieb:
>>Kann man, aber dann hat man kein konstantes HIGH mehr. Was ist aber
>>wahrscheinlich das kleinere Übel, denn ein leichte Glimmen der LEDs ist
>>störender als nur 99,5% Maximalleistung.
>
> Genau umgekehrt. Das menschliche Auge wird den Unterschied zwischen
> 99,5% und 100% überhaupt nicht sehen - ein leichtes Glimmen, wenn
> eigentlich Dunkelheit sein soll sehr wohl.

Darüber willst du nochmal nachdenken. Glaube ich.

von c-hater (Gast)


Lesenswert?

Jan N. schrieb:

> Ich nutze einfach Phase Correct. Damit geht es super.

Ja sicher, allerdings nur mit (wahlweise) halber Auflösung oder halber 
PWM-Frequenz. Das ist der Nachteil gegenüber Fast PWM.

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.