mikrocontroller.net

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


Autor: Der Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Condi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In Zeile 42 fehlt die 1.

Autor: Der Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also falls du darauf hinaus willst, dass ich kein Code gepostet habe... 
sry
#include <avr/io.h>
#include <avr/interrupt.h>
int t=1;

ISR(TIMER1_COMPA_vect)
{
  t++;
  if (t==3)
    {
    t=1;
    }

  if (t==1)
    {
    PORTC = 0x00; //LED an;
    }
  else if (t==2)
    {
    PORTC = 0xff; //LED aus;
    }
  
  TCNT1 = 0; //Zähler nullen


}


int main(void)
{
   DDRC = 0xff;
   PORTC = 0xff;
   
   TCCR1A = 0x00;
   TCCR1B = 1;      
   OCR1A = 18000;      
   TIMSK = (1<<OCIE1A);   
   sei(); 


while(1); 
return 0; 
}

Autor: Falk Brunner (falk)
Datum:

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

MFG
Falk

Autor: Der Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diesen Code habe ich in ausgedruckter Form hier liegen.

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

Autor: Der Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Übrigens flackert meine LED bei dem Beispielcode genau so.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Verwirrter Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Der Lars (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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"

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Fuses sind OK.

Autor: Der Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Der Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Condi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.