Inhoudsopgave:

Kent u de ESP32 ADC-aanpassing? - Ajarnpa
Kent u de ESP32 ADC-aanpassing? - Ajarnpa

Video: Kent u de ESP32 ADC-aanpassing? - Ajarnpa

Video: Kent u de ESP32 ADC-aanpassing? - Ajarnpa
Video: How to use MicroPython on Your Arduino? 2024, Juli-
Anonim
Image
Image
Gebruikte bronnen
Gebruikte bronnen

Vandaag ga ik het hebben over een meer technisch probleem, maar ik denk dat iedereen die met ESP32 werkt, moet weten: het probleem van ADC (analoog-naar-digitaal converter) leesaanpassing. Ik vind dit belangrijk omdat je bij het doen van een "meting", vooral met een instrument met een analoge uitgang, absoluut zeker moet zijn dat de meting correct wordt uitgevoerd.

In de video van vandaag zullen we daarom metingen uitvoeren met behulp van de "analoog-digitaalomzetter" van de ESP32, de conversieverschillen observeren en een ADC-aanpassing / kalibratiemethode toepassen.

Stap 1: Wat is een AD-converter?

Een AD-converter is een circuit dat in staat is om een analoge (continue) hoeveelheid om te zetten in digitale (discrete) waarden. Wat betekent dat? Het betekent dat terwijl digitale waarden alleen discrete waarden kunnen aannemen die worden gevormd door de combinatie van nullen en enen, een analoge hoeveelheid elke waarde binnen een bereik kan aannemen. Als we bijvoorbeeld de spanning van een ideale AA-cel zouden meten, zouden we elke waarde tussen 0V en 1,5V kunnen vinden, aangezien dit een analoge grootheid is. De uitgangstoestand van een ideale lamp mag slechts twee toestanden aannemen (uit of aan), wat een discrete grootte is. Omdat microcontrollers werken met deze discrete logica, hebben we een circuit nodig dat in staat is om een analoge hoeveelheid om te zetten in digitaal (of discreet).

Stap 2: Gebruikte bronnen

• Eén Lolin32 Lite-kaart v1.0.0

• Een Tektronix TDS1001C-oscilloscoop voor het vastleggen

• Eén USB-kabel voor de ESP32

• Een Hantek DSO4102C oscilloscoop als signaalgenerator

Stap 3: ESP32 ADC

ESP32 ADC
ESP32 ADC

Volgens gegevens van Espressif kunnen de ESP32-chips een verschil van +/- 6% van de ene chip tot de andere vertonen in de meetresultaten.

Bovendien heeft de conversie GEEN lineair antwoord voor elk beschikbaar leesbereik. Espressif biedt een methode voor kalibratie en stelt voor dat gebruikers andere methoden toepassen als ze dit nodig achten om de gewenste nauwkeurigheid te bereiken.

We zullen een data-acquisitie uitvoeren en hiervan zullen we de ADC-reacties en een voorbeeld van het toepassen van een wiskundig proces om de aanpassing te lezen, laten zien.

Er zijn verschillende (eenvoudigere of complexere) manieren om deze reparaties uit te voeren. Het is aan u om de meest geschikte voor uw project te evalueren.

De hier getoonde zal een illustratief doel hebben en proberen interessante punten aan te pakken die tijdens aanpassingen kunnen worden waargenomen.

Stap 4: Circuit gebruikt

Circuit gebruikt
Circuit gebruikt

Ik gebruikte een oscilloscoop met een signaalgenerator die tot 25 MHz gaat, de Hantek DSO4102C. We genereerden een golf die werd uitgelezen door de ESP A/D en de oscilloscoop. De verzamelde gegevens zijn vastgelegd in csv en in een spreadsheet, die ik aan het einde van het artikel zal achterlaten om te downloaden.

Stap 5: Teken gebruikt

Teken gebruikt
Teken gebruikt

We kozen voor een laagfrequent trapeziumvormig signaal dat toegang geeft tot de hellingen die door het hele conversiebereik lopen. Dit zorgt voor een groot aantal monsters op deze hellingen.

Stap 6: Gegevens verkregen door de oscilloscoop

Gegevens verkregen door de oscilloscoop
Gegevens verkregen door de oscilloscoop

Het beeld van de vangst werd uitgevoerd door de oscilloscoop. De gegevens zijn opgeslagen in een csv-bestand. Let op de lichte kromming op de stijgende en dalende hellingen van het signaal.

Stap 7: Gegevens verkregen door de oscilloscoop (csv-bestand in Excel)

Gegevens verkregen door de oscilloscoop (csv-bestand in Excel)
Gegevens verkregen door de oscilloscoop (csv-bestand in Excel)

We hebben de monsters hier.

Stap 8: Gegevens verkregen door de ADC

Gegevens verkregen door de ADC
Gegevens verkregen door de ADC

Door de overdrachtssnelheid van de serie te wijzigen, kunnen we de gegevens bekijken die door de ADC zijn vastgelegd. Let op de vervorming van het trapeziumvormige signaal.

Gegevens waargenomen op Arduino IDE seriële plotter

Stap 9: Gegevens verkregen door ADC - Excel

Gegevens verkregen door ADC - Excel
Gegevens verkregen door ADC - Excel

Met behulp van een hogere snelheid en de seriële terminal kunnen we de waarden vastleggen en in Excel toepassen voor onze vergelijkingen.

Stap 10: Vergelijking van klimhellingen

Vergelijking van klimhellingen
Vergelijking van klimhellingen

We vergelijken de twee klimhellingen van de twee vangsten.

Let op de kromming die op beide hellingen optreedt.

Merk ook op dat we voor dezelfde helling veel meer voorbeelden van de ESP32 hebben dan van de oscilloscoop.

Stap 11: Het aantal monsters gelijkstellen

Het aantal monsters gelijkstellen
Het aantal monsters gelijkstellen
Het aantal monsters gelijkstellen
Het aantal monsters gelijkstellen

Omdat de ESP32 een groter aantal monsters opleverde dan de oscilloscoop, moeten we deze waarden gelijkstellen, omdat ze als index zullen dienen om de twee curven te vergelijken.

Hiervoor maken we een directe vergelijking.

We hebben 305 samples voor de oscilloscoophelling en 2365 samples voor de ADC-helling.

Omdat de hellingen van hetzelfde bereik zijn, kunnen we zeggen dat we ongeveer 7,75 monsters van de ADC voor elke oscilloscoop hebben.

Het vermenigvuldigen van de index van elk oscilloscoopmonster heeft dezelfde curve, maar met indices die gelijk zijn aan de ADC en de herverdeelde gegevens.

Om de ontbrekende gegevens voor de nieuwe posities in te vullen, passen we een curve toe die statistisch past bij de bekende gegevens.

Stap 12: De hiaten opvullen - Trendlijn

De hiaten opvullen - Trendlijn
De hiaten opvullen - Trendlijn
De hiaten opvullen - Trendlijn
De hiaten opvullen - Trendlijn

Door de bekende gegevens (blauwe stippen) te selecteren, door te klikken en vervolgens met de rechterknop te klikken, selecteren we: "Trendlijn toevoegen …"

In het venster dat verschijnt, selecteren we het type Polynoom (volgorde 2 is voldoende).

We hebben ook de opties "Bekijk vergelijking in de grafiek" en "R-kwadraatwaarde weergeven in de grafiek" aangevinkt.

Wij klikken op "Sluiten".

Stap 13: De hiaten opvullen - Graad 2 polynoomcurve

De hiaten opvullen - graad 2 polynoomcurve
De hiaten opvullen - graad 2 polynoomcurve

Excel geeft ons twee nieuwe stukjes informatie; de vergelijking van de tweede orde die het beste bij de gegevens past, en de R-kwadraatvergelijking die deze geschiktheid kwantificeert.

Onthoud dat hoe dichter bij 1, hoe passender de vergelijking is.

Laten we niet ingaan op de wiskunde, laten we het gewoon als hulpmiddel gebruiken.

Stap 14: De hiaten opvullen - de functie evalueren

Laten we de steekproeven vullen met de gegevens die door de vergelijking worden gegenereerd. En vergelijk ze dan punt voor punt.

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

R² = 0, 9999

Oscilloscoopspanning = -9E-08 * index2 + 0, 0014 * index + 0, 1505

Stap 15: De oscilloscoopspanning converteren naar een equivalente waarde om te vergelijken met de ADC

De oscilloscoopspanning converteren naar een equivalente waarde om te vergelijken met de ADC
De oscilloscoopspanning converteren naar een equivalente waarde om te vergelijken met de ADC

Laten we hiervan profiteren om ook de waarde van de oscilloscoopspanning om te zetten in een equivalente ADC-waarde.

Aangezien de hoogste waarde verkregen in de ADP van de ESP32 4095 was, wat overeenkomt met de uitlezing van 2,958V voor dezelfde index, kunnen we zeggen dat:

Elke volt in de metingen van de oscilloscoop is gelijk aan ongeveer 1384,4 eenheden van de AD. Daarom kunnen we alle metingen van de oscilloscoop met deze waarde vermenigvuldigen.

Stap 16: De twee verkregen hellingen vergelijken

De twee verkregen hellingen vergelijken
De twee verkregen hellingen vergelijken

Het visualiseren van de verschillen die zijn verkregen in de twee metingen.

Stap 17: Gedrag van het ADC-leesverschil (ERROR)

Gedrag van het ADC-leesverschil (ERROR)
Gedrag van het ADC-leesverschil (ERROR)

De onderstaande curve laat zien hoe het verschil in de ADC-uitlezing zich gedraagt als een functie van de meting. Deze verzameling van gegevens stelt ons in staat om een correctiefunctie te vinden.

Om deze curve te vinden, plotten we eenvoudig het gevonden verschil in elke maat als een functie van elke mogelijke AD-positie (0 tot 4095).

Stap 18: ADC-verschilgedrag lezen - Een correctiefunctie vinden

ADC Verschilgedrag lezen - Een correctiefunctie vinden
ADC Verschilgedrag lezen - Een correctiefunctie vinden

We kunnen in Excel een correctiefunctie bepalen door een Trendlijn toe te voegen, nu van een hogere graad, totdat deze voldoende bij onze gegevens past.

Stap 19: Andere software gebruiken

Andere software gebruiken
Andere software gebruiken
Andere software gebruiken
Andere software gebruiken
Andere software gebruiken
Andere software gebruiken
Andere software gebruiken
Andere software gebruiken

Andere interessante software voor het bepalen van curven is PolySolve, die direct kan worden gebruikt via de link: https://arachnoid.com/polysolve/ of kan worden gedownload als Java-toepassing.

Het maakt de toepassing van polynomiale regressies van hogere graad en het leveren van de geformatteerde functie mogelijk, evenals andere functionaliteiten.

Om het te gebruiken, voert u eenvoudig de gegevens in het eerste tekstvak in. De gegevens moeten de volgorde X, Y volgen, gescheiden door een komma of tab. Wees voorzichtig bij het correct gebruiken van de punt als decimaalteken.

Er verschijnt een grafiek in het volgende vak als de ingevoerde gegevens correct zijn opgemaakt.

Dit is hoe onze ADC-foutcurve verliep.

Dit venster geeft het resultaat van de regressie weer, inclusief gegevens over functiegeschiktheid, waarvan de uitvoer op verschillende manieren kan worden geformatteerd: als een C / C ++ -functie, een lijst met coëfficiënten, een functie geschreven in Java, enz.

Opmerking: let op de decimale scheidingstekens

Stap 20: Constanten en Setup ()

Ik wijs hier op de GPIO die wordt gebruikt voor analoge opname. Ik initialiseer de seriële poort, evenals de pin die is bepaald voor analoge opname.

const int pin_leitura = 36; //GPIO gebruikt voor het maken van een analyse void setup () {Serial.begin (1000000); //Iniciciando a porta serial somente para debug pinMode (pin_leitura, INPUT); //Pino utilizado para captura analógica }

Stap 21: Loop () en de correctiefunctie

We maken de opname van de ingestelde spanning, en we printen de waarden met of zonder de juiste correcties.

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 of valor máximo de 4095 Serial.print(", "); Serieel.println(0); //cria uma linha para marcar o valor minimo de 0}

Merk op in regel 12 dat we de mogelijkheid hebben om de gegevens af te drukken met de toevoeging van de verschilfunctie f (analoge_value).

Stap 22: De PolySolve-correctiefunctie gebruiken

Hier gebruiken we de PolySolve-functie in de Arduino IDE.

/* Modus: normaal Polynomiale graad 6, 2365 x, y gegevensparen Correlatiecoëfficiënt (r^2) = 9, 907187626418e-01 Standaardfout = 1, 353761109831e+01 Uitvoervorm: C/C++-functie: Copyright © 2012, P. Lutus -- https://www.arachnoid.com. Alle rechten voorbehouden. */ dubbele f(dubbele x) { return 2.22196968876e+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); }

Let op de komma-voor-punt verandering als decimaal scheidingsteken.

Stap 23: Vastleggen met correctie - Plotter serieel

Vastleggen met correctie - Plotter serieel
Vastleggen met correctie - Plotter serieel

Stap 24: rekenkosten

rekenkosten
rekenkosten
rekenkosten
rekenkosten

Om polynoomberekeningen uit te voeren, is het noodzakelijk dat de processor deze taak uitvoert. Dit kan leiden tot vertragingen in de uitvoering, afhankelijk van de broncode en beschikbare rekenkracht.

Hier zien we een resultatentabel van een test met polynomen van meerdere graden. Let op het verschil tussen de keren dat de functie pow () werd gebruikt en wanneer niet.

Stap 25: Testcode - Setup () en Loop Start ()

Hier hebben we de code die in onze test is gebruikt.

void setup() { Serial.begin(1000000); //Iniciando a porta serial somente para debug} void loop () { float valor_analogico = 500,0; //um valor arbtrario float quantidade = 10000.0; // quatidade de chamadas float contador = 0.0; //contador de chamadas

Stap 26: Testcode - Loop () en verwerking

Ik heb de functie micros () gebruikt om de waarde in microseconden te krijgen.

//============= 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 een função POW //f13_comPow(valor_analogico); //grau 13º COM een função POW contador++; } agora = (micros() - agora) / quantidade; //determina o intervalo que se passou para cada iteração //============= finaliza o processo

Stap 27: Testcode - Loop () - Resultaten

We printen de waarde die wordt geretourneerd door de functie graad 13 met en zonder POW ter vergelijking, evenals het verwerkingsinterval.

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

Stap 28: Testcode - Gebruikte functies

Lege functies (alleen met return) van graad 0 en 1.

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

Functies van graad 2, 3 en 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 dubbele f3(dubbele x) { return 2.22196968876e+02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow(x, 2) + -3.470360275448e-07 * pow(x, 3); } //FUNÇÃO DE GRAU 4 dubbele f4(dubbele x) { return 2.22196968876e+02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow(x, 2) + -3.470360275448e-07 * pow(x, 3) + 2.082790802069e-10 * pow(x, 4); }

Graad 5 en 6 functies.

//FUNÇÃO DE GRAU 5double f5(double 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); } //FUNÇÃO DE GRAU 6 dubbele f6(dubbele x) { return 2.22196968876e+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 functie met behulp van de POW.

//FUNÇÃO DE GRAU 13 USAANDO 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); }

Grade 13-functie zonder POW te gebruiken.

//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; }

Stap 29: Bestanden

Download de bestanden:

PDF

INO

Spreadsheet

Aanbevolen: