Indholdsfortegnelse:
- Trin 1: Hvad er en AD -konverter?
- Trin 2: Brugte ressourcer
- Trin 3: ESP32 ADC
- Trin 4: Kredsløb brugt
- Trin 5: Skilt brugt
- Trin 6: Data opnået af oscilloskopet
- Trin 7: Data opnået af oscilloskopet (csv -fil i Excel)
- Trin 8: Data opnået af ADC
- Trin 9: Data opnået af ADC - Excel
- Trin 10: Sammenligning af stigningsramper
- Trin 11: Ligning af antallet af prøver
- Trin 12: Udfyldning af huller - trendlinje
- Trin 13: Udfyldning af hullerne - grad 2 polynomkurve
- Trin 14: Udfyldning af hullerne - Evaluering af funktionen
- Trin 15: Konvertering af oscilloskopspændingen til en ækvivalent værdi til sammenligning med ADC
- Trin 16: Sammenligning af de opnåede to ramper
- Trin 17: ADC -læseforskels adfærd (ERROR)
- Trin 18: ADC -læseforskeladfærd - Find en korrektionsfunktion
- Trin 19: Brug af anden software
- Trin 20: Konstanter og opsætning ()
- Trin 21: Loop () og korrektionsfunktionen
- Trin 22: Brug af PolySolve Correction -funktionen
- Trin 23: Capture With Correction - Plotter Serial
- Trin 24: Beregningsomkostninger
- Trin 25: Testkode - Opsætning () og Loop Start ()
- Trin 26: Testkode - Loop () og behandling
- Trin 27: Testkode - Loop () - Resultater
- Trin 28: Testkode - brugte funktioner
- Trin 29: Filer
Video: Kender du til ESP32 ADC -justering ?: 29 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:28
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
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
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
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
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)
Vi har prøverne her.
Trin 8: Data opnået 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
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
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
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
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
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
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
Visualisering af de forskelle, der opnås i de to aflæsninger.
Trin 17: 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
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
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
Trin 24: 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:
INO
Regneark
Anbefalede:
7-segment til visning af ADC #Arduino-værdier, #Arduino: 4 trin
7-segment til visning af ADC #Arduino-værdier, #Arduino: I denne artikel vil jeg lave et projekt, der stadig er relateret til den forrige artikel. Nemlig behandling af ADC -data. Så du behøver ikke en seriel skærm for at se værdien af ADC -dataene. i denne artikel vil jeg lave et ADC Value viewer -display. så du ikke
LoRa Messenger til to enheder til distancer Op til 8 km: 7 trin
LoRa Messenger til to enheder til afstande Op til 8 km: Tilslut projektet til din bærbare computer eller telefon, og chat derefter mellem enhederne uden internet eller SMS ved hjælp af bare LoRa.Hey, hvad sker der gutter? Akarsh her fra CETech. I dag skal vi lave et projekt, der kan forbindes til din smartphone eller en hvilken som helst
1A til 40A nuværende BOOST -konverter til op til 1000W DC -motor: 3 trin
1A til 40A Current BOOST-konverter til op til 1000W DC-motor: Hej! I denne video lærer du, hvordan du laver et strømforstærkerkredsløb til dine høj ampere DC-motorer op til 1000W og 40 ampere med transistorer og en center-tap-transformer. Selvom, strømmen ved udgangen er meget høj, men spændingen bliver r
Overbevis dig selv om bare at bruge en 12V-til-AC-line inverter til LED-lysstrenge i stedet for at genoprette dem til 12V .: 3 trin
Overbevis dig selv om bare at bruge en 12V-til-AC-line inverter til LED-lysstrenge i stedet for at genoprette dem til 12V .: Min plan var enkel. Jeg ville skære en væg-drevet LED-lysstreng i stykker og derefter genkoble den til at køre 12 volt. Alternativet var at bruge en strømomformer, men vi ved alle, at de er frygtelig ineffektive, ikke? Ret? Eller er de det?
12v til USB Adapter 12v til 5v Transformer (fantastisk til biler): 6 trin
12v til USB Adapter 12v til 5v Transformer (fantastisk til biler): Dette viser dig, hvordan du laver en 12v til USB (5v) adapter. Den mest oplagte anvendelse af dette er til 12v biladaptere, men hvor som helst du har 12v kan du bruge det! Hvis du har brug for 5v til andet end USB, skal du blot springe trinene om tilføjelse af USB -porte over