Kazalo:

Ali veste o nastavitvi ADC ESP32?: 29 korakov
Ali veste o nastavitvi ADC ESP32?: 29 korakov

Video: Ali veste o nastavitvi ADC ESP32?: 29 korakov

Video: Ali veste o nastavitvi ADC ESP32?: 29 korakov
Video: ESP32 Tutorial 22 - Feeling The light using LED Arduino | SunFounder's ESP32 IoT Learnig kit 2024, Julij
Anonim
Image
Image
Uporabljeni viri
Uporabljeni viri

Danes bom govoril o bolj tehničnem vprašanju, vendar mislim, da bi morali vsi, ki delajo z ESP32, vedeti: vprašanje prilagoditve branja ADC (analogno-digitalni pretvornik). To se mi zdi pomembno, ker morate biti pri "merjenju", še posebej z instrumentom, ki ima analogni izhod, popolnoma prepričani, da se branje izvaja pravilno.

V današnjem videu bomo zato izvajali meritve z uporabo "analogno-digitalnega pretvornika" ESP32, opazovali odstopanja pretvorbe in uporabili metodo prilagajanja / umerjanja ADC.

1. korak: Kaj je pretvornik AD?

AD pretvornik je vezje, ki lahko prevede analogno (neprekinjeno) količino v digitalne (diskretne) vrednosti. Kaj to pomeni? To pomeni, da lahko digitalne vrednosti prevzamejo samo diskretne vrednosti, ki nastanejo s kombinacijo nič in ena, vendar lahko analogna količina prevzame katero koli vrednost v območju. Če bi na primer izmerili napetost idealne celice AA, bi lahko našli katero koli vrednost med 0V in 1.5V, saj je to analogna količina. Izhodno stanje idealne svetilke mora prevzeti le dve stanji (izklopljeno ali vklopljeno), kar je diskretna velikost. Ker mikrokrmilniki delujejo po tej diskretni logiki, potrebujemo vezje, ki lahko prevede analogno količino v digitalno (ali diskretno).

2. korak: Uporabljeni viri

• Ena kartica Lolin32 Lite v1.0.0

• Osmoskop Tektronix TDS1001C za zajem

• En kabel USB za ESP32

• Hantek DSO4102C osciloskop kot generator signala

Korak: ESP32 ADC

ESP32 ADC
ESP32 ADC

Po podatkih Espressifa lahko čipi ESP32 v izmerjenih rezultatih predstavljajo +/- 6% razlike od enega do drugega čipa.

Poleg tega pretvorba NI linearna za vsak razpoložljiv obseg za branje. Espressif ponuja metodo za umerjanje in predlaga, da uporabniki izvajajo druge metode, če menijo, da je to potrebno za dosego želene natančnosti.

Izvedli bomo zajem podatkov, iz tega pa bomo prikazali odzive ADC in primer uporabe matematičnega procesa za branje prilagoditve.

Obstaja več (enostavnejših ali bolj zapletenih) načinov za izvedbo teh popravkov. Na vas je, da ocenite najprimernejše za vaš projekt.

Ta, ki je prikazan tukaj, bo imel ilustrativni namen in bo poskušal obravnavati zanimive točke, ki jih je mogoče opaziti med prilagoditvami.

4. korak: Uporabljeno vezje

Rabljeno vezje
Rabljeno vezje

Uporabil sem osciloskop z generatorjem signala do 25 MHz, Hantek DSO4102C. Ustvarili smo val, ki sta ga prebrala ESP A / D in osciloskop. Zbrani podatki so bili zabeleženi v csv in v preglednico, ki jo bom pustil na koncu članka za prenos.

5. korak: Uporabite znak

Uporabljen znak
Uporabljen znak

Izbrali smo nizkofrekvenčni trapezni signal, ki omogoča dostop do klančin, ki potekajo skozi celotno območje pretvorbe. To omogoča veliko število vzorcev na teh rampah.

6. korak: Podatki, pridobljeni z osciloskopom

Podatki, pridobljeni z osciloskopom
Podatki, pridobljeni z osciloskopom

Podobo zajema je izvedel osciloskop. Podatki so bili shranjeni v datoteki csv. Upoštevajte rahlo ukrivljenost na naraščajočih in padajočih rampah signala.

7. korak: Podatki, pridobljeni z osciloskopom (datoteka csv v Excelu)

Podatki, pridobljeni z osciloskopom (datoteka csv v Excelu)
Podatki, pridobljeni z osciloskopom (datoteka csv v Excelu)

Tu imamo vzorce.

8. korak: Podatki, pridobljeni s strani ADC

Podatki, ki jih pridobi ADC
Podatki, ki jih pridobi ADC

S spreminjanjem hitrosti prenosa zaporedja si lahko ogledamo podatke, ki jih zajame ADC. Opazujte deformacijo trapeznega signala.

Podatki, opaženi na serijskem ploterju Arduino IDE

9. korak: Podatki, pridobljeni s strani ADC - Excel

Podatki, pridobljeni s strani ADC - Excel
Podatki, pridobljeni s strani ADC - Excel

Z uporabo višje stopnje in serijskega terminala lahko zajamemo vrednosti in jih uporabimo v Excelu za naše primerjave.

10. korak: Primerjava klančin

Primerjava klančin
Primerjava klančin

Primerjamo dve plezalni rampi obeh ulovov.

Upoštevajte ukrivljenost, ki se pojavi na obeh rampah.

Upoštevajte tudi, da imamo za isto rampo veliko več vzorcev ESP32 kot iz osciloskopa.

11. korak: enačenje števila vzorcev

Enačenje števila vzorcev
Enačenje števila vzorcev
Enačenje števila vzorcev
Enačenje števila vzorcev

Ker je ESP32 zagotovil večje število vzorcev kot osciloskop, moramo te vrednosti izenačiti, saj bodo služile kot indeks za primerjavo obeh krivulj.

Za to bomo naredili neposredno primerjavo.

Imamo 305 vzorcev za rampo osciloskopa in 2365 vzorcev za rampo ADC.

Ker so rampe v istem območju, lahko rečemo, da imamo za vsak osciloskop približno 7,75 vzorcev ADC -ja.

Množenje indeksa vsakega vzorca osciloskopa ima isto krivuljo, vendar z indeksi, enakovrednimi ADC -ju in prerazporejenim podatkom.

Za zapolnitev manjkajočih podatkov za nove pozicije bomo uporabili krivuljo, ki statistično ustreza znanim podatkom.

12. korak: Zapolnitev vrzeli - linija trenda

Zapolnitev vrzeli - linija trenda
Zapolnitev vrzeli - linija trenda
Zapolnitev vrzeli - linija trenda
Zapolnitev vrzeli - linija trenda

Ko izberemo znane podatke (modre pike), s klikom in nato z desnim gumbom izberemo: "Dodaj linijo trenda …"

V oknu, ki se prikaže, izberemo vrsto polinoma (dovolj bo naročilo 2).

Preverili smo tudi možnosti »Prikaži enačbo v grafikonu« in »Prikaz vrednosti R-kvadrat v grafikonu«.

Kliknemo "Zapri".

Korak 13: Zapolnitev vrzeli - polinomska krivulja 2. stopnje

Zapolnitev vrzeli - polinomska krivulja 2. stopnje
Zapolnitev vrzeli - polinomska krivulja 2. stopnje

Excel nam daje dve novi informaciji; enačbo drugega reda, ki najbolje ustreza podatkom, in enačbo na kvadrat R, ki količinsko opredeli to ustreznost.

Samo zapomnite si, da je bližje enačbi primernejša enačba.

Ne poglabljajmo se v matematiko, ampak jo uporabimo kot orodje.

Korak 14: Zapolnitev vrzeli - vrednotenje funkcije

Zapolnimo vzorčne vrzeli s podatki, ki jih ustvari enačba. Nato jih primerjajte od točke do točke.

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

R² = 0, 9999

Napetost osciloskopa = -9E -08 * indeks2 + 0, 0014 * indeks + 0, 1505

Korak 15: Pretvorite napetost osciloskopa v enakovredno vrednost za primerjavo z ADC

Pretvarjanje napetosti osciloskopa v enakovredno vrednost za primerjavo z ADC
Pretvarjanje napetosti osciloskopa v enakovredno vrednost za primerjavo z ADC

Izkoristimo to za pretvorbo vrednosti napetosti osciloskopa v enakovredno vrednost ADC.

Ker je bila najvišja vrednost, pridobljena v ADP ESP32, 4095, kar je enako odčitku 2,958 V za isti indeks, lahko rečemo, da:

Vsak volt pri meritvah osciloskopa je približno 1384,4 enot AD. Zato lahko za to vrednost pomnožimo vse meritve osciloskopa.

Korak 16: Primerjava dveh pridobljenih klančin

Primerjava dveh pridobljenih klančin
Primerjava dveh pridobljenih klančin

Vizualizacija razlik, pridobljenih v dveh odčitkih.

17. korak: Obnašanje razlike pri branju ADC (ERROR)

Obnašanje bralne razlike ADC (ERROR)
Obnašanje bralne razlike ADC (ERROR)

Spodnja krivulja prikazuje, kako se razlika v odčitku ADC obnaša kot funkcija merjenja. To zbiranje podatkov nam bo omogočilo, da najdemo korekcijsko funkcijo.

Da bi našli to krivuljo, preprosto narišemo razliko, ki jo najdemo v vsaki meri, kot funkcijo vsakega možnega položaja AD (0 do 4095).

Korak 18: Različno vedenje pri branju ADC - iskanje popravne funkcije

Različno vedenje pri branju ADC - iskanje korekcijske funkcije
Različno vedenje pri branju ADC - iskanje korekcijske funkcije

V Excelu lahko določimo korekcijsko funkcijo tako, da dodamo linijo trenda, ki je zdaj višje stopnje, dokler se ne ujema dovolj z našimi podatki.

Korak 19: Uporaba druge programske opreme

Uporaba druge programske opreme
Uporaba druge programske opreme
Uporaba druge programske opreme
Uporaba druge programske opreme
Uporaba druge programske opreme
Uporaba druge programske opreme
Uporaba druge programske opreme
Uporaba druge programske opreme

Druga zanimiva programska oprema za določanje krivulj je PolySolve, ki jo lahko uporabite neposredno na povezavi: https://arachnoid.com/polysolve/ ali jo naložite kot aplikacijo Java.

Omogoča uporabo polinomskih regresij višje stopnje in podajanje oblikovane funkcije ter drugih funkcionalnosti.

Če ga želite uporabiti, preprosto vnesite podatke v prvo besedilno polje. Podatki morajo slediti vrstnemu redu X, Y, ločeni z vejico ali zavihkom. Pri pravilni uporabi pike kot decimalne vejice bodite previdni.

Če so vneseni podatki pravilno oblikovani, se v naslednjem polju prikaže grafikon.

Evo, kako je šla naša krivulja napak ADC.

To okno bo predstavilo rezultat regresije, vključno s podatki o ustreznosti funkcij, ki lahko nato oblikujejo svoj izhod na več načinov: kot funkcijo C / C ++, seznam koeficientov, funkcijo, napisano v Javi itd.

Opomba: Bodite pozorni na decimalna ločila

20. korak: Konstante in nastavitev ()

Tu poudarjam GPIO, ki se uporablja za analogno zajemanje. Inicializiram serijska vrata in pin, določen za analogno zajemanje.

const int pin_leitura = 36; // GPIO usado para captura analógica void setup () {Serial.begin (1000000); // Začetek porta serijske različice za odpravljanje napak pinMode (pin_leitura, INPUT); // Pino utilizado para captura analógica}

21. korak: Zanka () in korekcijska funkcija

Izvedemo zajem prilagojene napetosti in vrednosti natisnemo s pravilnimi popravki ali brez njih.

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}

Upoštevajte v vrstici 12, da imamo možnost tiskanja podatkov z dodajanjem funkcije razlike f (analogna_vrednost).

Korak: Uporaba korekcijske funkcije PolySolve

Tukaj uporabljamo funkcijo PolySolve znotraj Arduino IDE.

/* Način: normalno Polinomska stopnja 6, 2365 x, y podatkovni pari Korelacijski koeficient (r^2) = 9, 907187626418e-01 Standardna napaka = 1, 353761109831e+01 Izhodna oblika: funkcija C/C ++: Copyright © 2012, str. Lutus - https://www.arachnoid.com. Vse pravice pridržane. */ double f (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) + 4,787659214703e-18 * pow (x, 6); }

Zapomnite si spremembo vejice za piko kot decimalni ločilo.

23. korak: Zajem s popravkom - Serijski ploter

Zajem s popravkom - Serijski ploter
Zajem s popravkom - Serijski ploter

Korak: Računalniški stroški

Računski stroški
Računski stroški
Računski stroški
Računski stroški

Za izvajanje polinomskih izračunov mora procesor opraviti to nalogo. To lahko povzroči zamude pri izvajanju, odvisno od izvorne kode in razpoložljive računalniške moči.

Tu vidimo tabelo rezultatov testa z večstopenjskimi polinomi. Opazite razliko med časi, ko je bila funkcija pow () uporabljena, in ko ni.

Korak: Preskusna koda - Setup () in Loop Start ()

Tukaj imamo kodo, uporabljeno v našem testu.

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; // quantidade de chamadas fload contador = 0,0; // contador de chamadas

Korak 26: Preskusna koda - zanka () in obdelava

Uporabil sem funkcijo micros (), da sem dobil vrednost v mikrosekundah.

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

Korak 27: Preskusna koda - Zanka () - Rezultati

Natisnemo vrednost, vrnjeno iz funkcije razreda 13 z in brez POW za primerjavo, pa tudi interval obdelave.

// imprime o valor retornado da função de grau 13 com e sem POW za primerjavo Serial.print (f13_semPow (valor_analogico)); // grau 13º SEM in função POW Serial.print (" -"); Serial.print (f13_comPow (valor_analogico)); // grau 13º COM in funkcijski POW Serial.print (" -"); // imprime o intervalo do processamento Serial.println (agora, 6); }

Korak 28: Preskusna koda - uporabljene funkcije

Prazne funkcije (samo z vrnitvijo) stopnje 0 in 1.

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

Funkcije razreda 2, 3 in 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 double f3 (double 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 double f4 (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); }

Funkcije razreda 5 in 6.

// 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 double f6 (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) + 4,787659214703e-18 * pow (x, 6); }

Funkcija razreda 13 z uporabo 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); }

Funkcija razreda 13 brez uporabe 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 + 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; }

29. korak: Datoteke

Prenesite datoteke:

PDF

JAZ NE

Preglednica

Priporočena: