Taula de continguts:

Coneixeu l’ajust de l’ADC ESP32 ?: 29 passos
Coneixeu l’ajust de l’ADC ESP32 ?: 29 passos

Vídeo: Coneixeu l’ajust de l’ADC ESP32 ?: 29 passos

Vídeo: Coneixeu l’ajust de l’ADC ESP32 ?: 29 passos
Vídeo: Как сделать самодельный инкубатор для яиц. Отрегулируйте, запрограммируйте и откалибруйте термостат. 2024, De novembre
Anonim
Image
Image
Recursos utilitzats
Recursos utilitzats

Avui parlaré d’un tema més tècnic, però crec que tothom que treballi amb ESP32 ho hauria de saber: el problema de l’ADC (convertidor analògic-digital) de lectura. Ho trobo important perquè quan es fa una "mesura", sobretot amb un instrument que té una sortida analògica, cal estar absolutament segur que la lectura s'està realitzant correctament.

Al vídeo d'avui, per tant, realitzarem mesures mitjançant el "convertidor analògic-digital" de l'ESP32, observarem les discrepàncies de conversió i aplicarem un mètode d'ajust / calibratge ADC.

Pas 1: què és un convertidor d'anuncis publicitaris?

Un convertidor AD és un circuit capaç de traduir una quantitat analògica (contínua) a valors digitals (discrets). Què vol dir això? Vol dir que, tot i que els valors digitals només poden assumir valors discrets formats per la combinació de zeros i uns, una quantitat analògica pot assumir qualsevol valor dins d’un interval. Per exemple, si mesuréssim el voltatge d’una cèl·lula AA ideal, podríem trobar qualsevol valor entre 0V i 1,5V, ja que es tracta d’una quantitat analògica. L'estat de sortida d'una làmpada ideal ha de suposar només dos estats (apagat o encès), que és una magnitud discreta. Com que els microcontroladors funcionen amb aquesta lògica discreta, necessitem un circuit capaç de traduir una quantitat analògica a digital (o discreta).

Pas 2: recursos utilitzats

• Una targeta Lolin32 Lite v1.0.0

• Un oscil·loscopi Tektronix TDS1001C per a la captura

• Un cable USB per a l'ESP32

• Un oscil·loscopi Hantek DSO4102C com a generador de senyals

Pas 3: ESP32 ADC

ESP32 ADC
ESP32 ADC

Segons les dades d'Espressif, els xips ESP32 poden presentar una diferència del +/- 6% d'un xip a un altre en els resultats mesurats.

A més, la conversió NO té una resposta lineal per a cada interval disponible per llegir. Espressif proporciona un mètode de calibratge i suggereix que els usuaris implementin altres mètodes si ho consideren necessari per aconseguir la precisió desitjada.

Realitzarem una adquisició de dades i, a partir d’aquesta, mostrarem les respostes ADC i un exemple d’aplicació d’un procés matemàtic per llegir l’ajust.

Hi ha diverses maneres (més senzilles o més complexes) d’aconseguir aquestes correccions. Depèn de vosaltres avaluar el més adequat per al vostre projecte.

El que es mostra aquí tindrà un propòsit il·lustratiu i intentarà tractar punts interessants que es puguin observar durant els ajustos.

Pas 4: Circuit utilitzat

Circuit utilitzat
Circuit utilitzat

He utilitzat un oscil·loscopi amb un generador de senyal que puja a 25 MHz, el Hantek DSO4102C. Hem generat una ona que ha estat llegida per l’ESP A / D i l’oscil·loscopi. Les dades recollides es van registrar en csv i en un full de càlcul, que deixaré al final de l'article per a la seva descàrrega.

Pas 5: signe utilitzat

Rètol utilitzat
Rètol utilitzat

Vam triar un senyal trapezoïdal de baixa freqüència que permet accedir a les rampes que recorren tot el rang de conversió. Això permet un gran nombre de mostres en aquestes rampes.

Pas 6: dades obtingudes per l'oscil·loscopi

Dades obtingudes per l’oscil·loscopi
Dades obtingudes per l’oscil·loscopi

La imatge de la captura la va realitzar l’oscil·loscopi. Les dades s’emmagatzemaven en un fitxer CSV. Tingueu en compte la lleugera curvatura a les rampes ascendents i descendents del senyal.

Pas 7: dades obtingudes per l'oscil·loscopi (fitxer CSV a Excel)

Dades obtingudes per l'oscil·loscopi (fitxer CSV a Excel)
Dades obtingudes per l'oscil·loscopi (fitxer CSV a Excel)

Tenim les mostres aquí.

Pas 8: dades obtingudes per l'ADC

Dades obtingudes per l'ADC
Dades obtingudes per l'ADC

Canviant la velocitat de transferència del serial, podem veure les dades capturades per l’ADC. Observeu la deformació del senyal trapezoïdal.

Dades observades al traçador sèrie Arduino IDE

Pas 9: dades obtingudes per ADC - Excel

Dades obtingudes per ADC - Excel
Dades obtingudes per ADC - Excel

Utilitzant una taxa més alta i el terminal sèrie, podem capturar els valors i aplicar-los a Excel per a les nostres comparacions.

Pas 10: Comparació de rampes de pujada

Comparació de rampes de pujada
Comparació de rampes de pujada

Comparem les dues rampes d’escalada de les dues captures.

Tingueu en compte la curvatura que es produeix a les dues rampes.

Tingueu en compte també que, per a la mateixa rampa, tenim moltes més mostres de l’ESP32 que de l’oscil·loscopi.

Pas 11: equiparació del nombre de mostres

Suma el nombre de mostres
Suma el nombre de mostres
Suma el nombre de mostres
Suma el nombre de mostres

Com que l’ESP32 proporcionava un nombre més gran de mostres que l’oscil·loscopi, hem d’igualar aquests valors, ja que serviran d’índex per comparar les dues corbes.

Per a això, farem una comparació directa.

Tenim 305 mostres per a la rampa de l’oscil·loscopi i 2365 mostres per a la rampa ADC.

Com que les rampes són del mateix rang, podem dir que tenim aproximadament 7,75 mostres de l’ADC per a cada oscil·loscopi.

Multiplicar l’índex de cada mostra d’oscil·loscopi té la mateixa corba, però amb índexs equivalents a l’ADC i a les dades redistribuïdes.

Per emplenar les dades que falten per a les noves posicions, aplicarem una corba que s’adapti estadísticament a les dades conegudes.

Pas 12: omplir els buits: línia de tendència

Omplint els buits: línia de tendència
Omplint els buits: línia de tendència
Omplint els buits: línia de tendència
Omplint els buits: línia de tendència

Seleccionant les dades conegudes (punts blaus), fent clic i després fent clic amb el botó dret, seleccionem: "Afegeix línia de tendència …"

A la finestra que apareix, seleccionem el tipus de polinomi (n’hi haurà prou amb l’ordre 2).

També hem comprovat les opcions "Mostra l'equació al gràfic" i "Mostra el valor al quadrat R al gràfic".

Fem clic a "Tanca".

Pas 13: Omplir els buits: corba polinòmica de grau 2

Omplint els buits: corba polinòmica de grau 2
Omplint els buits: corba polinòmica de grau 2

Excel ens proporciona dues noves informacions; l’equació de segon ordre que s’adapta millor a les dades i l’equació al quadrat R que quantifica aquesta adequació.

Recordeu que, com més a prop d’1, més adequada és l’equació.

No aprofundim en les matemàtiques implicades, només les fem servir com a eina.

Pas 14: omplir els buits: avaluar la funció

Omplim els buits de mostreig amb les dades generades per l’equació. I després, compareu-los punt per punt.

y = -9E-08x2 + 0, 0014x + 0, 1505

R² = 0, 9999

Tensió de l’oscil·loscopi = -9E-08 * índex2 + 0, 0014 * índex + 0, 1505

Pas 15: convertir el voltatge de l'oscil·loscopi en un valor equivalent per comparar amb l'ADC

Conversió del voltatge de l’oscil·loscopi a un valor equivalent per comparar amb l’ADC
Conversió del voltatge de l’oscil·loscopi a un valor equivalent per comparar amb l’ADC

Aprofitem això per transformar també el valor del voltatge de l'oscil·loscopi en un valor ADC equivalent.

Com que el valor més alt obtingut a l’ADP de l’ESP32 va ser 4095, que equival a la lectura de 2.958V per al mateix índex, podem dir que:

Cada volt de les mesures de l’oscil·loscopi equival aproximadament a 1384,4 unitats de l’AD. Per tant, podem multiplicar totes les mesures de l’oscil·loscopi per aquest valor.

Pas 16: Comparació de les dues rampes obtingudes

Comparació de les dues rampes obtingudes
Comparació de les dues rampes obtingudes

Visualització de les diferències obtingudes en les dues lectures.

Pas 17: Comportament de la diferència de lectura de l'ADC (ERROR)

Comportament de la diferència de lectura de l'ADC (ERROR)
Comportament de la diferència de lectura de l'ADC (ERROR)

La corba següent mostra com es comporta la diferència en la lectura ADC en funció de la mesura. Aquesta recopilació de dades ens permetrà trobar una funció de correcció.

Per trobar aquesta corba, simplement dibuixem la diferència que es troba en cada mesura en funció de cada posició AD possible (de 0 a 4095).

Pas 18: Comportament de la diferència de lectura de l'ADC: trobar una funció de correcció

Comportament de la diferència de lectura de l'ADC: trobar una funció de correcció
Comportament de la diferència de lectura de l'ADC: trobar una funció de correcció

Podem determinar a Excel una funció de correcció afegint una línia de tendència, ara de grau superior, fins que encaixi prou amb les nostres dades.

Pas 19: utilitzar un altre programari

Ús d’un altre programari
Ús d’un altre programari
Ús d’un altre programari
Ús d’un altre programari
Ús d’un altre programari
Ús d’un altre programari
Ús d’un altre programari
Ús d’un altre programari

Un altre programari interessant per determinar les corbes és PolySolve, que es pot utilitzar directament a l’enllaç: https://arachnoid.com/polysolve/ o descarregar-lo com a aplicació Java.

Permet l'aplicació de regressions polinòmiques de grau superior i el lliurament de la funció formatada, així com d'altres funcionalitats.

Per utilitzar-lo, només cal que introduïu les dades al primer quadre de text. Les dades han de seguir l'ordre X, Y separat per una coma o una pestanya. Tingueu precaució quan utilitzeu correctament el punt com a punt decimal.

Apareixerà un gràfic al quadre següent si les dades introduïdes tenen un format correcte.

A continuació s’explica la nostra corba d’errors ADC.

Aquesta finestra presentarà el resultat de la regressió, incloses les dades d’adequació de les funcions, que al seu torn poden tenir la seva sortida formatada de diverses maneres: com a funció C / C ++, una llista de coeficients, una funció escrita en Java, etc.

Nota: parar atenció als separadors decimals

Pas 20: constants i configuració ()

Apunto aquí el GPIO utilitzat per a la captura analògica. Inicialitzo el port sèrie, així com el pin determinat per a la captura analògica.

const int pin_leitura = 36; // GPIO usat per a captura analògica void setup () {Serial.begin (1000000); // Iniciciando a porta serial somente para debug pinMode (pin_leitura, INPUT); // Pino utilitzat per a captura analògica}

Pas 21: Loop () i la funció de correcció

Fem la captura del voltatge ajustat i imprimim els valors amb o sense les correccions correctes.

void loop () {int valor_analogico = analogRead (pin_leitura); // realiza a captura da tensão ajustada //Serial.print(valor_analogico + f (valor_analogico)); // imprime os valores para debug (COM CORREÇÃO) Serial.print (valor_analogico); // imprimime os valores para debug (SEM CORREÇÃO) Serial.print (","); Serial.print (4095); // cria uma linha para marcar o valor máximo de 4095 Serial.print (","); Serial.println (0); // cria uma linha para marcar o valor mínim de 0}

Fixeu-vos a la línia 12 que tenim l'opció d'imprimir les dades amb l'addició de la funció de diferència f (valor_analògic).

Pas 22: utilitzar la funció de correcció PolySolve

Aquí fem servir la funció PolySolve dins de l’IDE Arduino.

/ * Mode: grau polinòmic normal 6, 2365 x, y parells de dades Coeficient de correlació (r ^ 2) = 9, 907187626418e-01 Error estàndard = 1, 353761109831e + 01 Formulari de sortida: funció C / C ++: Copyright © 2012, P. Lutus: https://www.arachnoid.com. Tots els drets reservats. * / doble f (doble x) {retorn 2.202196968876e + 02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow (x, 2) + -3.470360275448e-07 * pow (x, 3) + 2.082790802069e- 10 * pow (x, 4) + -5.306931174991e-14 * pow (x, 5) + 4.787659214703e-18 * pow (x, 6); }

Tingueu en compte el canvi de coma per punt com a separador decimal.

Pas 23: Captura amb correcció - Plotter sèrie

Captura amb correcció: Plotter sèrie
Captura amb correcció: Plotter sèrie

Pas 24: cost computacional

Cost computacional
Cost computacional
Cost computacional
Cost computacional

Per realitzar càlculs polinòmics, és necessari que el processador s’encarregui d’aquesta tasca. Això pot comportar retards en l'execució, en funció del codi font i de la potència de càlcul disponible.

Aquí veiem una taula de resultats d’una prova que utilitza polinomis de diversos graus. Fixeu-vos en la diferència entre els moments en què es va utilitzar la funció pow () i quan no.

Pas 25: Codi de prova: configuració () i inici de bucle ()

Aquí tenim el codi utilitzat a la nostra prova.

configuració nul·la () {Serial.begin (1000000); // Iniciando a porta serial somente para debug} void loop () {float valor_analogico = 500.0; // um valor arbtrario float quantidade = 10000.0; // quantitat de xamades float contador = 0,0; // contador de xamades

Pas 26: Codi de prova: bucle () i processament

He utilitzat la funció micros () per obtenir el valor en microsegons.

// ============= inicia o processo float agora = micros (); // marca o instante inicial while (contador <quantitat) {// v (valor_analogico); // função vazia // r (valor_analogico); // função com retorno // f0 (valor_analogico); // grau 0 // f1 (valor_analogico); // grau 1 // f2 (valor_analogico); // grau 2 // f3 (valor_analogico); // grau 3 // f4 (valor_analogico); // grau 4 // f5 (valor_analogico); // grau 5 // f6 (valor_analogico); // grau 6 // f13_semPow (valor_analogico); // grau 13º SEM a função POW // f13_comPow (valor_analogico); // grau 13º COM a função POW contador ++; } agora = (micros () - agora) / quantidade; // determina o intervalo que se passou para cada iteração // ============= finaliza o processo

Pas 27: Codi de prova - bucle () - Resultats

Imprimim el valor retornat de la funció de grau 13 amb i sense POW per a la comparació, així com l'interval de processament.

// imprime o valor retornado da função de grau 13 com e sem POW para comparação Serial.print (f13_semPow (valor_analogico)); // grau 13º SEM a função POW Serial.print ("-"); Serial.print (f13_comPow (valor_analogico)); // grau 13º COM a funció POW Serial.print ("-"); // imprime o intervalo do processament Serial.println (agora, 6); }

Pas 28: Codi de prova: funcions usades

Funcions buides (només amb retorn) de grau 0 i 1.

// FUNÇÃO VAZIAdouble v (double x) {} // FUNÇÃO SOMENTE COM RETORNO double r (double x) {return x; } // FUNÇÃO DE GRAU 0 doble f0 (doble x) {retorn 2.202196968876e + 02; } // FUNÇÃO DE GRAU 1 doble f1 (doble x) {retorn 2.202196968876e + 02 + 3.561383996027e-01 * x; }

Funcions de grau 2, 3 i 4.

// FUNÇÃO DE GRAU 2double f2 (double x) {return 2.202196968876e + 02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow (x, 2); } // FUNÇÃO DE GRAU 3 doble f3 (doble x) {retorn 2.202196968876e + 02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow (x, 2) + -3.470360275448e-07 * pow (x, 3); } // FUNÇÃO DE GRAU 4 doble f4 (doble x) {retorn 2.202196968876e + 02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow (x, 2) + -3.470360275448e-07 * pow (x, 3) + 2.082790802069e-10 * pow (x, 4); }

Funcions de grau 5 i 6.

// FUNÇÃO DE GRAU 5doble f5 (doble x) {retorn 2.202196968876e + 02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow (x, 2) + -3.470360275448e-07 * pow (x, 3) + 2.082790802069e-10 * pow (x, 4) + -5.306931174991e-14 * pow (x, 5); } // FUNÇÃO DE GRAU 6 doble f6 (doble x) {retorn 2.202196968876e + 02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow (x, 2) + -3.470360275448e-07 * pow (x, 3) + 2.082790802069e-10 * pow (x, 4) + -5.306931174991e-14 * pow (x, 5) + 4.787659214703e-18 * pow (x, 6); }

Funció de grau 13 mitjançant el POW.

// FUNÇÃO DE GRAU 13 USANDO O POWdouble f13_comPow (double x) {return 2, 161282383460e + 02 + 3, 944594843419e-01 * x + 5, 395439724295e-04 * pow (x, 2) + -3, 968558178426e-06 * pow (x, 3) + 1, 047910519933e-08 * pow (x, 4) + -1, 479271312313e-11 * pow (x, 5) + 1, 220894795714e-14 * pow (x, 6) + -6, 136200785076e-18 * pow (x, 7) + 1, 910015248179e-21 * pow (x, 8) + -3, 566607830903e-25 * pow (x, 9) + 5, 000280815521e-30 * pow (x, 10) + 3, 434515045670e-32 * pow (x, 11) + -1, 407635444704e-35 * pow (x, 12) + 9, 871816383223e-40 * pow (x, 13); }

Funció de grau 13 sense utilitzar POW.

// FUNÇÃO DE GRAU SEM USAR O POWdouble f13_semPow (double x) {return 2, 161282383460e + 02 + 3, 944594843419e-01 * x + 5, 395439724295e-04 * x * x + -3, 968558178426e-06 * x * x * x + 1, 047910519933e-08 * x * x * x * x + -1, 479271312313e-11 * x * x * x * x * x + 1, 220894795714e-14 * x * x * x * x * x * x + -6, 136200785076e-18 * x * x * x * x * x * x * x + 1, 910015248179e-21 * x * x * x * x * x * x * x * x + -3, 566607830903e- 25 * x * x * x * x * x * x * x * x * x + 5, 000280815521e-30 * x * x * x * x * x * x * x * x * x * x + 3, 434515045670e- 32 * x * x * x * x * x * x * x * x * x * x * x + -1, 407635444704e-35 * x * x * x * x * x * x * x * x * x * x * x * x + 9, 871816383223e-40 * x * x * x * x * x * x * x * x * x * x * x * x * x; }

Pas 29: fitxers

Descarregueu els fitxers:

PDF

INO

Full de càlcul

Recomanat: