Forum: Compiler & IDEs PWM macht Probleme


von Taub (Gast)


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!

von Mathias O. (m-obi)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Jörg G. (joergderxte)


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

von Mathias O. (m-obi)


Lesenswert?

@ Karl:
OK dann wurde ich jetzt eines besseren belehrt. Ich dachte nur er hatte 
sich vertippt.

von Taub (Gast)


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 ;)

von Rolf Magnus (Gast)


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.

von hans (Gast)


Lesenswert?

Hallo Taub,

schau dir doch mal die Tiny261/461/861 an.

Haben "nur" 2 Timer, aber der Timer 1 ist 16 Bit und kann
3 x PWM mit 10 Bit machen.

gruß hans

von Taub (Gast)


Lesenswert?

@ Rolf
den Kondensator hab ich mir verkniffen, es hängt nur ein MOSFET davor 
und an seinem Gate noch ein Transistor als Vorverstärker, damit es auch 
sicher in die Sättigung kommt.

@ hans
Danke für den Tip, ich schau gleich mal, hört sich gut an!
... glaube mein Problem ist gelöst...

Danke an alle nochmal!

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.