A propos de cette question
Je n'ai pas de formation en génie électronique, et c'est l'un de mes premiers défis avec la communication via I2C, et avec l'écriture dans un registre, alors s'il vous plaît ne supposez pas trop de connaissances de mon côté. Je programme un Arduino.
En posant des questions sur un composant / puce électronique spécifique, je suppose que les gens ne peuvent pas expérimenter / tester pour me donner une réponse correcte. Je m'attends également à ce que les gens ne connaissent même pas cette composante. Je vais donc essayer d'ajouter beaucoup d'informations dans cette question.
Veuillez me faire savoir si vous avez besoin de plus d'informations.
Le composant possède quatre ADC
J'utilise le composant 4 canaux, MCP3424 ( fiche technique ). Il vient dans deux paquets. J'utilise la version MCP3424 E / SL, SOIC 4 canaux, pas la version MCP3422 ou MCP3423 2 canaux.
Je crois qu'il a quatre ADC. Sur RS-Online, il semble que la version E / SL dispose de 4 ADC ( lien direct ), tandis que l'E / ST n'en a qu'un ( lien direct ).
Je suppose que cela doit signifier qu'il peut faire un échantillonnage sur plusieurs canaux simultanément. Je ne vois aucune autre raison de mettre plus d'un ADC sur le composant.
Ai-je raison?
Communication via I2C
La communication se produit en envoyant un octet de configuration, puis en attendant la fin d'un échantillonnage et en lisant le résultat.
Format de l'octet de configuration
Les plus intéressants sont:
- bit trois à partir de la gauche, en comptant à partir de 1: échantillonnage continu
- bits un et deux à partir de la gauche, en comptant à partir de 1: Adresse
Vous trouverez plus d'informations sur l'octet de configuration sur la page 18 de la fiche technique, également illustrée ici .
Format du résultat de lecture
Mes exemples ne seront qu'avec une résolution de 18 bits (bits 5 et 6 mis à 1). Le résultat de la relecture sera de quatre octets: les trois premiers contenant la valeur et le quatrième contenant l'octet de configuration.
Cependant, le bit le plus à gauche,! RDY, indique si la valeur est "nouvelle", c'est-à-dire s'il s'agit d'une nouvelle lecture, depuis la dernière lecture. La première fois que vous lisez un résultat, la valeur est 0 et pour les suivants, elle est 1, jusqu'à ce que l'ADC soit prêt avec une nouvelle valeur d'échantillon.
Comment l'utiliser sans échantillonnage en parallèle
Je sais parfaitement comment faire ça. Et tous les exemples que j'ai trouvés en ligne, aussi simples que ça. Écrivez simplement un octet de configuration dans le composant, puis relisez une valeur.
Comment configurer chaque canal pour échantillonner automatiquement en continu et lire les canaux en parallèle
Le pseudo-code pourrait ressembler à
setup():
start sampling channel 1, 18bit, 0gain, continuously
start sampling channel 2, 18bit, 0gain, continuously
start sampling channel 3, 18bit, 4gain, continuously
start sampling channel 1, 18bit, 2gain, continuously
readADCs():
// Run every 500ms
// 18 bit samples take 375ms, so must happen in parallel
// to get a new sample for all every 500ms
read channel 1
read channel 2
read channel 3
read channel 4
Ma meilleure tentative
J'espère donc que ce qui suit définit chaque ADC à échantillonner en continu. Ceci est du code Arduino.
void setup() {
Wire.write(0b00011100);
Wire.write(0b01011100);
Wire.write(0b10011110);
Wire.write(0b11011101);
}
Ensuite, comment lire une chaîne spécifique. Si je demande juste au composant le résultat, il retournera le résultat du canal sur le registre. Avec la configuration ci-dessus, j'obtiendrais la lecture du canal 4. Mais disons que je veux la lecture du canal 2. D'une certaine manière, je dois juste lui dire que je veux le résultat du canal 2. Je ne veux pas lui demander d'échantillonner quoi que ce soit, il devrait juste continuer à faire un échantillonnage continu, et je veux juste l'échantillon le plus rancunier qu'il ait créé lors de l'échantillonnage automatique.
Voici ma meilleure estimation
void readADCs() {
// Channel 1
// ...
// Channel 2
Wire.beginTransmission(104);
Wire.write(0b01011100); // I hope not to affect, just to select
Wire.endTransmission();
Wire.requestFrom(104);
Wire.read(); // val byte 1
Wire.read(); // val byte 2
Wire.read(); // val byte 3
Wire.read(); // config byte
}
Donc, ma meilleure supposition est. Si je veux lire le canal 2, j'écris un octet de configuration qui est exactement le même que celui que j'ai utilisé pour commencer l'échantillonnage du canal 2.
Cependant, cela ne fonctionne pas. Aucun échantillon n'est prêt, même s'il a dépassé les 375 ms nécessaires.
Comment puis-je y parvenir?
J'ai essayé de faire de mon mieux pour décrire le résultat souhaité et ce que j'ai essayé, mais je sais que ce n'est pas facile à lire.
Pourriez-vous me donner des conseils sur la façon de laisser tous les ADC échantillonner en parallèle, puis de les lire, sans interférer?
Réponses:
Malheureusement non. Il n'y a qu'un seul CAN et, pour convertir plus d'un canal, cela doit être fait séquentiellement en adressant le multiplexeur interne "lisant" ainsi un autre canal. Pas d'échantillonnage simultané malheureusement: -
Notez que le multiplexeur d'entrée sélectionne UNIQUEMENT un des quatre canaux à la fois. Il s'agit d'une méthode assez courante pour lire plusieurs canaux, mais il existe des ADC d'échantillonnage simultané. Essayez de regarder les portefeuilles de technologie linéaire, TI ou ADI.
la source
Le MCP3424 est un ADC unique avec un multiplexeur à l'avant.
Ce diagramme de la fiche technique le montre assez clairement
La fiche technique soutient cela avec l'introduction:
4.1 Présentation générale
Les dispositifs MCP3422 / 3/4 sont des convertisseurs A / N Delta-Sigma 18 bits multicanaux basse consommation différentiels avec une interface série I2C. Les dispositifs contiennent un multiplexeur de sélection de canal d'entrée (multiplexeur), un amplificateur à gain programmable (PGA), une référence de tension intégrée (2,048 V) et un oscillateur interne.
Par conséquent, vous ne pouvez pas convertir différents canaux vraiment simultanément, mais vous pouvez échantillonner les canaux séquentiellement avec un délai relativement court entre eux.
Lorsque vous utilisez l'appareil, vous devez vous assurer que les bits d'adresse I2C sont stables; encore une fois, de la fiche technique:
Le MCP3423 et le MCP3424 ont deux broches d'adresse de périphérique externe (Adr1, Adr0). Ces broches peuvent être définies sur une logique haute (ou liée à VDD), basse (ou liée à VSS), ou laissée flottante (non connectée à quoi que ce soit, ou liée à VDD / 2), ces combinaisons de niveau logique utilisant les deux broches autorisez huit adresses possibles. Le tableau 5-3 montre l'adresse du périphérique en fonction de l'état logique des broches de sélection d'adresse. Le périphérique échantillonne l'état logique des broches Adr0 et Adr1 dans les événements suivants:
une. Mise sous tension de l'appareil.
b. Réinitialisation générale des appels
(Voir la section 5.4 «Appel général»).
c. Verrou d'appel général
(Voir la section 5.4 «Appel général»).
Le périphérique échantillonne l'état logique (broches d'adresse) pendant les événements ci-dessus et verrouille les valeurs jusqu'à ce qu'un nouvel événement de verrouillage se produise. Pendant le fonctionnement normal (une fois les broches d'adresse verrouillées), les broches d'adresse sont désactivées en interne du reste du circuit interne.
Il est recommandé d'émettre une commande General Call Reset ou General Call Latch une fois après la mise sous tension de l'appareil. Cela garantira que l'appareil lit les broches d'adresse dans un état stable et évite de verrouiller les bits d'adresse pendant que l'alimentation augmente. Cela pourrait entraîner une détection inexacte des broches d'adresse.
Je vous suggère de suivre cette recommandation pour vous assurer que vous communiquez vraiment avec l'appareil.
Pour lire un canal particulier, vous devez sélectionner le canal dans le registre de configuration et démarrer une conversion. Le bit RDY passe à l'état bas lorsque le résultat de cette conversion est disponible dans le registre de sortie.
la source