Forum: Mikrocontroller und Digitale Elektronik Atmega8 Soft PWM Verständnis


von Der Lars (Gast)


Lesenswert?

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.

von Condi (Gast)


Lesenswert?

In Zeile 42 fehlt die 1.

von Der Lars (Gast)


Lesenswert?

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
}

von Falk B. (falk)


Lesenswert?

Es wäre geradezu absurd, wenn man einfach mal den Beispielcode aus dem 
Artikel Soft-PWM benutzt.

MFG
Falk

von Der Lars (Gast)


Lesenswert?

Diesen Code habe ich in ausgedruckter Form hier liegen.

Aber ich will es ja verstehen und nicht einfach nur copy & paste machen.

von Der Lars (Gast)


Lesenswert?

Übrigens flackert meine LED bei dem Beispielcode genau so.

von Falk B. (falk)


Lesenswert?

@  Der Lars (Gast)

>Übrigens flackert meine LED bei dem Beispielcode genau so.

Was wohl daran liegen könnte, dass dein AVR nicht mir 8 MHz sonder 1 MHz 
läuft, weil wahrscheinlich die AVR Fuses falsch programmiert sind.
Stichwort CLK DIV 8 Fuse.

MFG
Falk

von Verwirrter Anfänger (Gast)


Lesenswert?

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.

von Der Lars (Gast)


Angehängte Dateien:

Lesenswert?

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"

von Falk B. (falk)


Lesenswert?

Die Fuses sind OK.

von Der Lars (Gast)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

@  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

von Der Lars (Gast)


Lesenswert?

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...

von Falk B. (falk)


Lesenswert?

@  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

von Condi (Gast)


Lesenswert?

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.

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.