Go Down

Topic: [Conseil] Projet sur Arduino Due, multimètre spécial (Read 2263 times) previous topic - next topic

kamill

... mais quand je met plus de 60 acquisition, le programme plante.... (d'ou l'affichage de la valeur de "i" pour savoir cela), vous avez une idée d'où cela peut provenir ?
Bonjour,

Oui de là
Code: [Select]
int Table_A0[50]
Tu écris en dehors de la table.

Depuis le début on te dit de virer des tables qui ne servent à rien.

alex34000

j'ai enlever le paramètre de taille de mes tables, et j'ai appliqué le programme qui fonctionne à tous les pin,  mais la nouveau soucis, il fais des mauvais relèves ou mauvaises moyenne, je ne sais pas, puis il affiche dans le désordre et n'importe comment les pin....

Programme source :
Code: [Select]
/****************************************************
  *****************************************************
       !! TOLERANCE A INDIQUER MANUELLEMENT !!
  *****************************************************
  *****************************************************/
   
    float Tol_Min = 0.1 ;    float Tol_Max = 0.1;                    // Tolérances à modifier manuellement
   
    float TA0 = 0, TA1 = 0, TA2 = 0, TA3 = 0,
          TA4 = 0, TA5 = 0, TA6 = 0, TA7 = 0,
          TA8 = 0, TA9 = 0, TA10 = 0, TA11 = 0 ;                   // Variable sans la tolérance à tester
         
    int val_i = 4  ;         
         
    float Tol_A0 =2.7,   Tol_A1 =2.7,   Tol_A2 =2.7,   Tol_A3 =2.7,
          Tol_A4 =2.7,   Tol_A5 =2.7,   Tol_A6 =2.7,   Tol_A7 = 2.7,
          Tol_A8 =2.7,   Tol_A9 =2.7,   Tol_A10 =2.7,  Tol_A11 =2.7 ;     // Variable fixe qui sert de base pour la tolérance.
  /*****************************************************
      Déclaration des Pins d'entrées analogiques
  ******************************************************/ 

  const int AI_A0 = A0, AI_A1 = A1, AI_A2 = A2, AI_A3 = A3,       // PIN d'entrées analogiques sur les quels
            AI_A4 = A4, AI_A5 = A5, AI_A6 = A6, AI_A7 = A7,       // sont reliés des composants
            AI_A8 = A8, AI_A9 = A9, AI_A10 = A10, AI_A11 = A11;                             
 
  /****************************************************
     Déclaration des Variables des data d'entrées
  *****************************************************/ 

  int sensorValue_A0 = 0, sensorValue_A1 = 0, sensorValue_A2 = 0,     //Déclaration des variables en INT
      sensorValue_A3 = 0, sensorValue_A4 = 0, sensorValue_A5 = 0,
      sensorValue_A6 = 0, sensorValue_A7 = 0, sensorValue_A8 = 0,
      sensorValue_A9 = 0, sensorValue_A10 = 0, sensorValue_A11 = 0;

  /****************************************************
  Déclaration des Variables pour la moyenne
  *****************************************************/
  int Table_A0[]={}, Table_A1[]={}, Table_A2[]={}, Table_A3[]={},
      Table_A4[]={}, Table_A5[]={}, Table_A6[]={}, Table_A7[]={},
      Table_A8[]={}, Table_A9[]={}, Table_A10[]={}, Table_A11[]={},
      i = 0;
                             
  /****************************************************
  Déclaration des Variables flottantes pour mesures
  *****************************************************/

  float V_A0 = 0, V_A1 = 0, V_A2 = 0, V_A3 = 0,         // Déclaration des variables en flotantes pour les port :
        V_A4 = 0, V_A5 = 0, V_A6 = 0, V_A7 = 0,         // A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11
        V_A8 = 0, V_A9 = 0, V_A10 = 0, V_A11 = 0;   
   
  float Vmoy_Table_A0 = 0, Vmoy_Table_A1 = 0, Vmoy_Table_A2 = 0, Vmoy_Table_A3 = 0,
        Vmoy_Table_A4 = 0, Vmoy_Table_A5 = 0, Vmoy_Table_A6 = 0, Vmoy_Table_A7 = 0,
        Vmoy_Table_A8 = 0, Vmoy_Table_A9 = 0, Vmoy_Table_A10 = 0, Vmoy_Table_A11 = 0;     
                                     
  /***********************************************
  ************************************************
          SETUP DU PROGRAMME
  ************************************************
  ************************************************/ 
  void setup()
  {
    Serial.begin(19200);                               // Initialise la comunication série à 9600 Bauds
    analogReadResolution(12);                         //règle la résolution sur 12 bits
    pinMode (53, OUTPUT);
    pinMode (52, OUTPUT);    // Initialise la comunication série à 9600 Bauds
  }
 
  /***********************************************
  ************************************************
          DEBUT DU PROGRAMME
  ************************************************
  ************************************************/
 
  void loop() {

     
  // *****************************************
  //      Port A0
  //******************************************
     

    if(i<val_i)
    { 
      sensorValue_A0 = analogRead(AI_A0);                //Lis les valeurs analogiques du port AO et donne ces valeurs à sensorValue 
      V_A0 = sensorValue_A0;                             //Incrémente sensorValue dans la variale V_A0
      TA0 = V_A0*(3.3/4096);
      Table_A0[i]=sensorValue_A0;
      Vmoy_Table_A0 = Vmoy_Table_A0 + Table_A0[i];
      i++;
    }
    else
    {
       V_A0=((Vmoy_Table_A0)/(i+1));
       affiche_port_A0();
       i=0;
       Vmoy_Table_A0 = 0;
    }
 
    delay(1);                                          //Attente de 2MS pour laisser le temps de convertir et de traiter les datas
  }
 
 
 
  void affiche_port_A0()
  {
      Serial.print("A0_HEXA = " );                       //affiche "A0_HEXA="
    Serial.print(sensorValue_A0,HEX);                  //Affiche la valeur actuel du potentiomètre (sur une résolution de 12 bits)
    Serial.print("\t\t A0_3.3V = ");                   //Affiche "VA0_3.3V ="
    Serial.print(V_A0*(3.3145/4096),4);                   //Affiche la valeur de V_A0 en 3.3V (le nb après la "," augmente la précision).
    Serial.print("\t A0_6V = ");                       //Affiche "VA0_6V = "
    Serial.print(V_A0*(6.0/4096),4);                   //Affiche la valeur de V_A0 en 6V (le nb après la "," augmente la précision).
    Serial.print("\t\t A0_6V_Corr = ");                //Affiche "A0_6V_corr = "
    Serial.print(((V_A0*(6.0/4096))+0.1),4);         //Affiche la valeur de V_A0 en 6V + une correction. (le nb après la "," augmente la précision).
    if(TA0 > Tol_A0 + Tol_Max || TA0 < Tol_A0 - Tol_Min )
    {  Serial.println("\t N_OK "); }
    else
    { Serial.println("\t OK ");}
  }
 



quand le programme est sur un pin comme ci dessus, ça fonctionne très bien pourtant.. (dans un soucis de taille car je dépasse les 9000 charactère par poste j'ai mit un seul pin et un seul sous programme d'affichage mais ils sont tous les mêmes avec juste A1 au lieu de 10, etc.)

kamill

C'est encore pire. Les tables ont une taille 0

VIRES MOI TOUTES CES TABLES!!!!!!!

dfgh

hello
as tu chargé et testé le prg que je t'avais posté?

alex34000

C'est encore pire. Les tables ont une taille 0

VIRES MOI TOUTES CES TABLES!!!!!!!
Mais je les remplacerais par quoi les tables si je les vire ? je veux bien les virer hein, mais je vois pas par quoi je peut les remplacer...

hello
as tu chargé et testé le prg que je t'avais posté?
Oui et il ne fonctionnait pas, il ne m'affichais rien, j'ai oublier de te le dire dsl ^^'

kamill

Tu les supprimes simplement. Le programme de dfgh fonctionne très bien sans les tables.

dfgh

le code que je t'ai préparé fonctionne correctement.

il faut mettre le moniteur en 57600 bauds ( en bas de la fenêtre "moniteur")

alex34000

#37
Jun 16, 2016, 10:30 am Last Edit: Jun 16, 2016, 10:54 am by alex34000
Il ne marchait pas car je n'avais pas saisis la bonne vitesse de transmission, my bad.

Cependant, quand je compare les mesures qu'il me fais avec celle mesurés en temps réel à l'aide de mon FLUKE 175, j'ai 1 volt d'écart (1.73 pour la carte contre 2.73 sur le multimètre).

Sinon je vais essayer de mettre en forme mon programme pour qu'il n'y ai pas de tableau en prenant exemple sur le tien. Merci dfgh pour ton programme ^^'

EDIT :

Le fais que la mesure ne soit pas bonne, ça ne serais pas du à ça : 
Code: [Select]
    }
  sum_average = sum_average/nb_mesures;
  Serial.print("moyenne sur entree ");
  Serial.print(entree);
  affiche();
  if (entree==(nb_entrees-1)){while(1);}
}


le sum_average=sum_average/nb mesures ne devrais pas être en esle ? après le if ? car si je comprend bien après chaque aquisition il fais la moyenne du coup il fais "trop" de divisions ce qui fais qu'on a un volt de moins ? enfin c'est ce que je comprend de cette partie ^^'

68tjs

Si je peux me permettre d'ajouter mon grain de sel : pendant la mise au point je ferais le stict minimum et je réserverai la cosmétique pour la fin quand l'essentiel fonctionnera.

Exemple pourquoi tu t'embête avec le moyennage, naturellement la mesure n'est pas à 2 V près mais à quelques mV.



dfgh

oui, il faut modifier

 for (f =1;f<=nb_mesures;f++)

et

sum_average = sum_average/nb_mesures;

mais comme le dit 68 toujours, le but de ce code était de te montrer l'usage des boucles, elles t'évitent 12 fois ton 1er code et les tableau. pour le reste, c'est plutôt à toi de prendre les manettes

alex34000

#40
Jun 16, 2016, 01:44 pm Last Edit: Jun 17, 2016, 08:30 am by alex34000
Si je peux me permettre d'ajouter mon grain de sel : pendant la mise au point je ferais le stict minimum et je réserverai la cosmétique pour la fin quand l'essentiel fonctionnera.

Exemple pourquoi tu t'embête avec le moyennage, naturellement la mesure n'est pas à 2 V près mais à quelques mV.



C'est sur mais mon programme qui fais 12 boucles "bourrin" fonctionne (j'ai juste un problème avec l'envoie, je doit probablement OU aller trop vite, OU aller trop lentement.. quoi qu'il en soit je doit regarder dans la datasheet de l'uC au niveau des sample du convertisseur pour savoir combien de mesure max je peut faire par secondes).
Bon je vais retourner à mon problème et essayer de réparer cela.. plus que 2 semaines pour terminer ce projet :/

EDIT : Voici mon programme que j'ai simplifier dans sa mise en forme. Il est fonctionnel. Je vais me faire tuer par Kamill car j'ai pas encore enlever les tableau mais je le ferais quand tout sera fini et fonctionnel. J'ai enlever une grosse partie pour que ça rentre car sinon je dépasse les 9000 caractères ^^'.

Dernière étape : gérer le contrôle des ports numériques par interruption et non plus par test dans la boucle ! au boulot :)


Code: [Select]

  /****************************************************
  *****************************************************
       !! TOLERANCE A INDIQUER MANUELLEMENT !!
  *****************************************************
  *****************************************************/
   
    float Tol_Min = 0.1 ;    float Tol_Max = 0.1;                    // Tolérances à modifier manuellement
   
    float TA0 = 0, TA1 = 0, TA2 = 0, TA3 = 0,
            ;                   // Variable sans la tolérance à tester
         
    int val_i = 4  ;         
         
    float Tol_A0 =2.7,   Tol_A1 =2.7,   Tol_A2 =2.7,   Tol_A3 =2.7,
          ;     // Variable fixe qui sert de base pour la tolérance.
  /*****************************************************
      Déclaration des Pins d'entrées analogiques
  ******************************************************/ 

  const int AI_A0 = A0, AI_A1 = A1, AI_A2 = A2, AI_A3 = A3,       // PIN d'entrées analogiques sur les quels
          ;
 
  /****************************************************
     Déclaration des Variables des data d'entrées
  *****************************************************/ 

  int sensorValue_A0 = 0, sensorValue_A1 = 0, sensorValue_A2 = 0,     //Déclaration des variables en INT
      sensorValue_A3 = 0;

  /****************************************************
  Déclaration des Variables pour la moyenne
  *****************************************************/
  int Table_A0[12]={}, Table_A1[12]={}, Table_A2[12]={}, Table_A3[12]={}, 
      i = 0;
                             
  /****************************************************
  Déclaration des Variables flottantes pour mesures
  *****************************************************/

  float V_A0 = 0, V_A1 = 0, V_A2 = 0, V_A3 = ;         // Déclaration des variables en flotantes pour les port :
              // A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11 
   
  float Vmoy_Table_A0 = 0, Vmoy_Table_A1 = 0, Vmoy_Table_A2 = 0, Vmoy_Table_A3 = 0,
           
                                     
  /***********************************************
  ************************************************
          SETUP DU PROGRAMME
  ************************************************
  ************************************************/ 
  void setup()
  {
    Serial.begin(19200);                               // Initialise la comunication série à 9600 Bauds
    analogReadResolution(12);                         //règle la résolution sur 12 bits
    pinMode (53, OUTPUT);
    pinMode (52, OUTPUT);    // Initialise la comunication série à 9600 Bauds
  }
 
  /***********************************************
  ************************************************
          DEBUT DU PROGRAMME
  ************************************************
  ************************************************/
 
  void loop() {

     
  // *****************************************
  //      Port A0
  //******************************************
     

    if(i<val_i)
    { 
      digitalWrite (53, HIGH);
      sensorValue_A0 = analogRead(AI_A0);                //Lis les valeurs analogiques du port AO et donne ces valeurs à sensorValue 
      sensorValue_A1 = analogRead(AI_A1);
      sensorValue_A2 = analogRead(AI_A2);     
      sensorValue_A3 = analogRead(AI_A3);
     

     
      V_A0 = sensorValue_A0;                             //Incrémente sensorValue dans la variale V_A0
      V_A1 = sensorValue_A1;
      V_A2 = sensorValue_A2;
      V_A3 = sensorValue_A3;
       
     
      TA0 = V_A0*(3.234/4096);
      TA1 = V_A1*(3.3/4096);     
      TA2 = V_A2*(3.3/4096);
      TA3 = V_A3*(3.3/4096);


      Table_A0[i]=sensorValue_A0;
      Table_A1[i]=sensorValue_A1;
      Table_A2[i]=sensorValue_A2;
      Table_A3[i]=sensorValue_A3;
   
     
      Vmoy_Table_A0 = Vmoy_Table_A0 + Table_A0[i];
      Vmoy_Table_A1 = Vmoy_Table_A1 + Table_A1[i];
      Vmoy_Table_A2 = Vmoy_Table_A2 + Table_A2[i];
      Vmoy_Table_A3 = Vmoy_Table_A3 + Table_A3[i];
       
      i++;
 //     delay(2);
      digitalWrite (53, LOW);
    }
    else
    {
       V_A0=((Vmoy_Table_A0)/(i));
       V_A1=((Vmoy_Table_A1)/(i));
       V_A2=((Vmoy_Table_A2)/(i));
       V_A3=((Vmoy_Table_A3)/(i));
         
       
       affiche_port_A0();
       affiche_port_A1();
       affiche_port_A2();
       affiche_port_A3();
     
       
       i=0;
       
       Vmoy_Table_A0 = 0;
       Vmoy_Table_A1 = 0;
       Vmoy_Table_A2 = 0;
       Vmoy_Table_A3 = 0;
         
    }
    delay(1);                                          //Attente de 2MS pour laisser le temps de convertir et de traiter les datas
   
      if (Serial.available())
  {
    String str=Serial.readString();
    Serial.println(str);
    if (str=="setdo1")
    {
      digitalWrite(52, HIGH);
    }
    if (str=="setdo0")
    {
      digitalWrite(52, LOW);
    }
  }
  else{}
  }
 
 
 
  void affiche_port_A0()
  {
      Serial.print("A0_HEXA = " );                       //affiche "A0_HEXA="
    Serial.print(sensorValue_A0,HEX);                  //Affiche la valeur actuel du potentiomètre (sur une résolution de 12 bits)
    Serial.print("\t\t A0_3.3V = ");                   //Affiche "VA0_3.3V ="
    Serial.print(V_A0*(3.234/4096),4);                   //Affiche la valeur de V_A0 en 3.3V (le nb après la "," augmente la précision).
    Serial.print("\t A0_6V = ");                       //Affiche "VA0_6V = "
    Serial.print(V_A0*(6.0/4096),4);                   //Affiche la valeur de V_A0 en 6V (le nb après la "," augmente la précision).
    Serial.print("\t\t A0_6V_Corr = ");                //Affiche "A0_6V_corr = "
    Serial.print(((V_A0*(6.0/4096))+0.1),4);         //Affiche la valeur de V_A0 en 6V + une correction. (le nb après la "," augmente la précision).
    if(TA0 > Tol_A0 + Tol_Max || TA0 < Tol_A0 - Tol_Min )
    {  Serial.println("\t N_OK "); }
    else
    { Serial.println("\t OK ");}
 

Go Up