Taula de continguts:
- Pas 1: què és un convertidor d'anuncis publicitaris?
- Pas 2: recursos utilitzats
- Pas 3: ESP32 ADC
- Pas 4: Circuit utilitzat
- Pas 5: signe utilitzat
- Pas 6: dades obtingudes per l'oscil·loscopi
- Pas 7: dades obtingudes per l'oscil·loscopi (fitxer CSV a Excel)
- Pas 8: dades obtingudes per l'ADC
- Pas 9: dades obtingudes per ADC - Excel
- Pas 10: Comparació de rampes de pujada
- Pas 11: equiparació del nombre de mostres
- Pas 12: omplir els buits: línia de tendència
- Pas 13: Omplir els buits: corba polinòmica de grau 2
- Pas 14: omplir els buits: avaluar la funció
- Pas 15: convertir el voltatge de l'oscil·loscopi en un valor equivalent per comparar amb l'ADC
- Pas 16: Comparació de les dues rampes obtingudes
- Pas 17: Comportament de la diferència de lectura de l'ADC (ERROR)
- Pas 18: Comportament de la diferència de lectura de l'ADC: trobar una funció de correcció
- Pas 19: utilitzar un altre programari
- Pas 20: constants i configuració ()
- Pas 21: Loop () i la funció de correcció
- Pas 22: utilitzar la funció de correcció PolySolve
- Pas 23: Captura amb correcció - Plotter sèrie
- Pas 24: cost computacional
- Pas 25: Codi de prova: configuració () i inici de bucle ()
- Pas 26: Codi de prova: bucle () i processament
- Pas 27: Codi de prova - bucle () - Resultats
- Pas 28: Codi de prova: funcions usades
- Pas 29: fitxers
Vídeo: Coneixeu l’ajust de l’ADC ESP32 ?: 29 passos
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:14
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
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
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
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
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)
Tenim les mostres aquí.
Pas 8: 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
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
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
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
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
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
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
Visualització de les diferències obtingudes en les dues lectures.
Pas 17: 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ó
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
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
Pas 24: 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:
INO
Full de càlcul
Recomanat:
No fa pipí ara, dispositiu d’ajust del comportament de les mascotes que impedeix que els gats facin pipí a casa: 4 passos
No Pee Now, dispositiu d’ajust del comportament de les mascotes que impedeix que els gats facin pipí a casa: em va molestar tant el meu gatet que li agrada fer pipí al meu llit, vaig comprovar tot el que necessita i també la vaig portar al veterinari. Després d’haver resolt tot el que puc pensar i escoltar la paraula del metge, m’adono que només té un mal comportament. Així que
Simulador de bicicletes amb ajust de velocitat en temps real: 5 passos
Simulador de bicicletes amb ajust de velocitat en temps real: aquest projecte utilitza un interruptor magnètic de canya per crear un velocímetre i controlar la velocitat del vídeo dels vídeos en bicicleta en primera persona a YouTube o altres suports. L'Arduino calcula els mph i, a continuació, utilitza aquesta informació per simular una pulsació de botó de l'ordinador
Temporitzador Arduino amb punt d’ajust activat / desactivat: 6 passos (amb imatges)
Temporitzador Arduino amb punt d’ajust activat / desactivat: editat el 02-02-2018 nous temporitzadors. hores, minuts, segons, eeprom. Visiteu: https: //www.instructables.com/id/Arduino-Ultra-Meg … Hola, amb aquest projecte podreu controlar l’encesa i l’apagada dels vostres dispositius entre el temps que vulgueu. Poden ser t
Converteix l'ajust de llum a un clúster de LED: 7 passos (amb imatges)
Converteix l'aparell de llum a un clúster de LED: tinc una llum antiga preciosa a la part frontal de casa meva, però la bombeta que hi ha és força tènue. És un fluorescent que equival a un incandescent (filament) de 100w. També, sobretot per un defecte de disseny de l’equipament, fa ombra a la dreta quan
Mods útils per a la banda de rodament Leatherman (millor ajust, afegir bits, convertir un controlador de femella): 14 passos (amb imatges)
Mods útils per a la banda de rodament Leatherman (millor ajust, afegir bits, convertidor de control de femella): aquest instuctible supera les 3 modificacions de la Leatherman TreadModification # 1: obtenir un millor ajustament al canell Modificació # 2: utilitzar la banda de rodament com a portador de bits i DriverModification # 3 - Convertir un controlador de femelles a una mida més petita