Indholdsfortegnelse:

Kender du til ESP32 ADC -justering ?: 29 trin
Kender du til ESP32 ADC -justering ?: 29 trin

Video: Kender du til ESP32 ADC -justering ?: 29 trin

Video: Kender du til ESP32 ADC -justering ?: 29 trin
Video: Nơi hạnh phúc nhất trên thế giới này #remind #livestreaming #remindtv #stream #remindtv 2024, Juli
Anonim
Image
Image
Ressourcer brugt
Ressourcer brugt

I dag vil jeg tale om et mere teknisk problem, men et, jeg synes, at alle, der arbejder med ESP32, burde vide: spørgsmålet om ADC (analog-til-digital-omformer) læsejustering. Jeg finder dette vigtigt, fordi når du foretager en "måling", især med et instrument, der har en analog udgang, skal du være helt sikker på, at aflæsningen udføres korrekt.

I videoen i dag vil vi derfor udføre målinger ved hjælp af "analog-digital konverter" i ESP32, observere konverteringsafvigelser og anvende en ADC-justerings- / kalibreringsmetode.

Trin 1: Hvad er en AD -konverter?

En AD -konverter er et kredsløb, der er i stand til at oversætte en analog (kontinuerlig) mængde til digitale (diskrete) værdier. Hvad betyder det? Det betyder, at selvom digitale værdier kun kan antage diskrete værdier dannet ved kombinationen af nuller og ener, kan en analog mængde antage enhver værdi inden for et område. For eksempel, hvis vi målte spændingen i en ideel AA -celle, kunne vi finde en værdi mellem 0V og 1,5V, da dette er en analog mængde. Udgangstilstanden for en ideel lampe må kun antage to tilstande (slukket eller tændt), hvilket er en diskret størrelse. Da mikrokontrollere arbejder ved hjælp af denne diskrete logik, har vi brug for et kredsløb, der er i stand til at oversætte en analog mængde til digital (eller diskret).

Trin 2: Brugte ressourcer

• Et Lolin32 Lite -kort v1.0.0

• Et Tektronix TDS1001C -oscilloskop til optagelse

• Et USB -kabel til ESP32

• Et Hantek DSO4102C -oscilloskop som signalgenerator

Trin 3: ESP32 ADC

ESP32 ADC
ESP32 ADC

Ifølge Espressif-data kan ESP32-chips vise en +/- 6% forskel fra en chip til en anden i de målte resultater.

Derudover har konverteringen IKKE et lineært svar for hvert tilgængeligt område til læsning. Espressif giver en metode til kalibrering og foreslår, at brugerne implementerer andre metoder, hvis de finder det nødvendigt for at opnå den ønskede nøjagtighed.

Vi vil udføre en dataindsamling, og ud fra dette vil vi vise ADC -svarene og et eksempel på at anvende en matematisk proces til at læse justeringen.

Der er flere (enklere eller mere komplekse) måder at udføre disse rettelser på. Det er op til dig at vurdere den mest passende til dit projekt.

Den her viste vil have et illustrativt formål og forsøge at adressere interessante punkter, der kan observeres under justeringer.

Trin 4: Kredsløb brugt

Kredsløb brugt
Kredsløb brugt

Jeg brugte et oscilloskop med en signalgenerator, der går op til 25 MHz, Hantek DSO4102C. Vi genererede en bølge, der blev læst af ESP A / D og oscilloskopet. De indsamlede data blev registreret i csv og i et regneark, som jeg vil efterlade i slutningen af artiklen til download.

Trin 5: Skilt brugt

Skilt brugt
Skilt brugt

Vi valgte et lavfrekvent trapezformet signal, som giver adgang til ramperne, der løber gennem hele konverteringsområdet. Dette giver mulighed for et stort antal prøver på disse ramper.

Trin 6: Data opnået af oscilloskopet

Data opnået af oscilloskopet
Data opnået af oscilloskopet

Billedet af optagelsen blev udført af oscilloskopet. Dataene blev gemt i en csv -fil. Bemærk den lille krumning på signalets stigende og faldende ramper.

Trin 7: Data opnået af oscilloskopet (csv -fil i Excel)

Data opnået af oscilloskopet (csv -fil i Excel)
Data opnået af oscilloskopet (csv -fil i Excel)

Vi har prøverne her.

Trin 8: Data opnået af ADC

Data indhentet af ADC
Data indhentet af ADC

Ved at ændre overførselshastigheden for føljetonen kan vi se de data, der er indfanget af ADC. Observer deformationen af det trapezformede signal.

Data observeret på Arduino IDE seriel plotter

Trin 9: Data opnået af ADC - Excel

Data opnået af ADC - Excel
Data opnået af ADC - Excel

Ved hjælp af en højere hastighed og den serielle terminal kan vi fange værdierne og anvende dem i Excel til vores sammenligninger.

Trin 10: Sammenligning af stigningsramper

Sammenligning af stigningsramper
Sammenligning af stigningsramper

Vi sammenligner de to klatreramper på de to fangster.

Bemærk krumningen, der opstår på begge ramper.

Bemærk også, at for den samme rampe har vi mange flere prøver af ESP32 end fra oscilloskopet.

Trin 11: Ligning af antallet af prøver

Ligning af antallet af prøver
Ligning af antallet af prøver
Ligning af antallet af prøver
Ligning af antallet af prøver

Fordi ESP32 leverede et større antal prøver end oscilloskopet, er vi nødt til at sidestille disse værdier, da de vil tjene som et indeks for at sammenligne de to kurver.

Til dette vil vi foretage en direkte sammenligning.

Vi har 305 prøver til oscilloskoprampen og 2365 prøver til ADC -rampen.

Da ramperne er af samme område, kan vi sige, at vi har cirka 7,75 prøver af ADC for hvert oscilloskop.

Multiplikation af indekset for hver oscilloskopprøve har den samme kurve, men med indeks svarende til ADC og de omfordelte data.

For at udfylde de manglende data for de nye positioner anvender vi en kurve, der statistisk passer til de kendte data.

Trin 12: Udfyldning af huller - trendlinje

Udfyldning af hullerne - Trend Line
Udfyldning af hullerne - Trend Line
Udfyldning af hullerne - Trend Line
Udfyldning af hullerne - Trend Line

Ved at vælge de kendte data (blå prikker), ved at klikke og derefter klikke med den højre knap, vælger vi: "Tilføj trendlinje …"

I det vindue, der vises, vælger vi den polynomiske type (rækkefølge 2 er nok).

Vi tjekkede også indstillingerne "Vis ligning i diagrammet" og "Vis værdi i R-kvadrat i diagrammet".

Vi klikker på "Luk".

Trin 13: Udfyldning af hullerne - grad 2 polynomkurve

Udfyldning af hullerne - polynomisk kurve af grad 2
Udfyldning af hullerne - polynomisk kurve af grad 2

Excel giver os to nye oplysninger; andenordensligningen, der bedst passer til dataene, og R-kvadratligningen, der kvantificerer denne tilstrækkelighed.

Husk bare, at jo tættere på 1, jo mere passende er ligningen.

Lad os ikke fordybe os i den involverede matematik, lad os bare bruge det som et værktøj.

Trin 14: Udfyldning af hullerne - Evaluering af funktionen

Lad os udfylde prøveudtagningsgabet med data genereret af ligningen. Og sammenlign dem derefter punkt for punkt.

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

R² = 0, 9999

Oscilloskopspænding = -9E -08 * indeks2 + 0, 0014 * indeks + 0, 1505

Trin 15: Konvertering af oscilloskopspændingen til en ækvivalent værdi til sammenligning med ADC

Konvertering af oscilloskopspændingen til en ækvivalent værdi til sammenligning med ADC
Konvertering af oscilloskopspændingen til en ækvivalent værdi til sammenligning med ADC

Lad os drage fordel af dette for også at omdanne værdien af oscilloskopspændingen til en ækvivalent ADC -værdi.

Da den højeste værdi opnået i ADP for ESP32 var 4095, hvilket svarer til aflæsningen på 2,958V for det samme indeks, kan vi sige, at:

Hver volt i målingerne af oscilloskopet svarer til cirka 1384,4 enheder af AD. Derfor kan vi gange alle målinger af oscilloskopet med denne værdi.

Trin 16: Sammenligning af de opnåede to ramper

Sammenligning af de opnåede to ramper
Sammenligning af de opnåede to ramper

Visualisering af de forskelle, der opnås i de to aflæsninger.

Trin 17: ADC -læseforskels adfærd (ERROR)

ADC -læseforskels adfærd (ERROR)
ADC -læseforskels adfærd (ERROR)

Kurven herunder viser, hvordan forskellen i ADC -aflæsningen opfører sig som en funktion af målingen. Denne indsamling af data giver os mulighed for at finde en korrektionsfunktion.

For at finde denne kurve plotter vi simpelthen forskellen i hvert mål som en funktion af hver mulig AD -position (0 til 4095).

Trin 18: ADC -læseforskeladfærd - Find en korrektionsfunktion

ADC -læseforskeladfærd - Find en korrektionsfunktion
ADC -læseforskeladfærd - Find en korrektionsfunktion

Vi kan bestemme en korrektionsfunktion i Excel ved at tilføje en trendlinje, nu i højere grad, indtil den passer tilstrækkeligt med vores data.

Trin 19: Brug af anden software

Brug af anden software
Brug af anden software
Brug af anden software
Brug af anden software
Brug af anden software
Brug af anden software
Brug af anden software
Brug af anden software

Anden interessant software til bestemmelse af kurver er PolySolve, som kan bruges direkte på linket: https://arachnoid.com/polysolve/ eller downloades som et Java -program.

Det tillader anvendelse af højere grad polynomiske regressioner og levering af den formaterede funktion samt andre funktionaliteter.

For at bruge det skal du blot indtaste dataene i det første tekstfelt. Dataene skal følge rækkefølgen X, Y adskilt med et komma eller fane. Vær forsigtig ved at bruge prikken korrekt som et decimalpunkt.

Et diagram vises i den næste boks, hvis de indtastede data er korrekt formateret.

Sådan gik vores ADC -fejlkurve.

Dette vindue viser resultatet af regressionen, herunder funktionsdækningsdata, som igen kan have sit output formateret på flere måder: som en C / C ++ - funktion, en liste over koefficienter, en funktion skrevet i Java osv.

Bemærk: Vær opmærksom på decimalseparatorer

Trin 20: Konstanter og opsætning ()

Jeg påpeger her den GPIO, der bruges til analog optagelse. Jeg initialiserer den serielle port, samt nålen bestemt til analog optagelse.

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

Trin 21: Loop () og korrektionsfunktionen

Vi registrerer den justerede spænding, og vi udskriver værdierne med eller uden de korrekte korrektioner.

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ínimo de 0}

Bemærk i linje 12, at vi har mulighed for at udskrive dataene med tilføjelse af differensfunktionen f (analog_værdi).

Trin 22: Brug af PolySolve Correction -funktionen

Her bruger vi PolySolve -funktionen inde i Arduino IDE.

/* Tilstand: normal polynomgrad 6, 2365 x, y datapar Korrelationskoefficient (r^2) = 9, 907187626418e-01 Standardfejl = 1, 353761109831e+01 Outputform: C/C ++-funktion: Copyright © 2012, P. Lutus - https://www.arachnoid.com. Alle rettigheder forbeholdes. */ dobbelt f (dobbelt x) {return 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); }

Bemærk komma-for-prik ændringen som decimalseparatoren.

Trin 23: Capture With Correction - Plotter Serial

Capture With Correction - Plotter Serial
Capture With Correction - Plotter Serial

Trin 24: Beregningsomkostninger

Beregningsomkostninger
Beregningsomkostninger
Beregningsomkostninger
Beregningsomkostninger

For at udføre polynomberegninger er det nødvendigt, at processoren håndterer denne opgave. Dette kan føre til forsinkelser i udførelsen, afhængigt af kildekoden og tilgængelig computerkraft.

Her ser vi en resultattabel af en test ved hjælp af flergradige polynomer. Bemærk forskellen mellem de tidspunkter, hvor pow () -funktionen blev brugt, og når den ikke var det.

Trin 25: Testkode - Opsætning () og Loop Start ()

Her har vi koden brugt i vores test.

ugyldig opsætning () {Serial.begin (1000000); // Iniciando a porta serial somente para debug} void loop () {float valor_analogico = 500.0; // um valor arbtrario float quantidade = 10000.0; // quantidade de chamadas float contador = 0,0; // contador de chamadas

Trin 26: Testkode - Loop () og behandling

Jeg brugte funktionen micros () til at få værdien i mikrosekunder.

// ============== inicia o processo float agora = micros (); // marca o instante inicial while (contador <quantidade) {// 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

Trin 27: Testkode - Loop () - Resultater

Vi udskriver den værdi, der returneres fra karakter 13 -funktionen med og uden POW til sammenligning, samt behandlingsintervallet.

// 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 função POW Serial.print (" -"); // imprime o intervalo do processamento Serial.println (agora, 6); }

Trin 28: Testkode - brugte funktioner

Tomme funktioner (kun med retur) af grad 0 og 1.

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

Grade 2, 3 og 4 funktioner.

// FUNÇÃO DE GRAU 2dobbelt f2 (dobbelt x) {return 2.202196968876e + 02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow (x, 2); } // FUNÇÃO DE GRAU 3 dobbelt f3 (dobbelt x) {return 2.202196968876e + 02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow (x, 2) + -3.470360275448e-07 * pow (x, 3); } // FUNÇÃO DE GRAU 4 dobbelt f4 (dobbelt x) {return 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); }

Grade 5 og 6 funktioner.

// FUNÇÃO DE GRAU 5dobbelt f5 (dobbelt x) {retur 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 dobbelt f6 (dobbelt x) {return 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); }

Grade 13 funktion ved hjælp af POW.

// FUNÇÃO DE GRAU 13 USANDO O POWdobbelt f13_comPow (dobbelt 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); }

Grade 13 funktion uden brug af POW.

// FUNÇÃO DE GRAU SEM USAR O POWdobbelt f13_semPow (dobbelt 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; }

Trin 29: Filer

Download filerne:

PDF

INO

Regneark

Anbefalede: