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

Atténuer une LED pendant 3 secondes en C++ ?



  1. #1
    Yassir649

    Atténuer une LED pendant 3 secondes en C++ ?


    ------

    Bonjour, j'essaye de faire atténuer progressivement la luminosité d'une LED en utilisant le concept de la Modulation de largeur d'impulsion (Pulse-width modulation) pendant 3 secondes tout en maintenant une fréquence constante de 1KHz. Je sais faire l'atténuation et maintenir une fréquence de 1KHz, mais lorsque je dois là maintenir pendant 3 secondes, je suis bloqué. Mon code:
    Code:
    #define F_CPU 8000000 // processeur  ATMega324PA avec une fréquence de 8MHz
    #include <util/delay.h> // registre pour utiliser les fonctions de délais et ajustement automatiquement le délai en fonction du processeur
    #include <avr/io.h> 
    
    int main()
    {
      DDRC = 0xff; // PORT C est en mode sortie relié au LED
    
    unint8_t rouge = 999;
    unint8_t eteint = 1
    
    for (int i=0; i<1000; i++){
        for(int i=0; i<rouge; i++){
            PORTC =  0x02; // couleur rouge;
            _delay_us(1); // delay de 1 microseconde
        }
        for(int i=0; i<eteint; i++){
            PORTC =  0x00; // eteint;
            _delay_us(1); // delay de 1 microseconde
        }
        rouge--;
        eteint++;
    }
    
      return 0; 
    }
    Normalement ce code fait atténuer le LED à une fréquence constante de 1KHz, car si f = 1000Hz, alors T = 1/f => T = 1/100 => 1 ms donc 999(1us) + 1us = 1000 us = 1ms et ceci 1000 fois, donc pendant 1 seconde. Donc l'atténuation de la couleur rouge se fait pendant 1 seconde, mais si je veux le faire pendant 3 secondes, ça ne marche plus car :
    1 ms/3000 = 0.00033333333 ms = 0,333333 us donc normalement faudrait faire :

    Code:
    #define F_CPU 8000000 // processeur  ATMega324PA avec une fréquence de 8MHz
    #include <util/delay.h> // registre pour utiliser les fonctions de délais et ajustement automatiquement le délai en fonction du processeur
    #include <avr/io.h> 
    
    int main()
    {
      DDRC = 0xff; // PORT C est en mode sortie relié au LED
    
    unint8_t rouge = 2999;
    unint8_t eteint = 1
    
    for (int i=0; i<3000; i++){
        for(int i=0; i<rouge; i++){
            PORTC =  0x02; // couleur rouge;
            _delay_us(0,3); // delay de 1 microseconde
        }
        for(int i=0; i<eteint; i++){
            PORTC =  0x00; // eteint;
            _delay_us(0,3); // delay de 1 microseconde
        }
        rouge--;
        eteint++;
    }
    
      return 0; 
    }
    mais le problème c'est que le paramètre le plus petite que _delay_us peut prendre est 1 (_delay_us(1) et non _delay_us(0,3)).
    Donc, je suis complètement bloqué, comment faire pour pouvoir la faire atténuer pendant 3 secondes AVEC une fréquence de 1Khz.

    Merci d'avance

    -----

  2. Publicité
  3. #2
    CaptainDoc

    Re : Atténuer un LED pendant 3 secondes en C++

    Salut, tu ça ressemble à ce que je fais en arduino.
    Perso je fais une boucle while plutôt que for.

    while (i <3000) { PORTC = 0x02; i++; delay(1us)}
    Après celons la vitesse de ta boucle, peut être qu'il le fait mais trop rapidement et du coup tu le vois pas changer?

    Je sais pas si je t'ai vraiment aidé

  4. #3
    CaptainDoc

    Re : Atténuer un LED pendant 3 secondes en C++

    Je rajoute juste qu'il ne faut pas confondre fréquence du PWM et fréquence d'atténuation.
    Ton PWM module (hache) à une certaine fréquence. Si tu fais un delay(0.5s) tu vas avoir une fréquence de variation de 1Hz mais tjs un PWM à 1kHz

  5. #4
    indri

    Re : Atténuer un LED pendant 3 secondes en C++

    Pourquoi tu n'utilise pas un timer interne en pwm? Plutot qu'un code qui bloque tout le µc tout le temps!

    Là ton code allume la Led 1000*1µs donc 1ms et l'éteint 1µs. (Donc tu la vois pas s'éteindre)
    Et si tu change la variable 'eteint' la période augmente et donc la fréquence de ton pwm change
    Je vois nulle part où tu fais ta pause de 3s
    Là où va le vent...

  6. #5
    Ashura33

    Re : Atténuer un LED pendant 3 secondes en C++

    Bonjour eric141,

    Comme indri je te suggère d'utiliser un timer interne au microcontrôleur. Autre remarque, évite de déclarer trois variable avec le même nom, surtout dans deux boucle imbriquées, ça marche peut-être mais c'est une mauvaise habitude. Les variables rouge et eteint sont redondantes, étant donnée que eteint=3000-rouge, tu dois pouvoir te passer de l'une d'entre elle.
    Tu as essayé de laisser rouge=999 et la tempo à 1µs?

  7. A voir en vidéo sur Futura

Discussions similaires

  1. Moteur électrique fonctionnant pendant 5 secondes
    Par khalilo777 dans le forum Électronique
    Réponses: 9
    Dernier message: 04/07/2015, 23h31
  2. Allumer une led pendant x Secondes avec Arduino
    Par fomes dans le forum Électronique
    Réponses: 6
    Dernier message: 23/04/2013, 07h59
  3. [Blanc] Démarrage pendant 10 secondes compresseur congelateur
    Par Shake dans le forum Dépannage
    Réponses: 6
    Dernier message: 22/04/2008, 15h50
  4. paralysies muscles pendant qqls secondes
    Par Physz dans le forum Santé et médecine générale
    Réponses: 11
    Dernier message: 23/08/2006, 12h21
  5. 1000Hz pendant 5 secondes
    Par michel5002 dans le forum Électronique
    Réponses: 4
    Dernier message: 03/05/2005, 19h43
Découvrez nos comparatifs produits sur l'informatique et les technologies.