Décalage constant indésirable dans la lecture ADC

Jens

Décalage constant indésirable dans la lecture ADC


J’utilise un AD7323 ADC 12 bits + signe 4 canaux sur un bouclier Arduino personnalisé. Je le conduis avec 12V à partir d’une alimentation et -12V créé en utilisant un IC ICL7662 . Le VCC est à 5 V de l’Arduino. L’ADC est utilisé pour mesurer des signaux CC avec un faible taux d’échantillonnage (échantillonnage une fois par seconde environ).

La disposition du tableau ressemble à ceci entrez la description de l'image ici

et le brochage AD7323 est entrez la description de l'image ici

J’utilise des condensateurs CMS en céramique et des diodes BAT43. En utilisant le registre de contrôle, j’ai défini le mode d’alimentation sur Normal (0,0), le mode convertisseur à extrémité unique (0,0), le codage 1 (directement binaire), la référence interne 1 et le mode séquenceur désactivé (0,0).

SPI est configuré à 256 000 vitesses et MODE2. J’écris d’abord l’adresse dans le registre de contrôle, puis j’écris 0 via SPI pour recevoir la valeur de conversion suivante, ce qui me donne -FSR / 2 + 1LSB = 0 et FSR / 2-1LSB = 8191 comme valeur.

Le code C ++ pertinent est

 void AD7323::SetSamplingChannel(uint16_t channel) { uint16_t data = GetControlValue(true); data &= ~(3 << 10); //Clear channel bytes data |= channel << 10; // Push channel address uint16_t answer = WriteSPI(data); } uint16_t AD7323::ReadADC(uint16_t channel) { SetSamplingChannel(channel); uint16_t answer = WriteSPI(0) & ~(57344); //Remove top 3 bits return answer; } // Get the current value of for the control register uint16_t AD7323::GetControlValue(bool Write) { uint16_t data = Write ? 32800 : 32; //Sets write bit and Coding data &= ~(3 << 8); //Mode 0,0 data |= Mode << 8; //Set new mode data &= ~(1 << 4); //Ref 0 data |= (RefEnabled ? 1 : 0) << 4; //Set ref data &= ~(3 << 6); //Power mode 0,0 data |= PowerMode << 6; //Set power mode return data; } uint16_t AD7323::WriteSPI(uint16_t DIN) { SPI.beginTransaction(settings); //settings = SPISettings(256000, MSBFIRST, SPI_MODE2); digitalWrite(CSPin,LOW); uint16_t val = SPI.transfer16(DIN); digitalWrite(CSPin,HIGH); SPI.endTransaction(); delay(1); //Just for testing purposes return val; } 

Cela fonctionne fondamentalement, cependant quand j’applique simplement une tension donnée et que je lis la valeur ADC, j’ai un décalage constant de 11-13 LSB (LSB = 2,441 mV à -10-> 10V).

Je me demande si j’ai fait quelque chose de mal sur la disposition du côté code des choses. J’étais un peu sur le côté bas en termes de bouchons de découplage pour la puce, mais je ne comprends pas comment des bouchons de découplage manquants pourraient provoquer un décalage constant de la valeur lue. De plus, cela devrait-il être pris en charge par la référence interne de 2,5 V dans l’ADC?

Ou est-ce juste une chose qui existe, de sorte que je dois ajouter une fonction d’étalonnage dans le code?

Comme je suis à court d’idées, je serais ravi de toute contribution. Faites-moi savoir si vous avez besoin de plus d’informations.

Spehro Pefhany

Dans quelle mesure vos fournitures sont-elles symétriques?

Jens

@SpehroPefhany Je ne peux pas dire avec certitude dès le départ de ma tête. Ils sont à peu près similaires car le -12V est créé à partir de l’alimentation 12V. Je ne l’ai vérifié que rapidement parce que je pensais que peu importait la façon dont j’avais compris la fiche technique. Mais il peut y avoir peut-être quelques dizaines de mV de différence.

Spehro Pefhany

Avez-vous un voltmètre ou un multimètre? Nous sommes dans le domaine de «est» plutôt que «devrait être» à ce stade.

Jens

@SpehroPefhany Bien sûr, et je le mesurerais à nouveau immédiatement. Je n’ai malheureusement pas l’appareil à portée de main pour le moment, je devrais donc vous recontacter. C’est pourquoi je n’ai pas indiqué les valeurs précises, désolé.

Réponses


 Andy aka

AD7323 (à partir de la fiche technique): –

  • L’erreur de décalage peut aller jusqu’à +9 LSB asymétrique ou +10 LSB différentiel.
  • L’erreur de gain pourrait être de +/- 8 LSB asymétriques et de +/- 14 LSB différentiels
  • Les non-linéarités intégrales et différentielles pourraient ajouter 2 autres LSB
  • La précision de référence interne est de +/- 5 mV en 2,5 volts
Simon Richter

Devinette: la tension directe de D1 et D2 joue-t-elle également un rôle ici?

Jens

Donc, fondamentalement, cela signifie que je dois m’attendre aux quantités d’erreur que je vois et y faire face avec une fonction d’étalonnage? Ces décalages seraient-ils constants, par exemple dépendants de la puce, ou devraient-ils changer avec le temps?

Andy aka

@Jens, vous devez lire attentivement la fiche technique pour le savoir et regarder également la sensibilité à la température de ces chiffres. Ils dériveront avec le temps et si la DS ne donne pas les détails dont vous avez besoin, choisissez une meilleure pièce ou contactez ADI.

WhatRoughBeast

@Jens – Les nombres indiqués fournissent les limites du pire des cas. Pour le décalage, par exemple, il pourrait être nul, ou il pourrait être 7, ou il pourrait être 9, et dans tous les cas, le CAN fonctionnerait dans les limites spécifiées. Vous n’avez aucun moyen de savoir autre que les tests. Vous devez comprendre ce que ces erreurs signifient et spécifier votre choix de pièce en conséquence. Par exemple, si vous NE DEVEZ PAS avoir plus de 2 comptes d’erreur, vous avez besoin d’une puce différente.

Jens

Merci pour le conseil. Je ferai des « tests dans le monde réel » concernant la dépendance à la température et au temps des valeurs d’étalonnage.

 

#la, ADC, constant, dans, décalage», indésirable, lecture

 

google

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *