[Programmation] Le programme complet ne marche pas, par contre chaque partie marche
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Le programme complet ne marche pas, par contre chaque partie marche



  1. #1
    Slaivers

    Cool Le programme complet ne marche pas, par contre chaque partie marche


    ------

    Bonjour,
    Comme cité dans le titre, je suis mené à réaliser un programme sous Arduino qui permet le couplage automatique entre le réseau et un alternateur, donc il faut vérifier tout d'abord la tension, la fréquence et le déphasage, puis la synchronisation, mon programme permet de vérifier les trois premières conditions, mon problème, c'est quand je simule chaque partie indépendamment, ça marche à merveille, mais quand j'ai assemblé le tout, il m'affiche du n'importe quoi.. Le voilà mon programme :
    Code:
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(11,10,5,4,3,2);
    int tensiona=A0, tensionr=A1; // Noms des entrées analogiques A0 et A1
    int Signr=13, Signa=12; // Entrées du signal carré
    float Va,Vr; // Initialiser la valeur avec laquelle on va comparer
    int A,R; // Variables d'entrées
    unsigned long ta,tr;
    boolean a1=0,b1=0, a2=0,b2=0;
    unsigned long fA,fR,T,t,t1;
    char message[]="";
    void setup() {
      // put your setup code here, to run once:
    lcd.begin(16,2); // Initialiser LCD
    pinMode(tensiona,INPUT); // déclarer comme entrée
    pinMode(tensionr, INPUT);
    pinMode(Signr, INPUT);
    pinMode(Signa, INPUT);
    }
    
    void loop() {
    
    //lcd.clear();
    A=analogRead(tensiona); // A reçoit la valeur de l'entrée analogique
    while(A!=0) // Tant que le signal est non nul, on cherchera le max (l'amplitude du signal)
          {if(A > Va) 
                {Va = A;}
              A=analogRead(tensiona);
          }
    
    R=analogRead(tensionr);
    while(R!=0)
          {if(R > Vr) 
                {Vr = R;}
              R=analogRead(tensionr);
          }
    //if((Va*5)/1024==(Vr*5)/1024)
    //{lcd.setCursor(0,0);
    //lcd.print("YES");}
    //else {lcd.setCursor(0,0);
    //lcd.print("NO");}
    float SA=(float (Va)*5)/1024 ,SR=(float (Vr)*5)/1024; // On calcule les valeurs des entrées en Volt
    lcd.setCursor(11,0); // On affiche SA dans la première ligne, première colonne
    lcd.print(SA); 
    lcd.setCursor(11,1);
    lcd.print(SR);
    A=analogRead(tensiona);
    R=analogRead(tensionr);
    
    test0: {
      b1=a1;
      a1=digitalRead(Signa); // Lecture de la valeur de l'entrée 
    if (a1==!b1 && a1==1)
     {
      t=millis();
      goto test1;
      }
    else if(a1==b1) {goto test0;}
    }
    test1: {    a1=digitalRead(Signa);
                if(a1==b1) 
               {
                goto test2;}
                 else {goto test1;}
                 }
                 
    test2: {   a1=digitalRead(Signa);
               if(a1==!b1 && a1==1)
              {t1=millis();
              T=(t1-t);
              fA=1000/((T));
              sprintf(message,"fA=%d Hz",fA);
              lcd.begin(16,2); //utilisation d'un écran 16 colonnes et 2lignes
              lcd.print(message); //petit test pour vérifier quetout marche // On calcule la valeur de la fréquence
              //delay(500000);
               goto test0; 
                
               }
               else if(a1==b1)
               {goto test2;}
             }
              a1=digitalRead(Signa);
    phase0: {
       b1=a1;
       a1=digitalRead(Signa);
      if (a1==!b1 && a1==1)
      {ta= millis();}
       else if (a1==b1) 
       {goto phase0;}
       }
    phase1: 
    {b2=a2;
    a2=digitalRead(Signr);
      if (a2==!b2 && a2==1)
      {tr= millis();}
       else if (a2==b2) 
       {goto phase1;}
       }
       if(tr==ta)
       {lcd.setCursor(0,1);
       lcd.print("En phase");}
       else if (tr!=ta)  
       {lcd.setCursor(0,1);
       lcd.print("En deph");}
       
    
    }
    Si vous voyez d'où vient le problème, veuillez me le signaler.

    Merci et bonne journée

    -----

  2. #2
    jiherve

    Re : Le programme complet ne marche pas, par contre chaque partie marche

    Bonsoir,
    Au premier abord :Va et Vr ne sont pas reinitialises entre deux tours.
    JR
    l'électronique c'est pas du vaudou!

  3. #3
    Slaivers

    Re : Le programme complet ne marche pas, par contre chaque partie marche

    Comment? je n'ai pas compris ce que tu veux dire!!

  4. #4
    freepicbasic

    Re : Le programme complet ne marche pas, par contre chaque partie marche

    Il y a tellement de choses étranges dans ce code qu'on hésite à répondre.

    On ne fait pas du temps réel avec des lcd.begin et lcd.print c est tellement long
    que le résultat risque d'être du n'importe quoi, on met des leds on/off...

    L'indentation est des plus bizarre , il faut respecter l'écriture pour la lisibilité.
    Les test " if(a1==!b1 && a1==1)" sont perturbants, if( (b1==0) && (a1==1) ) est plus clair.
    Autant spécifier les parenthèses , dans le doute de préséances des fonctions logiques...

    La fonction analogRead met 100µs a lire !
    https://www.arduino.cc/en/Reference/AnalogRead
    Pour un signal secteur à 50hz on a une demi alternance sur 10ms.
    Ce qui donne une précision de 1/100 soit une variation +- sur du 220V de 200 à 240V
    Lorsque tu dis qu'il sont identique en fait c est vraiment approximatif...

    tu mesure quoi ?
    Une demi alternance ?
    Le schéma il est ou ?
    Les signaux se déclenche sur quoi?
    C'est le seuil du µC qui sert de bascule ?

    Ton test de phase est étrange, il est du copié collé de la mesure de fréquence.
    Pour verrouiller une phase il faut comparer les fronts montants et descendants des 2 signaux , ou le passage par 0,
    pas la période qui n'indique pas du tout la phase, au meilleur il indique une fréquence proche.



    Pourquoi mesurer une fréquence si on doit se verrouiller en phase ?
    C est juste indicatif...
    A+, pat

  5. A voir en vidéo sur Futura
  6. #5
    luc_1049

    Re : Le programme complet ne marche pas, par contre chaque partie marche

    Bonjour

    Cela manque de commentaires pour susciter des réponses.
    "donc il faut vérifier tout d'abord la tension, la fréquence et le déphasage, puis la synchronisation"
    => a quelles étapes précisément vérifiez vous ces 4 points et non 3 comme dans votre énoncé ?
    On ne sait pas si le 4ème point est une vérification ou une action consécutive. Nous n'avons pas la connaissance précise de votre programme !
    Vos conditions initiales ne sont sans doute pas les mêmes dans votre 3 ou 4 simulations, varibles globales, portabilité des points à revoir.

    cdlt

Discussions similaires

  1. [Blanc] Partie réfrigérateur Whirlpool ARC4030 ne marche plus.
    Par Stratonimbus dans le forum Dépannage
    Réponses: 4
    Dernier message: 01/07/2013, 14h46
  2. [Blanc] Partie réfrigérateur du combiné SAMSUNG RL33SBSW/XEF marche trop fort
    Par invite3ef09f61 dans le forum Dépannage
    Réponses: 3
    Dernier message: 07/01/2013, 21h44
  3. Réponses: 15
    Dernier message: 26/04/2012, 10h58
  4. [Blanc] partie congelateur combi Ariston ne marché pas
    Par loxul dans le forum Dépannage
    Réponses: 3
    Dernier message: 24/03/2009, 17h11
  5. Réponses: 5
    Dernier message: 11/08/2006, 21h29
Découvrez nos comparatifs produits sur l'informatique et les technologies.