Atmega8 Soft PWM Verständnis

Gast #1912742
Alsooo,

ich käse hier schon seit einigen Tagen mit dieser/m Soft PWM rum.

ich möchte eine LED dimmen.
Nach dem Lesen von unzähligen Forumsbeiträgen, tutorials, und sonstigen 
Homepages weiß ich inzwischen, dass ich einen Timer brauche.

Also habe ich den Timer1 so eingerichtet, dass er einmal die LED 
einschaltet, wenn der Timer auslöst und beim zweiten mal die LED wieder 
ausschaltet und dann wieder einschaltet und wieder ausschaltet...

Nun habe ich gehofft, dass wenn ich den Wert von OCR1A änder, dass die 
LED dadurch gedimmt wird. Tut sie aber nicht. Sie beginnt nur zu 
flackern.
Was ja im Grunde auch logisch ist, da der Timer ja nichts anderes 
veranlasst.

Also wie bekomme ich es nun hin, dass meine LED gedimmt wird???

Das Hardwarebasierte PWM hab ich hinbekommen. Das läuft auch.
Gast
Also falls du darauf hinaus willst, dass ich kein Code gepostet habe... 
sry
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
int t=1;
4

5
ISR(TIMER1_COMPA_vect)
6
{
7
  t++;
8
  if (t==3)
9
    {
10
    t=1;
11
    }
12

13
  if (t==1)
14
    {
15
    PORTC = 0x00; //LED an;
16
    }
17
  else if (t==2)
18
    {
19
    PORTC = 0xff; //LED aus;
20
    }
21
  
22
  TCNT1 = 0; //Zähler nullen
23

24

25
}
26

27

28
int main(void)
29
{
30
   DDRC = 0xff;
31
   PORTC = 0xff;
32
   
33
   TCCR1A = 0x00;
34
   TCCR1B = 1;      
35
   OCR1A = 18000;      
36
   TIMSK = (1<<OCIE1A);   
37
   sei(); 
38

39

40
while(1); 
41
return 0; 
42
}
Gast
Wie ist denn F_CPU eingestellt?
Wenn das ein frischer chip ist, läuft der wahrscheinlich auf 1 mhz statt 
den 8mhz die in dem Soft-PWM Beispielen verwendet werden.
Den Unterschied zwischen 100Hz und 12.5 Hz könnte man schon als flackern 
wahrnehmen.
Gast
Anhängend findet ihr ein Bild. Ich kenne mich mit den Einstellungen 
nicht aus (bin newbie) desshalb will ich da nicht einfach rumprobieren.

Und für F_CPU steht ja in dem Beispielcode oben drin "#define F_CPU 
8000000L"
Angehängte Dateien:
Gast
Hab ich das denn richtig verstanden, dass das Dimmen dadurch geschieht, 
dass ich durch den Timer die ein und ausschaltzeiten veränder?

und die Veränderung wird doch durch den OCR1A wert gemacht oder?
@  Der Lars (Gast)

>Hab ich das denn richtig verstanden, dass das Dimmen dadurch geschieht,
>dass ich durch den Timer die ein und ausschaltzeiten veränder?

Ja.

>und die Veränderung wird doch durch den OCR1A wert gemacht oder?

Kommt drauf an. Im 1. und 2. Beispiel NEIN, dort läuft der Timer mit 
konstanter Frequenz. Im 3. Beispiel ja, dort wird es komplexer. Aber 
OCR1A wird dort nicht direkt manipuliert, als Nutzer der PWM ruft man 
nur PWM_update auf.

MFG
Falk
Gast
Kannst du mir nun auch noch den entscheidenen Hinweis liefern, wie ich 
das erste Beispiel verändern müsste, um meine LED zu dimmen???


Das ist alles ganz schön kompliziert...
@  Der Lars (Gast)

>Kannst du mir nun auch noch den entscheidenen Hinweis liefern, wie ich
>das erste Beispiel verändern müsste, um meine LED zu dimmen???

Gar nicht. Das läuft so. Gedimmt werden die Pins an PORTD, die einzenln 
PWM-Werte müssen in das Array pwm_setting geschrieben werden. Das ist 
alles.
OCR1A fasst man dazu nicht an.

MFG
Falk
Gast
Naja, nich ganz.

Das Dimmen wird durch die Veränderung des Verhältnisses von ein zu 
Auszeit gemacht. Wenn du die HW PWM nutzt, dann machst du das über 
OCR1A. Der Timer läuft immer von 0-65535 und toggelt bei deinem OCR1A 
wert den Zustand.

Wenn du die HW PWM nutzt, dann läuft der Timer 122 mal von 0 - 65535. 
Bei 18000 im OCR1A sind das rund 30% in der die LED an ist und 70% aus.

Dein Interrupt wird bei 8Mhz/18000 rund 440 mal in der Sekunde 
aufgerufen.

In der Hälfte der 440 Interrupts ist die LED an und in der Anderen aus.

Normalerweise sollte die LED nur "halb" so hell Leuchten. Selbst wenn 
der Mega nur mit 1Mhz läuft, sollte man da nichts blinken sehen. Wie 
schnell blinkt es denn?

Wenn du damit dimmen willst, brauchst du mehr t Zustände
T=10  t1-3 LED an, 4-10 LED aus -> "40" Helligkeit.

Idealerweise wird im Interrupt nur t hochgezählt. Deine Vergleiche 
schreibst du in deine While Schleife der Main.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.