Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Commande PWM led blanche : saut de luminosité



  1. #1
    mweber

    Commande PWM led blanche : saut de luminosité

    Bonjour à tous,

    J'ai programmé un 16F876 en C pour piloter en PWM 1 LED RVB dans le but de faire un simulateur d'aube à intégrer dans mon radio-réveil.

    Cela marche plutôt bien j'ai même compensé la sensibilité non linéaire de l'œil (qui est logarithmique) par une commande exponentielle.

    Je vous joins un tableau de 255 valeurs pour ceux que ca intéressent... Le résultat visuel est très bon...

    Code:
    const unsigned char table_rouge[]  = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,8,8,8,8,9,9,9,9,9,10,10,10,10,11,11,11,12,12,12,12,13,13,13,14,14,14,15,15,15,16,16,17,17,17,18,18,19,19,20,20,20,21,21,22,22,23,23,24,25,25,26,26,27,28,28,29,30,30,31,32,32,33,34,35,35,36,37,38,39,40,41,42,43,43,44,45,47,48,49,50,51,52,53,54,56,57,58,59,61,62,64,65,66,68,70,71,73,74,76,78,79,81,83,85,87,89,91,93,95,97,99,101,104,106,108,111,113,116,118,121,123,126,129,132,135,138,141,144,147,151,154,157,161,164,168,172,176,179,183,187,192,196,200,205,209,214,219,223,228,233,239,244,249,255};
    ... mais pas parfait ! Car l'évolution dans les premières valeurs 1 2 3...10 et+ font faire des sauts d'intensité (échelons) lumineuse assez importantes, (ca manque d'antialiasing!!).

    Ok, c'est la résolution de mon PWM qui est faiblard...

    J'ai donc augmenté mes paliers jusqu'à avoir 1000 paliers (et augmenté la fréquence du quartz de 4 à 20Mhz pour éviter les scintillements !!

    En pratique c'est encore nettement visible ! Pourtant j'ai un rapport cyclique de fous confirmés à l'oscilloscope:

    Puissance 1/1000: 13µS d'allumé pour 10ms.
    Puissance 2/1000: 25µS d'allumé pour 10ms.
    ...

    Y a t'il un moyen de corriger ce problème (modéré) sans pour autant utiliser un PIII @ 2Ghz ?

    Le pic attaque bêtement un FEET IRF44n qui attaque (tout aussi bêtement) 1 led en série avec une résistance.

    Merci pour votre aide !

    Matthieu

    -----


  2. #2
    mweber

    Re : Commande PWM led blanche : saut de luminosité

    Errata: j'utilise un 16F675

    Je vous joins le code... (Attention il compile, s'exécute et pilote bien 1 led, mais il n'est pas finalisé)

    Au fait, quel qu'un connait t'il l'évolution (même grossier) du spectre de couleurs d'un lever de soleil ?

    Je sais que les simulateurs d'aube du commerce sont tout bêtes et n'intègrent qu'une ampoule...

    La je fais la version de luxe

    Code:
    unsigned int niveau_rouge = 0;
    unsigned int niveau_vert  = 0;
    unsigned int niveau_bleu  = 0;
    unsigned int  cpt_timer0  = 0;
    unsigned int intensite    = 0;
    
    //const unsigned char table_bleu[]   = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,8,9,9,9,10,10,10,11,11,11,12,12,12,13,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,22,22,23,24,24,25,26,26,27,28,29,30,30,31,32,33,34,35,36,37,38,39,40,42,43,44,45,46,48,49,51,52,53,55,56,58,60,61,63,65,67,69,70,72,74,77,79,81,83,85,88,90,93,95,98,101,104,106,109,112,116,119,122,126,129,133,136,140,144,148,152,156,161,165,170,174,179,184,189,194,200,205,211,217,223,229,235,242,248,255};
    //const unsigned char table_vert[]   = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,5,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,11,11,11,11,12,12,12,13,13,14,14,14,15,15,16,16,16,17,17,18,18,19,19,20,20,21,21,22,23,23,24,24,25,26,26,27,28,29,29,30,31,32,33,33,34,35,36,37,38,39,40,41,42,43,44,45,47,48,49,50,52,53,54,56,57,58,60,61,63,65,66,68,70,72,73,75,77,79,81,83,85,87,90,92,94,97,99,102,104,107,110,112,115,118,121,124,127,131,134,137,141,144,148,152,155,159,163,167,172,176,180,185,190,194,199,204,209,215,220,226,231,237,243,249,255};
    ///const unsigned char table_rouge[]  = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,8,8,8,8,9,9,9,9,9,10,10,10,10,11,11,11,12,12,12,12,13,13,13,14,14,14,15,15,15,16,16,17,17,17,18,18,19,19,20,20,20,21,21,22,22,23,23,24,25,25,26,26,27,28,28,29,30,30,31,32,32,33,34,35,35,36,37,38,39,40,41,42,43,43,44,45,47,48,49,50,51,52,53,54,56,57,58,59,61,62,64,65,66,68,70,71,73,74,76,78,79,81,83,85,87,89,91,93,95,97,99,101,104,106,108,111,113,116,118,121,123,126,129,132,135,138,141,144,147,151,154,157,161,164,168,172,176,179,183,187,192,196,200,205,209,214,219,223,228,233,239,244,249,255};
    
    
    void main()
    {
    unsigned int compteur     = 0;
    
    GPIO   = 0x00; // Toutes les E/S sont mises à zéro
    CMCON  = 0x07; // Module comparateur désactivé
    ANSEL  = 0x00; // Toutes les E/S sont numériques (pas de CAN utilisé)
    TRISIO = 0x00; // Toutes les E/S sont configurées en sorties (sauf GP3 qui reste une entrée (conception du pic)
    
    T0CS_bit = 0;              // Source d'horloge interne pour piloter le Timer 0
    PSA_bit  = 0;              // Prescaler utilisé pour le Timer 0
    PS2_bit  = 1;
    PS1_bit  = 1;              // Prescalier de 1:256 pour le Timer 0
    PS0_bit  = 1;
    
    TMR0  = 0;               // valeur de départ du Timer 0
    INTCON = 0xA0;           // Interruption du timer 0 activées
    
    while(1)  // infinite loop
      {
      if (compteur == 0)
        {
        GP0_bit = 1;
        GP1_bit = 1;
        GP2_bit = 1;
        }
    
      if (compteur >= niveau_bleu)
        {
        GP0_bit = 0;
        }
    
       if (compteur >= niveau_vert)
        {
        GP1_bit = 0;
        }
        
        if (compteur >= niveau_rouge)
        {
        GP2_bit = 0;
        }
    
      asm clrwdt  // RAZ du watchdog
    
      compteur++;
      if (compteur >= 1000)  {compteur = 0;}
      }
    }
    
    ////////////////////////////////////////////////////////////////////////////////
    
    void interrupt()  // Durée 7 secondes à 4Mhz  (soit 29 minutes pour arriver à 100% de lumière)
    {
    if (T0IF_bit)
      {
      T0IF_bit   = 0;          // Aquitement de l'interruption du Timer 0
      TMR0       = 0;
      cpt_timer0++;
      if (cpt_timer0 > 100)   // 100   pour 29 minutes
        {
        cpt_timer0 = 0;
        niveau_rouge = /*table_rouge[*/intensite/*]*/;
        niveau_vert  = 1;//table_vert [intensite];
        niveau_bleu  = 1;//table_bleu [*/intensite/*]*/;
        if(intensite >= 990)
          {
          GP3_bit = 1;
    //      while(1);
          }
        else  intensite++;
        }
      }
    }
    Dernière modification par mweber ; 18/05/2010 à 09h13.

  3. #3
    HULK28

    Re : Commande PWM led blanche : saut de luminosité

    Bonjour,

    c'est quoi votre led RGB ?
    la référence ?

    C'est votre "fondu enchainé" qui doit poser problème pas le nombre de couleurs, 16 millions de couleurs possibles ça devrait aller.

    Et avec 4MHz en quartz ça suffira bien aussi.

    Votre Mos n'est pas un Mos prévu pour recevoir une commande 5V, si votre led est une led de puissance comme je suppose le mos sera mal commandé donc scintillement puisque la led sera mal alimentée (courant variable).

    Il faut fixer aussi la bonne fréquence sur les leds.

    10ms c'est 100Hz, la perception de scintillement est encore possible de plus pour une led alimentée à faible niveau lumineux c'est accentué, puisque l'oeil sera plus sensible dans cette plage, avec 200Hz (5ms) vous serez affranchi de ce phénomène si néanmoins vous prenez un Mos à commande 5V.
    La perception de contraste sera d'autant plus forte si vous partez de 0 (dans le noir complet), une intensité lumineuse passant de 70 à 72% est indétectable à l'oeil par contre passer de 0 à 0.1% dans ce noir complet est très perceptible.
    Faite l'essai vous verrez.
    Tout est bien qui finit.

  4. #4
    mweber

    Re : Commande PWM led blanche : saut de luminosité

    Citation Envoyé par HULK28 Voir le message
    Bonjour,

    c'est quoi votre led RGB ?
    la référence ?
    En fait pour l'instant je fais un test avec une LED de 10W blanche
    (Le phénomène est encore accentué vu la puissance du bestiau):

    http://cgi.ebay.com.hk/10W-White-Hig...item5887438d9f

    Au final j'utiliserais celle-ci (rvb)

    http://www.selectronic.fr/article.as...tier=10.1327-2

    Désolé je n'ai pas les datasheets...

    Citation Envoyé par HULK28 Voir le message
    C'est votre "fondu enchainé" qui doit poser problème pas le nombre de couleurs, 16 millions de couleurs possibles ça devrait aller.
    En fait c'est uniquement les faibles puissances qui sont problématiques, mais effectivement l'euil est sacrément sensible...


    Citation Envoyé par HULK28 Voir le message
    Votre Mos n'est pas un Mos prévu pour recevoir une commande 5V, si votre led est une led de puissance comme je suppose le mos sera mal commandé donc scintillement puisque la led sera mal alimentée (courant variable).
    Oui l'irz44nf est un peu limite, mais non, même constatations avec une petite led branchée directement en sortie du pic. C'est juste moins impressionnant car la puissance lumineuse est moindre....

    Citation Envoyé par HULK28 Voir le message
    Il faut fixer aussi la bonne fréquence sur les leds.

    10ms c'est 100Hz, la perception de scintillement est encore possible de plus pour une led alimentée à faible niveau lumineux c'est accentué, puisque l'oeil sera plus sensible dans cette plage, avec 200Hz (5ms) vous serez affranchi de ce phénomène si néanmoins vous prenez un Mos à commande 5V.
    Oui, en fait à 100Hz ca passe encore mais cela risque de fatiguer l'oeuil.

    Citation Envoyé par HULK28 Voir le message
    La perception de contraste sera d'autant plus forte si vous partez de 0 (dans le noir complet), une intensité lumineuse passant de 70 à 72% est indétectable à l'oeil par contre passer de 0 à 0.1% dans ce noir complet est très perceptible.
    Faite l'essai vous verrez.
    Oui d'où mes essais concluants avec une variation exponentielle de la puissance: l'impression d'augmentation de luminosité devient alors quasi linéaire.

    Donc pas vraiment de solutions.... J'imagine que les "pulsations" des leds power des portables Macintosh lorsqu'ils sont en veille ne descendent jamais trop bas pour ne pas rencontrer ce phénomène de "palier" ?

Sur le même thème :

Discussions similaires

  1. modifier la luminosité d'une LED
    Par Ryback08 dans le forum Électronique
    Réponses: 8
    Dernier message: 04/11/2014, 13h07
  2. Luminosité des LED, led haute luminosité.
    Par EventGame dans le forum Électronique
    Réponses: 8
    Dernier message: 11/08/2009, 08h10
  3. Led haute luminosité
    Par loulouoise dans le forum Électronique
    Réponses: 9
    Dernier message: 22/04/2009, 00h02
  4. Moteur DC : commande en PWM ou commande linéaire?
    Par maoussecostaud dans le forum Électronique
    Réponses: 8
    Dernier message: 03/03/2009, 11h01
  5. Variartion luminosité led
    Par xizor68420 dans le forum Électronique
    Réponses: 2
    Dernier message: 27/03/2008, 19h53