www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Soft PWM noch zu schnell


Autor: Danny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen...

Ich habe folgndes Problem: Ich habe das Tutorial durchgearbeitet und mir 
testweise die intelligente LSG des soft PWM kopiert - das problem ist 
jetzt nur, dass selbst wenn ich die 1 als Helligkeit in dem Array 
eingebe ist die LED noch immer viel zu hell um sie langsam ausfaden zu 
lassen... ich habe das erstmal mit einer einzelnen probiert - wie gesagt 
zum Test - sinn der Sache ist es nachher eine RGB LED anzusteuern - nur 
wenn die einzelne LED nicht fast vollständig aus geht, sind die 
einzelnen Farbanteile der RGB auch zuu hell... versteht ihr was ich 
meine... ?!

Ich suche eine Möglichkeit den Code so anzupassen, dass die einzelne LED 
fast vollständig aus geht! Ich meine dass das am dem Timer liegt - der 
müsste schneller zählen, dass das ausschalten-Interrupt schneller 
gesetzt werden kann, aber wie und vor allem wo mach ich das in dem Code 
aus dem Tut? 
(http://www.mikrocontroller.net/articles/Soft-PWM#I...)
Mit dem normalen PWM aus dem "Thema" LED-Fading geht das ja auch 
wunderbar, nur ist das eben nur für eine begrenzte Anzahl von Pins...

Über Lösungsansätze oder Gendanken wäre ich mehr als Dankbar... :)

MfG Danny

Autor: Danny (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir bite jemand helfen ?? Ich habe im Forum schon einen 
Lösungsansatz erhalten, wie ich das alles auf einen 16 Bit timer 
umschreiben kann, aber da sind ne Menge Wert zu beachten...

Hier im Anhang ist, was ich bisher habe - könnt ihr das mal überprüfen 
und evtl korrigieren ?? Ich wäre euch sehr verbunden :) ich habe schon 
alles durchgesehen, aber finde des Rätsels Lösung immer noch nicht... =(

Danke schonmal vorab...

Autor: TokyoDrift (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du hast nur 2 möglichkeiten das dunkler zu bekommen, entweder du machst 
die LED grundsätzlich dunkler (=> widerstand) oder du verringerst das 
tastverhältnis
und da es mit 8 bit timern eben nich kleiner als 1/256 geht musst du 
eben 16 bit timer nehmen um dann als kleinsten wert 1/65536 zu haben

Autor: Danny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
genau - das hattest du mir ja im Forum schon gesagt - danke nochmal - 
ich habe auch soweit versucht alles auf 16-Bit timer umzuschreiben, aber 
ich dneke ich habe nicht ganz alles bedacht... ?! ich habe in dem 2. 
Post den überarbeiteten Code... ich bräuchte noch ein Paar Fehler, die 
sich dort versteckt haben... selbst mit einem prescaler von 1 flackert 
die LED recht langsam... war darauf schließen lässt, dass die Frequenz 
des PWM zu klein ist, aber da entstehen wieder andere Fehlerquellen in 
diesem code.... ich habe oben wie gesagt das überarbeitete - wenn ihr da 
mal einen Blick drauf werfen könntet wäre ich euch treu ergeben ;)

Danke!

Autor: Hans_Dampf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ISR(TIMER1_COMPA_vect)
{
    static uint16_t pwm_cnt;
    uint16_t tmp;
 
    OCR1A += isr_ptr_time[pwm_cnt];
    tmp    = isr_ptr_mask[pwm_cnt];
    
    if (pwm_cnt == 0) {
        PWM_PORT = tmp;
        pwm_cnt++;
    }
    else
    {
        PWM_PORT &= tmp;
        if (pwm_cnt == pwm_cnt_max)
        {
            pwm_sync = 1; 
            pwm_cnt  = 0;
        }
        else pwm_cnt++;
    }
}
 
int main(void)
{
    PWM Port einstellen
    PWM_DDR = 0xFF;         // Port als Ausgang
    // Timer 1 OCRA1, als variablen Timer nutzen
    TCCR1B = 1;             // Timer läuft mit Prescaler 64
    TIMSK |= (1<<OCIE1A);   // Interrupt freischalten
    sei();   
               // Interrupts gloabl einschalten
    ...
 
// Debug 
 
    memcpy(pwm_setting, t1, 16);
    pwm_update();


/* 
  ...
*/
/******************************************************************/
 
    while(1);
    return 0;
}

Du hast aber schon gesehen, dass Deine "pwm_update();" Funktion genaut 
einmal aufgerufen wird und zwar bevor Dein Programm in die 
while(1)-Schleife springt?!

Autor: Danny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jo jo danke für den Timm bzgl. der while schleife - das ist nur zum 
test, die LEDs gehen denn 1x an und bleiben an - nur zum testen wie 
gesagt.... :)

Aber danke erstmal für deinen code - ich werde ihn gleich mal 
ausprobieren... =)

-> 10 min. später <-

hmm leider noch kein Erfolg - ich habe das gefühl es ist egal was ich 
ihm als input gebe (im tutorial die Beispielarrays - er schaltet immer 
bit 0,3 und 4 an - wobei bit 4 als 1. aus geht, dann 3 und dann bit 0 - 
egal was ich ihm eingebe - ich nehme an schon in den oberen schleifen 
wird etwas nicht stimmen bzw. i-was kommt damit nicht klar, dass der 
timer jetzt bis 65536 zählen kann.... :?

Hat niemand eine funktionierende Lösung für die 16 bit soft PWM ?
Ider lass und diese Version aus dem Tutorial stück für stück auf 16 bit 
umschreiben.... - so leicht geben wir uns doch nicht geschlagen oder was 
;)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Danny (Gast)

>Hat niemand eine funktionierende Lösung für die 16 bit soft PWM ?

Die gibt es nicht. Das steht auch im Artikel Soft PWM.

Man könnte aber mit einem Trick arbeiten. Man verwendet zwei 
Vorwiderstände. Den normalen, der wird schaltbar gemacht. Und einen der 
1/256 des normalen ist, der ist fest. Mit dem kleinen Vorwiderstand kann 
man sehr fein auflösen, wenn man dann bei 255 angekommen ist, wird auf 
volle Leistung umgeschaltet. Fertig ist eine pseudo 16 Bit PWM.

MfG
Falk

Autor: Hans_Dampf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Aber danke erstmal für deinen code - ich werde ihn gleich mal
>ausprobieren... =)

Ist nicht von mir, ist Deiner nur etwas umformatiert! Kleiner Tip, eine 
saubere Form deines Programms ist ein enormer Zugewinn, was die 
Lesbarkeit angeht! :-)

Hier meine Soft-PWM(8-Bit)
volatile unsigned char Counter, Merker_Timer0;
unsigned char PWM;

...

void Timer_init()
{
    TCCR0 |= (1<<CS00);   
    TIMSK |= (1<<TOIE0);  
}

...

ISR (TIMER0_OVF_vect)      // Timer0 Overflow 
{
  Counter++;      // Zeitbasis für Software PWM 
  
        if(Counter < PWM )    // SOFTWARE-PWM Modul
            LED=0;            // PWM Grundfrequnez ergibt sich zu
   else          // 16MHz / ( 256*256) = 244.1 Hz
            LED=1;

  Merker_Timer0=1;
}

(In meinem Programm setzt ein LED=0 bzw. =1 noch nicht direkt die LED, 
solltest Du ersetzen durch PORTX &= ~(1 << Y) für =0 und PORTX |= (1 << 
Y) für =1)

Was ist denn das für eine LED die Du da hast, dass die bei 1/256 ihres 
Nennstromes noch so hell ist?

Gruß

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Hans_Dampf (Gast)

>Was ist denn das für eine LED die Du da hast, dass die bei 1/256 ihres
>Nennstromes noch so hell ist?

Das muss keine besondere sein, siehe LED-Fading.

Autor: Hans_Dampf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>@  Hans_Dampf (Gast)

>>Was ist denn das für eine LED die Du da hast, dass die bei 1/256 ihres
>>Nennstromes noch so hell ist?

>Das muss keine besondere sein, siehe LED-Fading.

Die LEDs mit denen ich arbeite sind bei einem Tastverhältnis von 1:256 
fast nicht mehr wahrzunehmen.

Interessiert mich immernoch, was Du da für LEDs hast.

Autor: Danny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm ich bin gerade nicht zu Hause, aber ich habe mir mal bei eBay solche 
superhellen LEDs gekauft - die haben 16000 mcd oder so - aber ich schaue 
nochmal nach !

bei den roten LEDs steht jedenfalls 1,8-2,2 V und 20-30 mA drauf und ich 
glaube 12.000 mcd...

ob das daran liegt dass die besonders hell sind ? Ich hatte damals 
darauf geachtet, dass ich die hellsten bekomme die ich bei ebay finden 
konnte... Vllt liegt es ja daran.... :?

Danke erstmal für eure Tipps =)

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.