Multiplexeur analogique ADG406BNZ et Arduino : problème de contrôle des broches

Bonjour,

Je crée ce sujet après quelques recherches, puisqu'il m'est impossible de trouver une solution à mon problème. Alors voilà, j'utilise le multiplexeur ADG406BNZ (datasheet consultable ici:https://www.mouser.fr/ProductDetail/Analog-Devices/ADG406BNZ?qs=BpaRKvA4VqER4ToTF2Rawg%3D%3D) pour rediriger les différents pins d'une carte SD vers un circuit analogique qui trace sa caractéristique courant-tension, puis passe au pin suivant. J'ai connecté le multiplexeur à l'arduino et l'alim +/-9V comme suit:


Les 4 broches de contrôle de la sortie sont donc connectées aux pins "digital" de ma Arduino Due. Le EN pour "Enable" est connecté également au pin digital 24. J'ai ensuite écrit ce code dans l'environnement Arduino IDE afin de procéder à la sélection du pin voulu:

const int pinA0 = 30;
const int pinA1 = 31;
const int pinA2 = 32;
const int pinA3 = 33;
const int pinEnable = 24;
// ... le reste de mes déclarations
void setup() {
  Serial.begin(9600);
  delay(500);
  // Configuration des broches en sortie
  pinMode(pinA0, OUTPUT);
  pinMode(pinA1, OUTPUT);
  pinMode(pinA2, OUTPUT);
  pinMode(pinA3, OUTPUT);
  pinMode(pinEnable, OUTPUT);

  // Activer le multiplexeur en mettant la broche EN à HIGH
  digitalWrite(pinEnable, HIGH);
}
// Fonction pour sélectionner la voie du multiplexeur
void selectChannel(int channel) {
  switch (channel) {
    case 1:
      digitalWrite(pinA0, LOW);
      digitalWrite(pinA1, LOW);
      digitalWrite(pinA2, LOW);
      digitalWrite(pinA3, LOW);
      break;
    case 2:
      digitalWrite(pinA0, HIGH);
      digitalWrite(pinA1, LOW);
      digitalWrite(pinA2, LOW);
      digitalWrite(pinA3, LOW);
      break;
    case 3:
      digitalWrite(pinA0, LOW);
      digitalWrite(pinA1, HIGH);
      digitalWrite(pinA2, LOW);
      digitalWrite(pinA3, LOW);
      break;
    case 4:
      digitalWrite(pinA0, HIGH);
      digitalWrite(pinA1, HIGH);
      digitalWrite(pinA2, LOW);
      digitalWrite(pinA3, LOW);
      break;
    case 5:
      digitalWrite(pinA0, LOW);
      digitalWrite(pinA1, LOW);
      digitalWrite(pinA2, HIGH);
      digitalWrite(pinA3, LOW);
      break;
    case 6:
      digitalWrite(pinA0, HIGH);
      digitalWrite(pinA1, LOW);
      digitalWrite(pinA2, HIGH);
      digitalWrite(pinA3, LOW);
      break;
    case 7:
      digitalWrite(pinA0, LOW);
      digitalWrite(pinA1, HIGH);
      digitalWrite(pinA2, HIGH);
      digitalWrite(pinA3, LOW);
      break;
    case 8:
      digitalWrite(pinA0, HIGH);
      digitalWrite(pinA1, HIGH);
      digitalWrite(pinA2, HIGH);
      digitalWrite(pinA3, LOW);
      break;
    // case 4, case 5, case 6, case 7, case 8, etc.
    default:
      // Par défaut, on met toutes les broches à LOW si un canal invalide est donné, je met ça puisqu'on m'a toujours appris à traiter le default case mais je ne vois pas l'intérêt ici puisque j'appelle ensuite "manuellement" la fonction pin par pin dans mon loop
      digitalWrite(pinA0, LOW);
      digitalWrite(pinA1, LOW);
      digitalWrite(pinA2, LOW);
      digitalWrite(pinA3, LOW);
      break;
  }
}
void loop() {
    selectChannel(1);
   // reste de mon code pour tracer la caractéristique
   selectChannel(2);
   // même code pour tracer la seconde caractéristique
  // et ainsi de suite...
}

J'ai voulu d'abord tester avec 2 pins. J'ai l'impression que la caractéristique courant tension du premier pin est la bonne, mais lors du tracé de la deuxième, j'ai la même caractéristique. Je reste donc constamment sur le même pin. Je pense donc que mes pins A0,A1,A2, et A3 restent en "LOW" sans jamais changer d'état vers "HIGH".

Quelqu'un aurait une idée de comment fixer ça ?

Merci d'avance!

Il vaudrai mieux mettre le code complet, le problème est peut être dedans.

Bonjour rayou23

En faisant ça, tu désactives ton convertisseur vu que:
image
EN est actif à LOW

Cordialement
jpbbricole

Je ne pense pas.
Extrait de la datasheet :
image
Puisqu'il fait :

Le multiplexeur analogique est bien activé pour moi.

Oui j'ai une idée.
Tu abandonne provisoirement ton système de mesure et tu te concentre uniquement sur ton problème.

Il n'y a pas de raison que cela ne fonctionne pas => tu dois avoir fait une erreur.
Pour la trouver le plus simple est, soit de tout décâbler, soit si tu as des composants disponibles de monter une manip de débogage avec uniquement un micro et le mux.

Inutile de faire une usine a gaz => programme minimal.
Tu mesure la sortie au voltmètre et pour chaque voie sélectionnée avec un simple fil tu appliques soit un Vcc, soit un 0 V sur l'entrée de la voie.

Une fois que tu aura bien contrôlé que cela fonctionne (erreur de câblage ou mauvaise commande logicielle) tu appliques à ton montage complet.
Et tout devrais fonctionner sauf si l'erreur est ailleurs.
Mais au moins tu sera sûr de cette partie.

La méthode des petits pas semble être lente, on se rend vite compte que c'est la plus rapide.

Bonjour 68tjs

Autant pour moi, je me suis fié au schéma fourni :woozy_face:

Cordialement
jpbbricole

C'est toujours le même problème avec ces signaux qui sont prévus pour être raccordé à une "RAZ automatique" => réseau RC.
Sauf que là ce n'est pas une RAZ (remise à zéro ou reset) mais un Enable ou autorisation de fonctionner, le symbole choisie (la barre au dessus du nom) est mal choisi et incite à l'erreur.

On veut tout faire avec un micro mais un simple réseau RC permet d'imposer un 0 V pendant un temps bref pour bloquer le CI le temps que toutes les alimentations soit établies.

Alors désolé du délai mais me revoilà.
Effectivement désolé jpbbricole mon schéma portait à confusion.

Après vérification avec un multimètre, j'ai bien mon pin A0 qui passe en HIGH pendant l'exécution du programme. J'ai même tout cablé (les 8 pins) et lancé et le A0 alterne bien entre "HIGH" et "LOW". Le problème est donc ailleurs que dans la commande envoyée.
Avec les 8 pins, c'est encore plus bizarre. Je m'attendais à ces courbes plus ou moins comme celles ci-dessous :


(avec dans l'ordre : DT3 CMD Vss Vcc CLK Vss2 DT0 DT1 DT2
Et finalement j'obtiens celles-ci :

ou encore celles-ci

Entre deux exécutions, leurs formes changent mais j'ai toujours l'impression que les tracés DT3, CMD, Vcc, DT0, DT1, DT2 proviennent du même pin! Je me dis qu'il serait possible que toutes les broches soient pareilles dans leur électronique interne (ce que l'on voit, c'est des protections en tensions négatives et ESD faites avec des diodes, d'où l'allure de ces courbes) mais puisque j'ai les courbes témoins qui sont censées être les bonnes (celles-ci sont faites avec un autre outil supposément fiable, sur la même carte SD).

68tjs je vais faire les manips suggérées avec un circuit ultra simple. J'espère me rendre compte d'une erreur que j'aurais faite. En tout cas merci pour l'aide et les conseils!

Tes courbes ont une allure proche.

  • J'ai l'impression que tu as permuté Vcc et CLK.
  • des erreurs de mesures pourraient expliquer certaines anomalies
  • es-tu certain de mesurer dans les mêmes conditions que l'appareil témoin?
    J'ai un doute. Avec ton appareil témoin sur les alimentations on voit le courant augmenter et pas la tension ce qui n'est pas le cas avec ton montage.
    Tu pourrais mettre un schéma de ton montage?

Quand tu dis une allure proche, tu veux dire entre elles ou par rapport aux courbes témoins ? Et comment expliquer la variation entre la première fois qu'on exécute le programme (Figure_1) et la deuxième (Figure_2) ?
Qu'est-ce qui te fait soupçonner cette permutation ? Je ne vois pas
Avec l'appareil témoin, la tension de commande varie de -2 à 4.2V, avec un tout autre système (cartes NI-DAQ, pas d'Arduino, montages additionneurs amplis op différents etc...). Mais, sauf si j'ai raté un truc, cela ne devrait rien changer puisque le but c'est justement d'avoir les caractéristiques courant-tension de chaque pin, qui justement comme son nom l'indique, sont caractéristiques de ces pins. Non ? Ensuite, je ne comprend pas comment l'appareil témoin fait pour mesurer la caractéristique courant tension d'un pin "Vss" (donc relié au GND) puisque cela donnerait une droite parfaite...
Avec mon système, la tension de commande varie entre -3.3 et 3.3V sauf qu'en réalité évidemment lors du tracé des caractéristiques on voit bien que par exemple on atteint jamais -3.3V (à cause justement de l'électronique interne avec la diode de protection).

Voici un schéma assez complet du montage que j'ai fais sur KiCad :

L'entrée CLK devrait se comporter comme les autres IOs alors que Vcc doit croître avec un courant faible au départ et qui augmente brutalement lorsque la carte démarre.


Il ne faut pas oublier que le multiplexeur introduit une erreur dans la mesure, sa résistance est loin d'être nulle, environ 20% de la valeur de ta résistance de mesure du courant, ce qui introduit une erreur appréciable dans la mesure de la tension.

Tu mesures un court-circuit dont le courant n'est limité que par la résistance de mesure et la résistance parasite introduite par le multiplexeur, et tu mesures la tension aux bornes de la résistance parasite introduite par le multiplexeur. Donc tu dois obtenir une diagonale (la mesure aux bornes d'une résistance)


Tes amplis sont inverseurs, tu en tiens compte dans ton affichage.

Ton LM258 est limité

  • sur les entrées à V+ - 1,5V
  • sur la sortie à V+ - 1,5V et V- - 1V

J'aurais par ailleurs une autre question si des personnes passent encore par là:
Je souhaite connecter les pins de ma carte SD à ce multiplexeur analogique pour tracer pin à pin les caractéristiques courant-tension. Cependant, j'ai également un programme qui permet de tester les éventuels courts-circuits entre les pins en envoyant un HIGH sur un pin et en lisant les autres pins (un low signifierait une absence de court-circuit, un HIGH signifierait un court-circuit). Cette fois-ci, les pins de la carte sd sont donc connectés uns à uns aux pins digitaux de mon Arduino.
J'aimerais que ces deux applications puissent se faire sur le même circuit. Mais j'ai une préoccupation : de ma connaissance de l'Arduino, les pins digitaux sont constamment en HIGH ou en LOW, et vont donc "commander" le courant et la tension entre 0 et 3.3V dans tous mes pins, même pendant le tracé de mes caractéristiques : cela les rendrait donc complètement fausses. N'y a-t-il pas un moyen de les "désactiver complètement" (i.e ces pins digitaux) une fois les tests courts-circuits effectués, avant de passer aux caractéristiques courant-tension ?

Y a-t-il une erreur dans mon raisonnement ou sera-t-il vraiment difficile d'incorporer les deux projets sur le même circuit et sur la même arduino (le but final étant de créer un shield pour la arduino qui contient le slot carte sd et le circuit).

tu peut essayer sa pour les pins digitaux

void setup(){
digitalWrite(0, LOW);
digitalWrite(1, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);




}


void loop(){

Oui et non.

  • Non, parce que les pins peuvent être mises en entrée et dans ce mode elles n'imposent plus de niveau. Elles sont flottantes.
  • Oui, parce qu'elles vont néanmoins être en parallèles avec les entrées de la carte SD et donc perturber quand même la mesure analogique (les IOs de la DUE ont aussi des diodes de clamps sur les entrées).

Il y a quand même quelques trucs qui me gênent

  • pourquoi utiliser des broches en PWM pour générer la tension de test alors qu'il y a 2 DAC sur la DUE? Cela éviterait le "gros" filtrage sur la tension qui oblige à mettre une temporisation.
  • la mesure de la tension est entachée d'erreur à cause de la résistance interne du multiplexeur. Il faudrait mesurer la tension de l'autre coté du multiplexeur. Cela pourrait être fait avec un second multiplexeur en parallèle sur le premier dont la sortie D irait sur un ADC de la DUE. Dans cette configuration la tension mesurée serait la tension réelle sur la carte SD et la résistance interne du second multiplexeur ne poserait pas de problème car il n'y a pas de courant qui circule dedans.
    A noter que ce multiplexeur permettrait aussi de répondre à ta problématique d'un test de court-circuit en appliquant une tension sur une entrée avec le premier multiplexeur et en lisant l'état des autres broches avec le second.
  • je me demande si le fait d'appliquer un potentiel sur les entrées puis ensuite de les laisser en l'air n’entraîne pas l'accumulation de charge dans la carte (à travers les diodes de clamp) ce qui peut aussi fausser les mesures.
  • et surtout, je ne vois pas très bien la finalité de la chose.

Là, tu forces les IO à 0 alors que la question était justement de ne pas perturber les I/O de la carte SD.

Point par point:

  • J'utilise le PWM car les DAC sur la Due ne peuvent pas gérer des niveaux de tension proches de zéro et j'ai besoin d'une caractéristique complète. Je n'ai plus le chiffre en tête mais il me semble que les niveaux non gérés sont entre 0 et 0.5V donc non négligeable. Et puis le signal PWM filtré est tout aussi bien que l'Analog Output non ? C'est juste un peu plus complexe et le temps de montée du circuit RC est vraiment pas si long. On a une acquisition qui se fait en 2 minutes pour les 9 caractéristiques ce qui n'est pas du tout un soucis.
  • La résistance interne du multiplexeur est donnée par la datasheet et ne varie pas tant que ça avec Vd. N'y aurait-il pas moyen d'en tenir compte avec une valeur fixe que l'on ajouterait aux 270 ohms de R4 ? Le but étant surtout de lire la forme globale des courbes. Je ne souhaite pas nécessairement une valeur de mesure de courant précise au centième de mA près.
  • J'applique un potentiel sur l'entrée, puis je le remet vite à zéro après avoir lu mes autres pins. Je pense qu'il faudrait appliquer longtemps ce HIGH pour réellement voir une accumulation de charges non ? Et dans le pire des cas, je peux toujours ajouter des résistances de décharges reliées à la masse de mon circuit qui "viderait" ?
  • La finalité de la chose est le test de cartes SD qui ne fonctionnent plus! Parfois, à travers les caractéristiques courant-tension ou l'analyse des courts-circuits, on peut déduire pas mal de choses sur l'origine de la panne et comment donc la traiter.

Au départ j'avais plutôt pensé à des transistors ou des interrupteurs type relais pour désactiver mes pins digitaux. Plutôt que d'ajouter un autre multiplexeur onéreux et complexifier davantage le circuit.

Un autre problème me vient en tête: lors du tracé des caractéristiques courant -tension, je branche l'un de mes deux pins "Vss" de la carte SD à la masse afin d'avoir une mesure référencée et pas n'importe quoi. Alors que lors du test des courts-circuits, je branche tous mes pins de carte SD aux pins digitaux...

J'ai "dessiné" (comme j'ai pu :smiley: ) l'idée global de ce que je souhaiterais réaliser:


D1, D2 etc... sont les pins digitaux de la Arduino et M1, M2, etc... sont les entrées du multiplexeur
Les interrupteurs que l'on voit seraient commandables par la Arduino. On ferait une première étape dans le programme "Tests courts-circuits" puis on switch les interrupteurs et on lance l'étape "Tests caractéristique courant-tension". L'idéal serait des interrupteurs mécaniques commandés électriquement, pour ne pas induire de résistance interne parasite supplémentaire. Je n'ai jamais encore eu l'occasion d'utiliser des relais mais de ce que j'en sais, ça me semble correspondre à leur champ d'application non ? Le problème éventuel du relais c'est les petits parasites que j'aurais au moment du contact mécanique pour fermer le circuit mais il suffit que j'attende un peu avant de lancer l'acquisition et c'est bon non?

En tout cas merci à vous pour les réponses! ça m'aide beaucoup

c conpliqué.. :arrows_counterclockwise: :neutral_face:

alors quoi ? jsp... :no_mouth: