Go Down

Topic: Problème lecture entrée MCP3424 - librairie B@tto (Read 1 time) previous topic - next topic

Hexor

[Je remet le topic ici, ça évitera de polluer celui de B@tto, et il a surement plus ça place ici que dans "Réalisations et Projets Finis"]

Bonjour B@tto,

Tout d'abord merci pour cette librairie !

Je rencontre un petit soucis (qui vient surement de moi !)

J'utilise un MCP3424 + 4 jauges Fx1901 + ta librairie.
J'utilise donc ton exemple qui balaye les 4 entrée.
Tout marche bien pour la 1ere vague de lecture, par contre après toutes les valeur correspondent à la lecture de la 4ème entrée de la 1ere vague de lecture  :o
Et donc si je reset l'Arduino, la 1ere vague de lecture est bonne et après....

Code: [Select]
Channel 1 : 390 microVolt
Channel 2 : 125 microVolt
Channel 3 : -906 microVolt
Channel 4 : 7859 microVolt
Channel 1 : 7859 microVolt
Channel 2 : 7859 microVolt
Channel 3 : 7859 microVolt
Channel 4 : 7859 microVolt
Channel 1 : 7859 microVolt
Channel 2 : 7859 microVolt
Channel 3 : 7859 microVolt
Channel 4 : 7859 microVolt
Channel 1 : 7859 microVolt
Channel 2 : 7859 microVolt
Channel 3 : 7859 microVolt
Channel 4 : 7859 microVolt
...


Voici le code utilisé (le digitalWrite sert à activer l'alim du MCP3424):
Code: [Select]

/* MCP 3424 version 1.2 example sketch Multichannel
Written by B@tto
Contact : batto@hotmail.fr

In this example, the four channel are measured and results displayed by serail connection.
*/

#include <MCP3424.h>
#include <Wire.h>

MCP3424 MCP(0); // Declaration of MCP3424 pin addr1 et addr0 are connected to +5V

long Voltage[4]; // Array used to store results

void setup() {
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  delay(1000);
  Serial.begin(9600);  // start serial for output

}

void loop(){

  for(int i=1;i<=4;i++){

    MCP.Configuration(i,18,1,1); // MCP3424 is configured to channel i with 18 bits resolution, continous mode and gain defined to 8
    Voltage[i]=MCP.Measure(); // Measure is stocked in array Voltage, note that the library will wait for a completed conversion that takes around 200 ms@18bits
    Serial.print("Channel "); // print results
    Serial.print(i);
    Serial.print(" : "); 
    Serial.print(Voltage[i]);
    Serial.println(" microVolt");

  }
 
  delay(500);
}


Quelqu'un à une idée svp ?
Merci  :D

[EDIT]
Les pins d'adr du MCP3424 sont en floating, donc pour l'initialisation il faut bien MCP(0) et non MCP(6) comme dans l'exemple. ;)

icare

Bonjour,

Code: [Select]
MCP3424 MCP(0); // Declaration of MCP3424 pin addr1 et addr0 are connected to +5V

Dans l'exemple de la librairie de B@tto, il y a :

Code: [Select]
MCP3424 MCP(6); // Declaration of MCP3424 pin addr1 et addr0 are connected to +5V

As-tu modifié les pins d'adresses ?
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

Hexor

Oups pardon, j'ai oublié de préciser, en effet les deux pins d'adr sont en "floating", donc dans mon cas il s'agit bien de MCP(0);.


De plus la 1ere mesure fonctionne bien, car si j'applique une force sur une des jauges, la valeur retournée par l'arduino dans le serial est cohérente.
Par contre à la 2ème lecture... ça reprend la dernière valeur lue.


Artouste

#3
Apr 26, 2015, 04:00 pm Last Edit: Apr 26, 2015, 04:05 pm by Artouste
Oups pardon, j'ai oublié de préciser, en effet les deux pins d'adr sont en "floating", donc dans mon cas il s'agit bien de MCP(0);.


De plus la 1ere mesure fonctionne bien, car si j'applique une force sur une des jauges, la valeur retournée par l'arduino dans le serial est cohérente.
Par contre à la 2ème lecture... ça reprend la dernière valeur lue.


bonjour
en attendant "le" B@tto :smiley-mr-green:
ça se rapprocherait plus du comportement en oneshot plutot qu'en continuous

déjà , je testerais ça
Code: [Select]
delay(500);
NewConversion();



ensuite
ça donne quoi si tu change

Code: [Select]
MCP.Configuration(i,18,1,1);


par
Code: [Select]
MCP.Configuration(i,18,0,1);



B@tto

Outch en effet je suis passé à côté de ce post, week end très chargé xD

Un moment que j'ai pas tripatouiller ce sujet xD

Comme suggérer par Artouste, essaye différentes combinaisons en terme résolution et de gain. Lorsque j'utilise cette librairie cette toujours en 18 bit + PGA = 8 donc y'a peut-être un bug qui ne m'est pas arrivé mais présent sur ces autres config.

Autre chose : aller chercher du µV avec une alim depuis le microcontroleur c'est très moyen ... L'alimentation doit être parfaite. Même en soignant cette partie, perso je me mange des parasites lorsque mon PC portable commence à bosser dur pendant qu'il est en liaison USB avec ma carte, juste pour la com. En fait les parasites remonte par la masse ...
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Hexor

Salut,

J'ai tenté ça:

Code: [Select]
void loop(){

  for(int i=1;i<=4;i++){

    MCP.Configuration(i,18,1,1); // MCP3424 is configured to channel i with 18 bits resolution, continous mode and gain defined to 8
    Voltage[i]=MCP.Measure(); // Measure is stocked in array Voltage, note that the library will wait for a completed conversion that takes around 200 ms@18bits
    Serial.print("Channel "); // print results
    Serial.print(i);
    Serial.print(" : ");  
    Serial.print(Voltage[i]);
    Serial.println(" microVolt");

  }
  
  delay(500);
  MCP.NewConversion();
}



ainsi que

Code: [Select]
void loop() {

  for (int i = 1; i <= 4; i++) {

    MCP.Configuration(i, 18, 1, 1); // MCP3424 is configured to channel i with 18 bits resolution, continous mode and gain defined to 8
    MCP.NewConversion();
    Voltage[i] = MCP.Measure(); // Measure is stocked in array Voltage, note that the library will wait for a completed conversion that takes around 200 ms@18bits
    Serial.print("Channel "); // print results
    Serial.print(i);
    Serial.print(" : ");
    Serial.print(Voltage[i]);
    Serial.println(" microVolt");

  }

  delay(500);
}


Idem avec le mode oneshot, mais rien à faire.


@Batto:
Je viens de voir ton message pendant que je tapais celui ci.
concernant l'alim, pas d'inquiétude, elle ne vient pas du µC, en fait cette sortie commande une pin enable d'un régulateur.
J'ai en effet constaté ces soucis de parasite remontant par la masse via un oscilloscope, lorsque je suis branché avec un pc, c'est juste impressionnant !! (les parasites arrivaient quand je branchais le convertisseur USB - Série.)

Je vais tester en changeant les paramètres gain et résolution ;)
Merci.

Hexor

Bon et bien j'ai tenté résolution de 18 et gain à 8, mais idem...

On voit bien que la libraire fait la demande d'acquisition sur les 4 premières mesures, car il y a 100 ou 200mS (à vu d'œil) entre chaque affichage dans la liaison série puis pour les valeur suivantes tout le bloc de 4 valeurs s'affiche directement, sans latence particulière...

Je vais tester avec un 2eme MCP histoire d'être sur que ça ne soit pas l'origine du soucis.

B@tto

Hummm essaye un autre truc aussi :

L'entrée est multiplexée comme sur les Atmega, il n'est pas impossible, vu la différence de charge entre tes 4 entrée que tu vois une charge résiduelle et que comme le canal 4 semble être bien supérieur aux autres, tu "écrase" les autres lectures.

Donc essaye de faire plusieurs lectures sur un unique canal donné.
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Hexor

Bon et bien en attendant de trouver le réel soucis, j'ai une solution temporaire:

Remettre un "MCP3424 MCP(0);" avant chaque nouvelle vague de lecture, et là ça fonctionne sans soucis...
Est-ce que ça peut vous donner une idée d'où provient mon soucis ??


Code: [Select]
/* MCP 3424 version 1.2 example sketch Multichannel
Written by B@tto
Contact : batto@hotmail.fr

In this example, the four channel are measured and results displayed by serail connection.
*/

#include <MCP3424.h>
#include <Wire.h>

MCP3424 MCP(0); // Declaration of MCP3424 pin addr1 et addr0 are connected to +5V

long Voltage[4]; // Array used to store results

void setup() {
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  delay(1000);
  Serial.begin(9600);  // start serial for output

}

void loop(){
  MCP3424 MCP(0);
  for(int i=1;i<=4;i++){

    MCP.Configuration(i,18,1,1); // MCP3424 is configured to channel i with 18 bits resolution, continous mode and gain defined to 8
    Voltage[i]=MCP.Measure(); // Measure is stocked in array Voltage, note that the library will wait for a completed conversion that takes around 200 ms@18bits
    Serial.print("Channel "); // print results
    Serial.print(i);
    Serial.print(" : "); 
    Serial.print(Voltage[i]);
    Serial.println(" microVolt");

  }
 
  delay(500);
}

B@tto

Surement souci d'adresse alors. Est-ce que tu peux essayer en reliant les pin addr au VCC ou au GND ?

Il se peux qu'une perturbation perturbe les pins flottants.

Sinon as-tu fait le test que je te suggérais avant ?
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Hexor

Salut,

Je viens de tester en faisant la lecture d'une seule entrée, plusieurs fois: pas de soucis.
Code: [Select]
/* MCP 3424 version 1.2 example sketch OneShotConversion
Written by B@tto
Contact : batto@hotmail.fr

In this example, one conversion per second is performed on channel 1 and 16 bits resolution.
A new conversion has to be initiated by the user
*/


#include <Wire.h>
#include <MCP3424.h>

MCP3424 MCP(0); // Declaration of MCP3424

long Voltage;

void setup(){
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  delay(1000);
  Serial.begin(9600);  // start serial for output
  MCP.Configuration(1,18,0,1); // Channel 1, 18 bits resolution, one-shot mode, amplifier gain = 1

}

void loop(){

  MCP.NewConversion(); // New conversion is initiated
  
  Voltage=MCP.Measure(); // Measure, note that the library waits for a complete conversion
 
  Serial.print("Voltage = "); // print result
  Serial.print(Voltage);
  Serial.println(" microVolt");
  
  delay (1000);
  
}

(j'ai testé sur l'entrée 1 puis la 2, puis la 3: pas de soucis)


Je viens de tester en mettant les pin Adr0 et 1 au +Vcc, j'ai donc changé le MCP(0) en MCP(6): même comportement : 1er vague de lecture, OK, puis après j'ai tout le temps la derniere valeur lue qui s'affiche pour toutes les entrées.
Si je remet un MCP(6) avant chaque lecture: plus de soucis.

En espérant que ça puisse t'éclairer un peu...  :smiley-fat:

B@tto

Donc ça ressemble très fortement à ce que je t'avais dit plus haut :

Quote
L'entrée est multiplexée comme sur les Atmega, il n'est pas impossible, vu la différence de charge entre tes 4 entrées que tu vois une charge résiduelle et que comme le canal 4 semble être bien supérieur aux autres, tu "écrases" les autres lectures.

Donc essaye de faire plusieurs lectures sur un unique canal donné.
Tu dois avoir de grosses impédances d'entrée qui empêche la tension "de se vider" quand tu passes d'un canal à l'autre. Solution pour confirmer et éventuellement solutionner le problème d'une manière pas forcement pratique :

Code: [Select]
/* MCP 3424 version 1.2 example sketch Multichannel
Written by B@tto
Contact : batto@hotmail.fr

In this example, the four channel are measured and results displayed by serail connection.
*/

#include <MCP3424.h>
#include <Wire.h>

MCP3424 MCP(0); // Declaration of MCP3424 pin addr1 et addr0 are connected to +5V

long Voltage[4]; // Array used to store results

void setup() {
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  delay(1000);
  Serial.begin(9600);  // start serial for output

}

void loop(){

  for(int i=1;i<=4;i++){

    MCP.Configuration(i,18,1,1); // MCP3424 is configured to channel i with 18 bits resolution, continous mode and gain defined to 8
   

for(int y=0; y<5;y++) Voltage[i]=MCP.Measure();

    Serial.print("Channel "); // print results
    Serial.print(i);
    Serial.print(" : "); 
    Serial.print(Voltage[i]);
    Serial.println(" microVolt");

  }
 
  delay(500);
}
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

B@tto

J'ai été contacté par mail par un anglais qui a relevé un problème dans mon code exemple : la taille de mon tableau et les paramètres de la boucle for ne sont pas cohérent.

long voltage[4]

...

for (int i=1;i<=4;i++) ==> problème, voltage[4] est hors index ...

Corrigé :

https://github.com/battosai30/MCP3424/blob/master/Examples/MCP3424_Multichannel/MCP3424_Multichannel.ino
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Hexor

Oups, je viens juste de voir ta réponse à l'instant ...
En effet, ça marche beaucoup mieux comme ça =D merci !!

Go Up