Forum: Mikrocontroller und Digitale Elektronik Atmega8 8bit PWM


von Kay O. (stm_fan)


Lesenswert?

Hallo,
Ist meine init für die 3Hardware Kanäle richtig eingestellt für 8bit.

Ich möchte damit eine RGBD Led faden.
Der Atmega8 läuft mit 16Mhz



// OC1A, OC1B, OC2 auf Ausgang
  DDRB = (1 << PB1 ) | (1 << PB2 ) | (1 << PB3 );


  TCCR1A = (1<<COM1A1) | (1<<WGM10);     // PWM Phase correct, 8Bit
                                   // Clear OCR1A/B on Compare Match 
when up-counting.
                          // Set OCR1A/B on Compare Match when 
downcounting.
  TCCR1B = (1<<CS10);            // keinen Vorteiler

  TCCR2 = (1<<WGM20) | (1<<COM21) | (1<<CS20);  // PWM Phase correct, 
8Bit
                                   // Clear OC2 on Compare Match when 
up-counting.
                          // Set OC2 on Compare Match when downcounting.
                            // keinen Vorteiler


 //Maximale Helligkeit
    OCR1A = 255;  //  der Zähler zählt bis zu diesen Werten
    OCR1B = 255;
    OCR2 = 255;

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Kay O. schrieb:
> TCCR1A = (1<<COM1A1) | (1<<WGM10);     // PWM Phase correct, 8Bit
>                                    // Clear OCR1A/B on Compare Match
> when up-counting.

Wenn du auf OC1B das gleiche machen möchtest wie auf OC1A, dann solltest 
du noch das COM1B1 Bit setzen, sonst passiert auf OC1B nix.

> // keinen Vorteiler
Das würde ich mir nochmal überlegen. Bei 16Mhz liegt die PWM Frequenz 
dann bei 31,25 kHz und stresst deine Endstufe ganz schön. Aus Erfahrung 
ist eine PWM Frequenz von etwa 4kHz zum flimmerfreien Dimmen von LED 
ausreichend.
Gehen tuts aber auch mit 31 kHz.

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Kay O. schrieb:

> Ist meine init für die 3Hardware Kanäle richtig eingestellt für 8bit.

Nicht ganz. Hier fehlt noch ein Bit:

>   TCCR1A = (1<<COM1A1) | (1<<WGM10);

von Kay O. (stm_fan)


Lesenswert?

Ich hab das jetzt erstmal so das geht auch, ist sicherlich nicht ganz 
richtig.

Bei OCR2 Flackerte meine Led.

vielleicht könnte mir nochmal einer weiterhelfen das ich auf allen 
3Kanälen die gleiche Frequenz habe und das alle 3Kanäle 8bit sind.

1
   TCCR2 = (1<<WGM20|1<<COM21|0<<COM20|1<<CS22|0<<CS21|0<<CS20);
2
 
3
   TCCR1A  = (1<<COM1A1|1<<COM1B1|1<<WGM10);    //;COM1A1,COM1A0,COM1B1,COM1B0,COM1C1,COM1C0,WGM11,WGM10
4
                   
5
   TCCR1B  = (0<<CS12|1<<CS11|1<<CS10);    // ;ICNC1,ICES1,WGM13,WGM12,CS12,CS11,CS10

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Kay O. schrieb:
> TCCR2 = (1<<WGM20|1<<COM21|0<<COM20|1<<CS22|0<<CS21|0<<CS20);

Sach mal, liest du ab und zu mal Datenblätter? Ich habe dir doch oben 
beispielhaft mal eine PWM Frequenz genannt und du rätst bei den 
Prescalern jetzt einfach nur rum.
Klar, 488 Hz sieht man nun mal flimmern.

> TCCR1B  = (0<<CS12|1<<CS11|1<<CS10);
Und hier genauso. Lies also mal die Registerbeschreibung von TCCR2 und 
TCCR1B.
Die Klammern aus deinem ersten Beitrag schaden übrigens keineswegs. Mach 
die mal wieder rein.

: Bearbeitet durch User
von Kay O. (stm_fan)


Lesenswert?

ich hatte gefragt ob mir das vielleicht einer Erklären kann die 
Berechnung für den vorteiler , da ich nicht so richtig klarkomme wie die 
passende Frequenz berechnet wird.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Kay O. schrieb:
> wie die passende Frequenz berechnet wird.
Welches ist denn "die passende Frequenz"?
Mit welcher Frequenz soll denn deine LED "flackern"?
Wenn du diese Frequenz hast, dann multiplizierst du sie mit 256 und hast 
die Frequenz, die du am Zählereingang brauchst. Und dann nimmst du die 
16MHz und teilst sie durch diese Zählereingangsfrequenz und bekommst den 
nötigen Vorteiler.

von c-hater (Gast)


Lesenswert?

Kay O. schrieb:

> vielleicht könnte mir nochmal einer weiterhelfen das ich auf allen
> 3Kanälen die gleiche Frequenz habe und das alle 3Kanäle 8bit sind.

Wie schon weiter oben gesagt, war dein ursprüngliches Programm bereits 
fast vollständig korrekt, bis auf das eine fehlende Bit für die Ausgabe 
auf OC1B.

Warum hast du das nicht erstmal einfach nur ergänzt und gut isses?

Die Anmerkung von 'Kay O.' ist zwar nicht ganz von der Hand zu weisen, 
aber wie er ja auch schon selber schrieb: funktionieren muss es erstmal 
auch mit 31kHz.

Wenn du dann die PWM-Frequenz durch veränderte Prescaler absenken 
willst, spricht da natürlich auch nix dagegen. Nimmst du einfach die 
beiden Tabellen der möglichen Prescaler für Timer1 und Timer2, legst sie 
nebeneinander und suchst dir erstmal die übereinstimmenden 
Teilerfaktoren heraus.

Dann rechnest du zu jedem der übereinstimmenden Teiler die sich 
ergebende Frequenz aus und wählst dann was passendes aus. Hier würde ich 
übrigens die Grenze viel niedriger ansetzen als 'Kay O.'. Schon alles 
oberhalb ca. 200Hz ist gut brauchbar, da sollte nix flimmern und schon 
garnix flackern. Nur (vorsichtig ausgedrückt) "besonders sensitive" 
Personen sehen da eventuell aus den Augenwinkeln noch ein leichtes 
Flimmern. Möchte mal wissen, wie die damals(tm) TV geguckt haben, als 
die Dinger allesamt noch mit 50(!)Hz liefen...

Wie auch immer. Wenn du den passenden Prescalerfaktor ausgewählt hast, 
dann entnimmst du der Tabelle für den jeweiligen Timer einfach die 
jeweils zu setzenden Bits und schreibst die in deinen Quelltext und 
fertig. Denn ansonsten gibt es daran nix zu ändern.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Lothar M. schrieb:
> dann multiplizierst du sie mit 256

Bei 'Phase Correct PWM' sinds doch 512, oder? Aber das spielt hier ja 
nicht wirklich die grosse Geige.

c-hater schrieb:
> Schon alles
> oberhalb ca. 200Hz ist gut brauchbar, da sollte nix flimmern und schon
> garnix flackern.

Probiers mal aus - sehr dunkel gedimmte LED sieht man auch bei 200Hz 
Flimmern, vor allem bei Bewegungen (des Kopfes oder der LED). Ich hab 
damit mal rumgespielt und einen brauchbare Kompromiss bei so 3-4 kHz 
gefunden.

von c-hater (Gast)


Lesenswert?

Matthias S. schrieb:

> Probiers mal aus - sehr dunkel gedimmte LED sieht man auch bei 200Hz
> Flimmern

Ich persönlich seh' schon bei 100Hz kein Flimmern mehr. Aber klar: ich 
bin erstens scheissealt und war zweitens auch nie "besonders sensitiv" 
veranlagt...

Was ich mich aber frage: was würde von deiner offensichtlich weit über 
der Norm der menschlichen Wahrnehmung liegenden gehobenen Sensitivität 
in einem Doppelblindtest tatsächlich über bleiben?...

von Wolfgang (Gast)


Lesenswert?

c-hater schrieb:
> Ich persönlich seh' schon bei 100Hz kein Flimmern mehr. Aber klar: ich
> bin erstens scheissealt und war zweitens auch nie "besonders sensitiv"
> veranlagt...

Dann nimm mal im dunklen Raum eine Punktlichtquelle und bewege den Kopf 
zügig. Du siehst nicht irgendwelches Flimmern, sondern die Lichtpunkte.

von Paul B. (paul_baumann)


Lesenswert?

Wolfgang schrieb:
> ....und bewege den Kopf
> zügig.

Kann er nicht mehr, denn er ist:

c-hater schrieb:
> ....ich
> bin erstens scheissealt und war zweitens auch nie "besonders sensitiv"
> veranlagt...


;-)

MfG Paul

von Kurt B. (kurt-b)


Lesenswert?

Wolfgang schrieb:
> c-hater schrieb:
>> Ich persönlich seh' schon bei 100Hz kein Flimmern mehr. Aber klar: ich
>> bin erstens scheissealt und war zweitens auch nie "besonders sensitiv"
>> veranlagt...
>
> Dann nimm mal im dunklen Raum eine Punktlichtquelle und bewege den Kopf
> zügig. Du siehst nicht irgendwelches Flimmern, sondern die Lichtpunkte.

Ist wohl irgendwie logisch, denn die einzelnen kurzen Sendepulse liegen 
dann wie aufgereiht auf einer Perlschnur im Auge vor bereit gelesen zu 
werden.

Ist es eine kontinuierliche Lichtquelle wird's wohl ein Strich sein den 
man sieht.


 Kurt

von Kay O. (Gast)


Lesenswert?

so,
ich habe mit 1khz gerechnet:

1000x256 = 256000

16000000:256000 = 62,5Teiler

62,5 gibs aber nicht laut Datenblatt da hab ich 64 genommen.


ist das so richtig?
1
   TCCR1A  = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);    
2
                   
3
   TCCR1B  = (0<<CS12)|(1<<CS11)|(1<<CS10);    // teiler64
4
5
   TCCR2 = (1<<WGM21)|(1<<WGM20)|(1<<COM21)|(1<<CS22);// teiler64

von c-hater (Gast)


Lesenswert?

Wolfgang schrieb:

> Dann nimm mal im dunklen Raum eine Punktlichtquelle und bewege den Kopf
> zügig. Du siehst nicht irgendwelches Flimmern, sondern die Lichtpunkte.

Ah, jetzt ja. Jetzt erkenne ich das Problem. Ich bin einfach noch nicht 
alt genug. Jedenfalls wackelt mit der Kopf normalerweise noch nicht 
derart, dass mir das auffallen könnte...

Naja, reden wir in zehn Jahren oder so nochmal drüber...

Allerdings: Flimmern oder Flackern ist das auch mit derart krankhaftem 
Kopfwackeln noch nicht, oder? Und ich frage da jetzt echt den 
Fachmann...

von c-hater (Gast)


Lesenswert?

Kay O. schrieb:

> ist das so richtig?
>
>
1
>    TCCR1A  = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);
2
> 
3
>    TCCR1B  = (0<<CS12)|(1<<CS11)|(1<<CS10);    // teiler64
4
> 
5
>    TCCR2 = (1<<WGM21)|(1<<WGM20)|(1<<COM21)|(1<<CS22);// teiler64
6
>

Nein.

Wieso änderst du bei jeder Iteration den Modus, in dem du den Timer 
betreiben willst? Das ist entweder Trolligkeit vom Feinsten oder völlige 
Idiotie.

In jedem Fall ist dir nicht zu helfen. Denn auch Trolligkeit ist eine 
Form von Idiotie.

von Kay O. (stm_fan)


Lesenswert?

c-hater schrieb:
> Kay O. schrieb:
>
>> ist das so richtig?
>>
>>
1
>>    TCCR1A  = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);
2
>>
3
>>    TCCR1B  = (0<<CS12)|(1<<CS11)|(1<<CS10);    // teiler64
4
>>
5
>>    TCCR2 = (1<<WGM21)|(1<<WGM20)|(1<<COM21)|(1<<CS22);// teiler64
6
>>
>
> Nein.
>
> Wieso änderst du bei jeder Iteration den Modus, in dem du den Timer
> betreiben willst? Das ist entweder Trolligkeit vom Feinsten oder völlige
> Idiotie.
>
> In jedem Fall ist dir nicht zu helfen. Denn auch Trolligkeit ist eine
> Form von Idiotie.

Ich habe höflich gefragt und bekomme von ihnen nur oberflächlichen 
aussagen dies und jenes sei nicht richti .

kann man mir nicht helfen da ich nicht so bewandert bin.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Kay O. schrieb:
> kann man mir nicht helfen da ich nicht so bewandert bin.

Blablabla. Wir haben dir jetzt mehrfach geholfen, indem wir selber im 
Datenblatt rumgewühlt haben - nun ist es bei dir, zu lesen und das 
Datenblatt in dein Programm umzusetzen.

von jojo (Gast)


Lesenswert?

Hallo lieber TO,

beschreib doch mal was Du machen willst.
Schreibe Dir gerne das  eine oder andere C Programm!

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.