PWM macht Probleme

Gast #1256478
Lesenswert?

Hallo,

mein Atmega32 läuft auf 8 MHz intern und habe folgenden Code bisher in 
der Main:
1
  TCCR1A = (1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0)|(1<<WGM10)|(1<<WGM12); //Fast-PWM: 8Bit, IST invertiert A/B,
2
  TCCR1B = (1<<CS12); // 256 PreScaler
3
  TCCR2  = (1<<CS22)|(1<<CS21)|(0<<CS20)|(1<<WGM20)|(1<<WGM21)|(1<<COM20)|(1<<COM21); //Fast-PWM: 8 Bit, IST invertiert, 256 PreScaler
4
  TCCR0  = (1<<WGM01)|(1<<WGM00)|(1<<COM01)|(1<<COM00)|(0<<CS00)|(1<<CS02); //Fast-PWM: 8 Bit, IST invertiert, 256 PreScaler
Problem (Habe RGB LEDs angeschloßen):
1. Prescaler geht nur 1024 und 256, bei niedriger ist die PWM dauerhaft 
"1".
2. bei den unteren 30% flackerts
3. TCCR0 bzw TCCR2 hat ein gewissen Grundleuchten/Signal, während 
TCCR1A/TCCR1B  bei 0% auch wirklich 0% sind.
Woran liegt das? Wie lassen sich diese Probleme beheben?

Danke!
#1256589
Lesenswert?

Mathias O. schrieb:
> Das einzigste was mir auffällt ist das
>
1
(0<<CS20)
> und
>
1
(0<<CS00)
> Meiner Meinung nach geht das nicht.

Es geht schon, es macht nur nix.
Wenn die Absicht war, dieses Bit nicht zu setzen, dann geht das so in 
Ordnung. Viele sind der Ansicht, dass man in diesem Fall den Term 
entfernen sollte. Andere lassen ihn drinnen um anzuzeigen, dass dieses 
Bit bewusst nicht gesetzt wird. Von daher geht das in Ordnung.

Aber das erklärt nicht das Problem des OT.
Persönlich tippe ich auf ein Hardwareproblem. Aus Softwaresicht gibt es 
keinen Grund, warum kleinere Vorteiler nicht funktionieren sollten. Da 
gibt es auch keine Ausnahmen oder sonstige Fallen. Wenn man die 
richtigen CS Bits im richtigen Register setzt, wird auch der Vorteiler 
entsprechend ausgewählt.
#1256595
Lesenswert?

Das Bit "WGM12" ist im Register TCCR1B nicht -A, dein Timer1 läuft im 10 
Bit Phase-correct-PWM-Mode
> 1. Prescaler geht nur 1024 und 256, bei niedriger ist die PWM
> dauerhaft "1".
> 2. bei den unteren 30% flackerts
Zeige mehr Code und deinen Schaltplan
> 3. TCCR0 bzw TCCR2 hat ein gewissen Grundleuchten/Signal, während
> TCCR1A/TCCR1B  bei 0% auch wirklich 0% sind.
Liegt am Fast-PWM mode (und am anders/falsch konfigurierten Timer1)
Aus dem Datenblatt ("Timer0" -> "Modes of operation" -> FastPWM)
1
The extreme values for the OCR0 Register represents special cases when
2
 generating a PWM waveform output in the fast PWM mode. If the OCR0 is set 
3
equal to BOTTOM, the output will be a narrow spike for each MAX+1 timer
4
 clock cycle. Setting the OCR0 equal to MAX will result in a constantly
5
 high or low output (depending on the polarity of the output set by the
6
 COM01:0 bits.)
 (gleiches für die anderen Timer)

rtfm, Jörg
Gast #1257032
Lesenswert?

Danke für eure schnellen Antworten!

@ Mathias / Karl
Habe die (0<<abc) Syntax nur zum testen drin, ob mit oder ohne führt zum 
selben Ergebnis.

@ Jörg
Danke, hat ich übersehen und jetzt korrigiert.

Und nochmal an alle:
Zu Punkt 1, glaube es liegt an einem Denkfehler von mir. Hab bisher mit 
9Bit Auflösung getestet, durch die feinen Stufen ging die LED richtig 
schön dunkel zu dimmen, allerdings erst im letzten 1/5 des 9Bit 
Bereiches.
Jetzt mit der 8Bit Auflösung scheint der Bereich in einer Zahl zu 
liegen. Also auf den invertierten Modus bezogen, 255 ist aus, 254 schon 
recht (zu) hell. Alle anderen Werte machen einen kaum sichtbaren 
Unterschied.
D.h. ich brauche 3 Timer (RGB-LED) die mind. 9 Bit können um die LED 
dunkler zu bekommen (ohne das es flackert)?
Mein Atmega32 hat nur 2x 16 Bit und 2x 8Bit Timer, also benötige ich 
einen Atmega64 um es Hardwareseitig zu lösen.

Bitte gebt eure Meinung ab bzw. korrigiert mich!

Die hohe Helligkeit bei dem fast 0 Helligkeitswert bekomme ich nur durch 
senken der Taktfrequenz oder erhöhen des Prescalers weg?

PS:
Demnach war es kein Prescalerproblem, sondern ein menschliches 
Augenproblem ;)
Gast #1257361
Lesenswert?

> Die hohe Helligkeit bei dem fast 0 Helligkeitswert bekomme ich nur
> durch senken der Taktfrequenz oder erhöhen des Prescalers weg?

Nein, wieso? Der LED ist der Takt ziemlich wurscht. Viel weiter wirst du 
nicht senken können. Bei 8 Mhz und einem Prescaler von 1024 hast du ja 
eh nur noch 30 Hz PWM-Frequenz.
Wie hast du die LEDs eigentlich angeschlossen? Du hast hoffentlich nicht 
noch einen Kondensator parallel geschaltet oder so? Das würde nämlich 
das Verhalten ganz gut erklären.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren