Inhoudsopgave:
- Stap 1: Wat is een AD-converter?
- Stap 2: Gebruikte bronnen
- Stap 3: ESP32 ADC
- Stap 4: Circuit gebruikt
- Stap 5: Teken gebruikt
- Stap 6: Gegevens verkregen door de oscilloscoop
- Stap 7: Gegevens verkregen door de oscilloscoop (csv-bestand in Excel)
- Stap 8: Gegevens verkregen door de ADC
- Stap 9: Gegevens verkregen door ADC - Excel
- Stap 10: Vergelijking van klimhellingen
- Stap 11: Het aantal monsters gelijkstellen
- Stap 12: De hiaten opvullen - Trendlijn
- Stap 13: De hiaten opvullen - Graad 2 polynoomcurve
- Stap 14: De hiaten opvullen - de functie evalueren
- Stap 15: De oscilloscoopspanning converteren naar een equivalente waarde om te vergelijken met de ADC
- Stap 16: De twee verkregen hellingen vergelijken
- Stap 17: Gedrag van het ADC-leesverschil (ERROR)
- Stap 18: ADC-verschilgedrag lezen - Een correctiefunctie vinden
- Stap 19: Andere software gebruiken
- Stap 20: Constanten en Setup ()
- Stap 21: Loop () en de correctiefunctie
- Stap 22: De PolySolve-correctiefunctie gebruiken
- Stap 23: Vastleggen met correctie - Plotter serieel
- Stap 24: rekenkosten
- Stap 25: Testcode - Setup () en Loop Start ()
- Stap 26: Testcode - Loop () en verwerking
- Stap 27: Testcode - Loop () - Resultaten
- Stap 28: Testcode - Gebruikte functies
- Stap 29: Bestanden
Video: Kent u de ESP32 ADC-aanpassing? - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:17
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
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
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
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
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)
We hebben de monsters hier.
Stap 8: 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
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
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
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
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
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
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
Het visualiseren van de verschillen die zijn verkregen in de twee metingen.
Stap 17: 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
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 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
Stap 24: 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:
INO
Spreadsheet
Aanbevolen:
Hoe ADC Current Sense te maken: 5 stappen
Hoe ADC Current Sense te maken: In deze Instructable zullen we beschrijven hoe een 8-bit analoog-naar-digitaal-omzetter (ADC) in de SLG46855V kan worden geïmplementeerd die laadstroom en interface met een MCU via I2C kan detecteren. Dit ontwerp kan worden gebruikt voor verschillende stroomdetectietoepassingen zoals
7-segment om ADC #Arduino-waarden, #Arduino weer te geven: 4 stappen
7-segment om ADC weer te geven #Arduino Values, #Arduino: In dit artikel zal ik een project maken dat nog steeds gerelateerd is aan het vorige artikel. Namelijk het verwerken van ADC-gegevens. U heeft dus geen seriële monitor nodig om de waarde van de adc-gegevens te zien. in dit artikel zal ik een ADC Value viewer-weergave maken. dus jij niet
ADC-waarden lezen van potentiometers: 4 stappen:
Lees ADC-waarden van potentiometers: In dit artikel laat ik u zien hoe u ADC-waarden van een potentiometer kunt lezen. Dit is de basis van Arduino-programmering. die analoge waarden leest met behulp van de analoge pin die door Arduino wordt geleverd. Naast het gebruik van de potentio, zijn er verschillende sensoren die
Aan de slag met ESP32 - ESP32-kaarten installeren in Arduino IDE - ESP32-knippercode: 3 stappen
Aan de slag met ESP32 | ESP32-kaarten installeren in Arduino IDE | ESP32-knippercode: in deze instructie zullen we zien hoe we met esp32 kunnen werken en hoe we esp32-kaarten in Arduino IDE kunnen installeren en we zullen esp 32 programmeren om knippercode uit te voeren met behulp van arduino ide
Arduino en de TI ADS1110 16-bit ADC: 6 stappen
Arduino en de TI ADS1110 16-bit ADC: In deze tutorial onderzoeken we hoe Arduino te gebruiken om te werken met de Texas Instruments ADS1110 - een ongelooflijk klein maar handig 16-bit analoog-naar-digitaal converter-IC. Het kan werken tussen 2,7 en 5,5 V, dus het is ook prima voor Arduino Due en andere lagere vol