J'essaie d'obtenir plus de 10 bits de précision de mon Arduino ADC mais je ne peux pas vraiment comprendre la théorie derrière cela. Une note d'application Atmel souvent citée ( http://www.atmel.com/Images/doc8003.pdf ) dit que
Il est important de se rappeler que la moyenne normale n'augmente pas la résolution de la conversion. La décimation, ou interpolation, est la méthode de calcul de la moyenne, combinée à un suréchantillonnage, qui augmente la résolution
Ensuite, ce qu'ils proposent pour la «décimation», c'est de déplacer le point décimal. Ce qui revient à diviser par deux la lecture binaire pour chaque endroit où vous le déplacez, vous pouvez donc aussi diviser la valeur de base 10 par 2 ou 4 ou 8 ou ce que vous avez. Est-ce que je comprends mal la décimation?
Réponses:
J'ai jeté un œil à la note et c'est en effet une affirmation étrange (ou une façon confuse de dire ce qu'ils signifient réellement).
Peut-être que ce qu'ils signifient en fait, c'est que si vous voulez obtenir plus de résolution, vous ne pouvez pas diviser / décaler le nombre par la suite à la même échelle qu'un échantillon unique car (en arithmétique entière) cela jetterait les bits que vous avez gagnés.
Si vos échantillons ADC sont bruyants , vous pouvez bien sûr les diviser pour obtenir une valeur moins bruyante à l'échelle d'origine.
L'autre chose à laquelle j'ai pensé à partir de votre question était le fait que pour faire un suréchantillonnage correctement, vous devez utiliser un filtre passe-bas efficace, et une moyenne mobile simple n'est pas aussi bonne à être un filtre passe-bas qu'une FIR correctement conçue. (ou IIR) - mais cela ne semble pas être pris en charge par le texte de la note.
la source
Si vous demandez à quelqu'un de mesurer une planche de 45,2 cm au centimètre près, il répondra (ou devrait) répondre à 45. Si vous demandez ensuite de le mesurer à nouveau, il répondra à nouveau à 45. Répétez l'exercice 8 fois de plus et la moyenne de toutes les mesures devrait être exactement 45. Peu importe combien de fois on échantillonne l'entrée, on se retrouvera avec une valeur de 45. La moyenne de toutes ces lectures serait, bien sûr, 45 (même si la planche mesure 45,2 cm de long).
Si vous avez demandé à la personne d'ajuster l'appareil de mesure de manière à lire 0,45 cm de long avant la première mesure, 0,35 cm de long avant la seconde, 0,05 cm de long avant le cinquième, 0,05 cm de court avant le sixième, etc. jusqu'à 0,45 cm de court avant le dixième, alors deux des mesures indiqueraient 46 et les huit autres indiqueraient 45. La moyenne de toutes serait 45,2.
Dans la pratique, il est difficile de biaiser si précisément les choses. Si l'on ajuste au hasard l'appareil de mesure avant chaque mesure pour lire quelque part entre 0,5 cm de long et 0,5 cm de court, alors environ 1/5 des mesures lirait 46 et les 45 autres, mais parce que les ajustements sont aléatoires, la fraction réelle pourrait être plus élevée ou plus bas. Prendre dix mesures n'apporterait pas un chiffre significatif de précision, mais une moyenne d'environ 100 le ferait.
Je ne suis pas sûr de bien comprendre la justification du document pour la distinction entre la moyenne et le décalage à droite. Il faut être conscient que la précision apparente obtenue en faisant la moyenne peut dépasser le niveau de précision significatif, mais d'après mon expérience, la question de savoir quand et combien de décalage à droite doit être déterminée par les limites de la plage numérique du processeur. Travailler avec des nombres agrandis autant qu'ils peuvent l'être sans provoquer de débordement minimisera généralement les effets des erreurs d'arrondi, à condition que l'on n'attache pas une importance indue à de petites quantités de bruit.
Soit dit en passant, dans l'usage d'origine, "décimer" une armée, c'était tuer 1/10 des soldats qui s'y trouvaient. Décimer les données d'un ADC, c'est en jeter une partie. Le préfixe commun avec l'expression "point décimal" n'implique pas une association.
la source
La réponse courte est le bruit, et ce n'est pas nécessairement le bruit qui compte, mais le type de bruit . L'autre problème est les effets non linéaires comme l'INL qui jettent la valeur moyenne
Tout d'abord sur le bruit:
Si nous devions échantillonner une distribution gaussienne, cela ressemblerait à ceci:
La ligne rouge est plus proche de la distribution thermique réelle (moyenne dans le temps) et l'histogramme bleu représente de nombreux échantillons d'ADC. Si nous devions échantillonner en continu cette distribution, nous obtiendrions de meilleures statistiques et nous pourrions trouver la valeur moyenne ou la moyenne avec une meilleure précision (ce qui est généralement ce qui était après, oui, je réalise que les signaux se déplacent, il y a filtrage et signal sur bruit). en fonction du contenu en fréquence mais considérons simplement le cas DC où le signal ne bouge pas pour l'instant).
Le problème est le bruit de scintillement ou le bruit 1 / f, il déplace la moyenne gaussienne et provoque la décomposition des statistiques, car la distribution n'est plus gaussienne.
Il s'agit d'un modèle médiocre, mais vous pourriez considérer qu'il ressemble à quelque chose comme ça INL est également un problème car il peut introduire quelques bits d'erreur qui jette également la moyenne.
C'est probablement déroutant, regardons le domaine temporel comme indiqué ci-dessous
Dans l'image du haut, vous pouvez voir un signal avec un bruit gaussien, il serait facile de "tracer une ligne" au milieu et de trouver la moyenne. Plus vous disposez d'un échantillon d'un signal comme celui-ci, meilleure est la précision et la connaissance de la moyenne.
Dans l'image inférieure, vous pouvez voir à quoi ressemble le bruit de scintillement, la moyenne ne va pas aider ici.
Le problème est que la plupart des appareils électroniques ont un bruit de scintillement, pas les résistances (en supposant qu'il n'y a pas d'influence de la température ambiante) mais les transistors et les circuits intégrés le font. Il existe des amplificateurs appelés amplificateurs à découpage qui surmontent ces effets.
Une autre chose à savoir est qu'il existe des ADC (linéaire a un nouveau noyau SAR) où les ingénieurs ont travaillé pour éliminer les effets du bruit 1 / f (et d'autres effets non linéaires des ADC comme INL) à un niveau beaucoup plus faible que le bit ADC. valeur. Vous pouvez utiliser un suréchantillonnage important et obtenir des valeurs 32 bits à partir d'un cœur 14 bits.
Source: EDN- 1 / f Bruit - la bougie vacillante
la source
pas exactement. la partie de la décimation fait valoir que, à mon avis, à juste titre, la «moyenne» normale de plusieurs échantillons, mais en conservant la largeur de bit, ne conserve pas autant d'informations. Donc, si vous effectuez une moyenne des lectures ADC de m n bits, la moyenne résultante est toujours une lecture adc de n bits.
L'approche proposée consiste, pour le moins, à faire la moyenne des lectures ADC à n bits afin que la moyenne résultante ait une largeur de bit plus élevée. Par exemple, la somme de 4 lectures adc 10 bits et la division de la somme par 2 donne une lecture adc 11 bits.
J'ai pensé que cela a toujours été la façon dont le suréchantillonnage a été fait de manière professionnelle. Cette simple moyenne des gens sur le net est largement considérée comme la mauvaise approche.
l'autre point que pour réduire le bruit, le suréchantillonnage n'est efficace que s'il y a du bruit est le bon. Si vous aviez un ADC 10 bits conçu par Dieu (c'est-à-dire que chaque lecture est la vraie lecture absolue, sans variation), le suréchantillonnage n'aurait pas fonctionné.
les circuits particuliers vers la fin de l'article sur l'utilisation d'un pwm pour ajouter du bruit sont incorrects: la broche ajoutant du bruit doit avoir un condensateur de blocage CC. et un point moins important est qu'il ne doit pas être une broche PWM. Une broche GPIO normale fonctionnerait.
la source
Tout d'abord, un ADC est seulement aussi bon que sa référence de tension. Si votre arduino utilise le + 5V comme référence, vous pouvez oublier tout type de précision, car le régulateur + 5V est plutôt bruyant, de faible précision comme 1-5%, et sa tension de sortie dépendra de la quantité de courant tirée de à la fois au moment de la mesure et également au cours des dernières millisecondes.
Donc, si vous avez besoin d'exactitude ou de précision, veuillez sélectionner une référence de tension qui correspond à vos besoins. Si vous n'avez pas besoin d'une précision absolue sur la tension, ce sera moins cher, car vous n'en aurez besoin que pour être stable, au lieu d'être précis et stable.
Je n'ai pas testé le SAR ADC à l'intérieur de l'arduino. J'ai de l'expérience avec celui d'AT90PWM3B qui est un proche parent. C'est assez bien. Avec une tension d'entrée constante, vous obtenez la même lecture ADC, encore et encore, avec 1 LSB fluctuant si la tension est entre les valeurs. Je ne peux pas espérer un meilleur résultat d'un ADC SAR. (J'ai utilisé une référence de tension externe de bonne qualité)
Donc, le bruit n'est pas un problème ici ...
En fait, le bruit est votre ami ...
Supposons que la tension que vous souhaitez mesurer tombe sur la valeur ADC 100.1
Vous effectuez 10 mesures, mais comme l'ADC est bon, vous en obtenez 100 à chaque fois!
Vous avez donc besoin d'un peu de bruit sur votre signal, comme un LSB de bruit, pour vous assurer que si vous mesurez 100,1, vous obtiendrez 100 fois neuf sur dix et 101 fois sur dix. Il sera donc en moyenne à 100,1, vous avez l'idée?
S'il provient d'un capteur, vous aurez généralement assez de bruit gratuitement.
la source
Ce qui vous manque, c'est le sens de «décimation».
À proprement parler, la "décimation" est une réduction à 1/10. Autrement dit, de 10 réduire à 1.
La "décimation" telle qu'elle est utilisée dans l'échantillonnage perd son sens strict. Plutôt que 1/10, cela signifie «réduire en nombre».
Cela signifie que vous faites la moyenne d'un certain nombre d'échantillons et que vous réduisez le nombre d'échantillons du même nombre.
Par exemple, si vous échantillonnez à 1000 Hz et que vous échantillonnez en moyenne 4 échantillons, vous ne conservez que la moyenne. À la fin, vous n'avez que 250 échantillons par seconde au lieu de 1000. Vous avez perdu la résolution temporelle, mais gagné un bit de résolution de tension.
Pour chaque facteur de 4, vous gagnez 1 bit. Moyenne et décimale de 4, et passez d'une résolution de 10 bits à 11 bits de résolution.
Un autre facteur de 4 (4 * 4 = 16 au total) vous fait passer de 10 bits à 12 bits. Un autre facteur de 4 vous permet d'obtenir une résolution de 13 bits.
Mais, notez que vous suréchantillonnez maintenant d'un facteur 64. Votre taux d'échantillonnage effectif diminue du même facteur. En utilisant l'exemple du taux d'échantillonnage de 1000 Hz, vous êtes à environ 15 échantillons effectifs par seconde.
C'est la décimation, et c'est le nombre d'ADC à bit élevé qui obtiennent leur haute résolution. Ils échantillonnent à un taux élevé, moyen (ou utilisent un filtre passe-bas numérique) et déciment.
À l'extrême, vous disposez d'un ADC à un seul bit (un simple comparateur) qui suréchantillonne de plusieurs millons pour donner une profondeur de bits effective de 16 bits.
Une chose que vous devez garder à l'esprit pour que cela fonctionne est que vous avez besoin d'un bruit dans votre signal approximativement égal à la plus petite valeur que votre ADC puisse mesurer. Pour un CAN 10 bits utilisant une tension de référence de 5 V, ce serait un bruit d'environ 5 mV crête à crête.
La moyenne du bruit est l'origine des gains de bits. Imaginez que vous ayez un signal (DC) qui se situe exactement entre la valeur de 512 comptes ADC et 513 comptes ADC. En l'absence de bruit, la valeur mesurée sera toujours la même - la moyenne vous donnera la même valeur que les échantillons.
Ajoutez du bruit à peu près à la plus petite valeur mesurable, et cela semble très différent. Bien que le signal lui-même ne change pas, les valeurs mesurées "oscilleront" autour de la valeur réelle du signal. La moyenne est maintenant différente de celle des échantillons, et plus vous utilisez d'échantillons, plus vous vous rapprochez de la valeur réelle du signal
J'ai utilisé cette technique avec un Arduino (qui utilise un processeur Atmel avec un ADC 10 bits) pour obtenir une meilleure résolution pour certaines mesures que je faisais.
Je l'ai eu jusqu'à 13 bits, mais j'ai trouvé que j'en avais besoin de plus. J'aurais pu opter pour un autre facteur de 4, mais cela aurait pris trop de temps pour chaque échantillon et ne m'aurait obtenu qu'un bit de plus.
Les expériences de suréchantillonnage ont montré que ce que je faisais pouvait fonctionner (j'ai obtenu des résultats reconnaissables mais bruyants) sans avoir à dépenser du temps et de l'argent pour obtenir un meilleur ADC. Avec la preuve de concept, je pouvais aller de l'avant et obtenir ce meilleur ADC - et obtenir cette preuve ne m'a coûté que quelques lignes de code et un peu de temps.
J'ai trouvé que j'avais besoin d'au moins 16 bits. Cela aurait signifié une moyenne de 4096 échantillons.
Cela représente environ une demi-seconde en utilisant l'échantillonnage le plus rapide possible avec le logiciel Arduino.
Comme j'avais besoin de 14400 mesures, le cycle complet aurait pris 2 heures.
Je ne suis pas si patient, et les choses que je mesurais ne resteraient pas constantes aussi longtemps. J'ai dû passer à l'utilisation d'un ADC qui utilise un taux de suréchantillonnage beaucoup plus élevé en interne et qui fournit des échantillons de résolution plus élevée à un taux inférieur.
Comme pour beaucoup de choses, la décimation est un compromis qui peut vous offrir de meilleures performances dans une direction (profondeur de bits) tout en vous coûtant les performances dans une autre direction (taux d'échantillonnage).
la source
Vous pouvez donc étudier la théorie, mais je peux vous dire qu'en pratique, seul un modèle simple compte. Vous pouvez faire la moyenne, tant que votre signal est dans le bruit. La composante moyenne du bruit sera alors mise à zéro, tandis que le signal restera. De cette façon, vous obtiendrez une résolution au détriment de la bande passante.
Si vous avez par exemple un adc 16 bits et que ses quatre derniers bits sont bruyants, vous pouvez les filtrer et y obtenir le signal. Mais si vous avez juste un peu de bruit, il n'y a pas grand-chose à faire, donc vous n'obtiendrez pas beaucoup de nouvelles informations.
Si vous avez besoin d'une résolution très élevée (et d'une faible bande passante), regardez comment fonctionne l'ADC sigma-delta. Ils ont un signal à haut débit de 1 bit qui est ensuite filtré jusqu'à une certaine bande passante avec une résolution plus élevée, parfois 20 bits et plus.
la source
La moyenne permet d'améliorer la résolution en réduisant l'erreur d'écart type,σ . Le critère à respecter est que le bruit gaussien doit juste dépasser l'erreur de quantification. La spécification à définir est l'erreur totale et les erreurs de quantification ou de résolution ne contribuent qu'une petite partie du budget d'erreur total.
Par exemple, si vous vouliez améliorer la résolution de 2 bits, mais que votre bruit était déjà de 3 bits, vous devez considérer comment réduire le bruit de 2 + 3 = 5 bits tout en augmentant la résolution de 2 bits en même temps.
Où n est le ou les bits de résolution supplémentaires souhaités, le décalage vers la droite d'un nombre binaire (ou décimation) x1 est égal à / 2.
Pour faire la moyenne, cela signifie queσ du bruit est réduit de X--√ pour x échantillons mais aussi que la latence est augmentée de x échantillons de temps, donc un suréchantillonnage est nécessaire pour réduire la latence.
Cependant, le bruit à ce taux d'échantillonnage,Fs doit être juste suffisant pour trembler +/- 1 bit sur certains des échantillons x, pour obtenir la meilleure amélioration de la résolution.
Une erreur de quantification excessive ou un bruit aléatoire trop important nécessitera plus de moyenne pour réduire l'erreur et plus de moyenne augmentera la latence du résultat.
Pour optimiser un ADC pour la vitesse et l'erreur, il faut définir le budget d'erreur total et la résolution disponible (bits), le SNR souhaité ou l'erreur absolue pour tout signal donné dans toute la plage de mesure. La définition de toutes les sources d'erreur au début peut sembler difficile, mais nécessaire, y compris;
Ex: erreur de gain, erreur de décalage, erreur de quantification, erreur de bruit CM, erreur de bruit DM, bruit Vref ou erreur de décalage, bruit environnemental, etc., erreur de latence (provenant de la moyenne)
Déterminez ensuite le nombre de bits de résolution supplémentaires dont vous avez besoin pour atteindre le budget d'erreurs de conception ci-dessus une fois que toutes les autres sources d'erreur ont été réduites.
La même chose s'applique à la moyenne (pour les signaux lents) et au suréchantillonnage de la bande passante du signal et à la décimation pour l'ADC en temps réel.
Cela ne corrigera pas les erreurs de gain ou de décalage et si le bruit aléatoire est insuffisant, du bruit doit être ajouté pour tramer le signal. Idéalement, toutes les autres sources de bruit et d'erreur ne dépassent pas 1 bit, de sorte que l'écart type ou le tremblement n'est que de +/- 1 valeur sur le nombre d'échantillons. Cependant, il doit y avoir suffisamment de bruit pour que la même lecture ne soit pas obtenue par des échantillons successifs dans les deux méthodes.
la source
La théorie sous-jacente peut être tirée, sous forme abrégée, de cette phrase l'article de Wikipedia sur le suréchantillonnage :
Donc, à condition que votre signal corresponde à certains critères (comme être suffisamment lent et avoir un faible bruit), vous augmentez en fait un bit pour 4 échantillons. Ensuite, pour tous les 4 échantillons résultants, vous pouvez obtenir "join" puis à nouveau pour former un autre échantillon, de plus haute résolution, de sorte qu'à la fin, vous obtenez log_4 (n) bits pour chaque n échantillons que vous lisez sur votre ADC.
Quant à la partie décimation, ce n'est pas vraiment une moyenne, surtout si l'on considère que nous parlons ici d'entiers (échantillons ADC). Par exemple, si vous avez des échantillons
1
,1
,3
et2
, votre moyenne serait la suivante:Puisque vous faites la moyenne avec des mathématiques entières, votre "résultat mathématique" de 1,75 sera arrondi à 1. Si vous multipliez ensuite par 2, vous obtiendrez
2
.Maintenant, si vous le décimez avec:
Votre résultat sera
3
. Vous pouvez affirmer que cela revient à diviser par 2, mais vous ne pouvez certainement pas affirmer que 3 est la moyenne de 1, 1, 3 et 2 . Regarde la différence?Maintenant, vous pourriez être tenté de tout résumer et de ne pas jeter le dernier bit. Mais rappelez-vous que ce bit est du bruit: vous ne pouvez pas vraiment l'utiliser.
la source
N/sqrt(N) = sqrt(N)
.Il semble que tout le monde ait déjà couvert la partie théorique de votre question, mais puisque vous utilisez un Arduino, vous voudrez peut-être lire mes aventures en essayant d'améliorer la résolution de l'ADC avec cette technique:
Amélioration de la résolution Arduino ADC avec tramage et suréchantillonnage
Le caractère du bruit est une partie critique de l'histoire, et il s'avère que vous pouvez générer un tramage raisonnablement bon en pulsant simplement une broche avec une résistance pendant que vous lisez l'ADC de manière asynchrone. Ce n'est pas parfait, et vous obtenez un petit décalage de synchronisation qui varie en fonction du nombre d'échantillons / bits supplémentaires que vous essayez d'atteindre. J'accepterais également la critique selon laquelle cette technique dépend de la mauvaise stabilisation du rail dans l'Arduino, donc est vraiment une conception défectueuse, plutôt que de suivre les bonnes pratiques. Mais c'est très simple à faire.
la source