Talaan ng mga Nilalaman:

Alam Mo Tungkol sa Pagsasaayos ng ESP32 ADC ?: 29 Mga Hakbang
Alam Mo Tungkol sa Pagsasaayos ng ESP32 ADC ?: 29 Mga Hakbang

Video: Alam Mo Tungkol sa Pagsasaayos ng ESP32 ADC ?: 29 Mga Hakbang

Video: Alam Mo Tungkol sa Pagsasaayos ng ESP32 ADC ?: 29 Mga Hakbang
Video: LDmicro 12: платы Arduino без IDE (лестничное программирование ПЛК микроконтроллера с помощью LDmicro) 2024, Hulyo
Anonim
Image
Image
Ginamit na Mga Mapagkukunan
Ginamit na Mga Mapagkukunan

Ngayon, pag-uusapan ko ang tungkol sa isang mas teknikal na isyu, ngunit sa palagay ko dapat alam ng lahat na gumagana sa ESP32: ang isyu ng ADC (analog-to-digital converter) na basahin ang pagsasaayos. Mahahanap ko ito na mahalaga sapagkat kapag gumagawa ng isang "pagsukat," lalo na sa isang instrumento na mayroong isang analog output, kailangan mong tiyakin na ang pagbasa ay ginanap nang tama.

Samakatuwid, sa video ngayon, magsasagawa kami ng mga sukat gamit ang "analog-digital converter" ng ESP32, obserbahan ang mga pagkakaiba sa conversion, at maglalapat ng pamamaraan ng pagsasaayos / pagkakalibrate ng ADC.

Hakbang 1: Ano ang isang AD Converter?

Ang isang AD converter ay isang circuit na may kakayahang isalin ang isang analog (tuloy-tuloy) na dami sa mga halagang digital (discrete). Anong ibig sabihin niyan? Nangangahulugan ito na habang ang mga digital na halaga ay maaari lamang ipalagay ang mga discrete na halaga na nabuo sa pamamagitan ng pagsasama ng mga zero at isa, ang isang analog na dami ay maaaring ipalagay ang anumang halaga sa loob ng isang saklaw. Halimbawa, kung sinusukat namin ang boltahe ng isang perpektong cell ng AA, maaari kaming makahanap ng anumang halaga sa pagitan ng 0V at 1.5V, dahil ito ang dami ng analog. Ang estado ng output ng isang perpektong ilawan ay dapat na ipalagay lamang dalawang mga estado (off o sa), na kung saan ay isang discrete magnitude. Dahil gumagana ang mga microcontroller gamit ang discrete logic na ito, kailangan namin ng isang circuit na may kakayahang isalin ang isang analog na dami sa digital (o discrete).

Hakbang 2: Ginamit na Mga Mapagkukunan

• Isang Lolin32 Lite card v1.0.0

• Isang Tektronix TDS1001C oscilloscope para sa pagkuha

• Isang USB cable para sa ESP32

• Isang Hantek DSO4102C oscilloscope bilang isang generator ng signal

Hakbang 3: ESP32 ADC

ESP32 ADC
ESP32 ADC

Ayon sa data ng Espressif, ang mga chips ng ESP32 ay maaaring magpakita ng isang pagkakaiba +/- 6% mula sa isang maliit na tilad patungo sa isa pa sa sinusukat na mga resulta.

Bilang karagdagan, ang conversion ay HINDI may isang linear na sagot para sa bawat magagamit na saklaw para sa pagbabasa. Nagbibigay ang Espressif ng isang paraan para sa pagkakalibrate at nagmumungkahi na magpatupad ang mga gumagamit ng iba pang mga pamamaraan kung sa palagay nila kinakailangan upang makamit ang nais na kawastuhan.

Gagawa kami ng isang acquisition ng data, at mula rito, ipapakita namin ang mga tugon sa ADC at isang halimbawa ng paglalapat ng proseso ng matematika upang mabasa ang pagsasaayos.

Mayroong maraming (mas simple o mas kumplikadong) mga paraan upang magawa ang mga pag-aayos na ito. Nasa sa iyo ang suriin ang pinakaangkop para sa iyong proyekto.

Ang isang ipinakita dito ay magkakaroon ng isang nakalarawang layunin at subukang tugunan ang mga kagiliw-giliw na puntong maaaring makita sa mga pagsasaayos.

Hakbang 4: Ginamit ang Circuit

Ginamit na Circuit
Ginamit na Circuit

Gumamit ako ng isang oscilloscope na may signal generator na hanggang 25 MHz, ang Hantek DSO4102C. Lumikha kami ng isang alon na nabasa ng ESP A / D at ng oscilloscope. Ang nakalap na data ay naitala sa csv at sa isang spreadsheet, na iiwan ko sa dulo ng artikulo para ma-download.

Hakbang 5: Ginamit na Pag-sign

Ginamit na Pag-sign
Ginamit na Pag-sign

Pinili namin ang isang mababang-dalas na signal ng trapezoidal na nagbibigay-daan sa pag-access sa mga rampa na tumatakbo sa buong saklaw ng conversion. Pinapayagan nito ang isang malaking bilang ng mga sample sa mga rampa na ito.

Hakbang 6: Nakuha ang Data ng Oscilloscope

Data na Nakuha ng Oscilloscope
Data na Nakuha ng Oscilloscope

Ang imahe ng pagkuha ay ginanap ng oscilloscope. Ang data ay naimbak sa isang csv file. Tandaan ang bahagyang kurbada sa tumataas at bumabagsak na mga rampa ng signal.

Hakbang 7: Nakuha ang Data ng Oscilloscope (csv File sa Excel)

Data na Nakuha ng Oscilloscope (csv File sa Excel)
Data na Nakuha ng Oscilloscope (csv File sa Excel)

Mayroon kaming mga sampling dito.

Hakbang 8: Nakuha ang Data ng ADC

Data na Nakuha ng ADC
Data na Nakuha ng ADC

Sa pamamagitan ng pagbabago ng rate ng paglipat ng serial, maaari nating tingnan ang data na nakuha ng ADC. Pagmasdan ang pagpapapangit ng signal ng trapezoidal.

Ang data na sinusunod sa serial plotter ng Arduino IDE

Hakbang 9: Nakuha ang Data ng ADC - Excel

Data na Nakuha ng ADC - Excel
Data na Nakuha ng ADC - Excel

Gamit ang isang mas mataas na rate at ang serial terminal, maaari naming makuha ang mga halaga at ilapat ang mga ito sa Excel para sa aming mga paghahambing.

Hakbang 10: Paghahambing sa Mga Rampa ng Pag-akyat

Paghahambing ng Climb Ramp
Paghahambing ng Climb Ramp

Pinaghahambing namin ang dalawang pag-akyat sa mga ramp ng dalawang catch.

Tandaan ang curvature na nangyayari sa parehong rampa.

Tandaan din na para sa parehong rampa, marami kaming iba pang mga sample ng ESP32 kaysa mula sa oscilloscope.

Hakbang 11: Pagkukumpara sa Bilang ng mga Sampol

Pagkukumpara sa Bilang ng mga Sampol
Pagkukumpara sa Bilang ng mga Sampol
Pagkukumpara sa Bilang ng mga Sampol
Pagkukumpara sa Bilang ng mga Sampol

Dahil ang ESP32 ay nagbigay ng isang mas malaking bilang ng mga sample kaysa sa oscilloscope, kailangan naming ihambing ang mga halagang ito, dahil magsisilbi silang isang index upang ihambing ang dalawang kurba.

Para sa mga ito, gumawa kami ng isang direktang paghahambing.

Mayroon kaming 305 na sample para sa oscilloscope ramp at 2365 sample para sa ADC ramp.

Dahil ang mga rampa ay pareho ng saklaw, masasabi nating mayroon kaming humigit-kumulang na 7.75 na mga sample ng ADC para sa bawat oscilloscope.

Ang pagpaparami ng index ng bawat sample ng oscilloscope ay may parehong kurba, ngunit may mga indeks na katumbas ng ADC at muling ibinahaging data.

Upang punan ang nawawalang data para sa mga bagong posisyon, maglalapat kami ng isang kurba na istatistikal na umaangkop sa kilalang data.

Hakbang 12: Pagpuno ng Mga Puwang - Linya ng Trend

Pagpuno ng mga puwang - Linya ng Trend
Pagpuno ng mga puwang - Linya ng Trend
Pagpuno ng mga puwang - Linya ng Trend
Pagpuno ng mga puwang - Linya ng Trend

Piliin ang kilalang data (mga asul na tuldok), sa pamamagitan ng pag-click at pagkatapos ay pag-click gamit ang kanang pindutan, pipiliin namin ang: "Magdagdag ng linya ng Trend …"

Sa lilitaw na window, pipiliin namin ang uri ng Polynomial (sapat na ang order 2).

Sinuri din namin ang mga pagpipilian na "Tingnan ang Equation sa tsart" at "Ipakita ang R-square na halaga sa tsart".

Nag-click kami sa "Close".

Hakbang 13: Pagpuno sa mga Puwang - Baitang 2 Polynomial Curve

Pagpuno sa mga Puwang - Baitang 2 Polynomial Curve
Pagpuno sa mga Puwang - Baitang 2 Polynomial Curve

Binibigyan kami ng Excel ng dalawang bagong impormasyon; ang pangalawang-order na equation na pinakamahusay na umaangkop sa data, at ang R-square na equation na tumutukoy sa pagiging sapat na ito.

Tandaan lamang na ang mas malapit sa 1, mas naaangkop ang equation.

Huwag nating tuklasin ang kasangkot na matematika, gamitin lamang natin ito bilang isang tool.

Hakbang 14: Pagpuno ng mga Puwang - Sinusuri ang Pag-andar

Punan natin ang mga puwang ng sampling ng data na nabuo ng equation. At pagkatapos, ihambing ang mga ito sa bawat punto.

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

R² = 0, 9999

Boltahe ng oscilloscope = -9E-08 * index2 + 0, 0014 * index + 0, 1505

Hakbang 15: Pagko-convert sa Oscilloscope Voltage sa isang Katumbas na Halaga upang Paghambingin Sa ADC

Ang pag-convert ng Oscilloscope Voltage sa isang Katumbas na Halaga upang Ihambing Sa ADC
Ang pag-convert ng Oscilloscope Voltage sa isang Katumbas na Halaga upang Ihambing Sa ADC

Samantalahin natin ito upang baguhin din ang halaga ng boltahe ng oscilloscope sa isang katumbas na halaga ng ADC.

Tulad ng pinakamataas na halagang nakuha sa ADP ng ESP32 ay 4095, na katumbas ng pagbabasa ng 2.958V para sa parehong index, masasabi natin na:

Ang bawat volt sa mga sukat ng oscilloscope ay katumbas ng tinatayang 1384.4 na mga yunit ng AD. Samakatuwid, maaari nating i-multiply ang lahat ng mga sukat ng oscilloscope ng halagang ito.

Hakbang 16: Paghahambing sa Dalawang Rampa na Nakuha

Paghahambing sa Dalawang Rampa na Nakuha
Paghahambing sa Dalawang Rampa na Nakuha

Ipinapakita ang pagkakaiba na nakuha sa dalawang pagbasa.

Hakbang 17: Pag-uugali ng Pagkakaiba sa Pagbasa ng ADC (ERROR)

Pag-uugali ng Pagkakaiba ng Pagbasa ng ADC (ERROR)
Pag-uugali ng Pagkakaiba ng Pagbasa ng ADC (ERROR)

Ipinapakita ng curve sa ibaba kung paano kumikilos ang pagkakaiba sa pagbabasa ng ADC bilang isang function ng pagsukat. Papayagan kami ng koleksyon ng data na ito upang makahanap ng isang function ng pagwawasto.

Upang hanapin ang curve na ito, isinalarawan lamang namin ang pagkakaiba na matatagpuan sa bawat sukat bilang isang pagpapaandar ng bawat posibleng posisyon ng AD (0 hanggang 4095).

Hakbang 18: Pag-uugali ng Pagkakaiba ng ADC sa Pagbasa - Paghahanap ng Pag-andar ng Pagwawasto

Pag-uugali ng Pagkakaiba ng Pagbabasa ng ADC - Paghahanap ng Pag-andar ng Pagwawasto
Pag-uugali ng Pagkakaiba ng Pagbabasa ng ADC - Paghahanap ng Pag-andar ng Pagwawasto

Maaari naming matukoy sa Excel ang isang pag-andar sa pagwawasto sa pamamagitan ng pagdaragdag ng isang Trend Line, ngayon ng isang mas mataas na degree, hanggang sa ito ay magkasya nang sapat sa aming data.

Hakbang 19: Paggamit ng Iba Pang Software

Paggamit ng Iba Pang Software
Paggamit ng Iba Pang Software
Paggamit ng Iba Pang Software
Paggamit ng Iba Pang Software
Paggamit ng Iba Pang Software
Paggamit ng Iba Pang Software
Paggamit ng Iba Pang Software
Paggamit ng Iba Pang Software

Ang iba pang mga kagiliw-giliw na software para sa pagtukoy ng mga curve ay PolySolve, na maaaring direktang magamit sa link: https://arachnoid.com/polysolve/ o nai-download bilang isang application ng Java.

Pinapayagan nito ang paglalapat ng mas mataas na antas na polynomial regressions at paghahatid ng naka-format na function, pati na rin ang iba pang mga pagpapaandar.

Upang magamit ito, ipasok lamang ang data sa unang text box. Dapat sundin ng data ang pagkakasunud-sunod ng X, Y na pinaghiwalay ng isang kuwit, o tab. Mag-ingat sa paggamit ng tamang tuldok bilang isang decimal point.

Lilitaw ang isang tsart sa susunod na kahon kung ang naipasok na data ay na-format nang tama.

Narito kung paano nagpunta ang aming curve ng error sa ADC.

Ipapakita ng window na ito ang resulta ng pagbabalik, kasama ang data ng pagiging sapat ng pagpapaandar, na kung saan ay maaaring mai-format ang output nito sa maraming paraan: bilang isang function na C / C ++, isang listahan ng mga koepisyent, isang pagpapaandar na nakasulat sa Java, atbp.

Tandaan: Bigyang pansin ang mga separator ng decimal

Hakbang 20: Patuloy at Pag-setup ()

Ituro ko dito ang GPIO na ginamit para sa pagkuha ng analog. Pinasimulan ko ang serial port, pati na rin ang pin na tinutukoy para sa pagkuha ng analog.

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

Hakbang 21: Loop () at ang Pag-andar ng Pagwawasto

Ginagawa namin ang pagkuha ng naayos na boltahe, at nai-print namin ang mga halaga na mayroon o walang mga tamang pagwawasto.

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}

Pansinin sa linya 12 na mayroon kaming pagpipilian na i-print ang data na may pagdaragdag ng pagkakaiba sa pagpapaandar f (analog_value).

Hakbang 22: Paggamit ng PolySolve Correction Function

Dito, ginagamit namin ang pagpapaandar ng PolySolve sa loob ng Arduino IDE.

/ * Mode: normal Polynomial degree 6, 2365 x, y mga pares ng data Coefficient ng ugnayan (r ^ 2) = 9, 907187626418e-01 Karaniwang error = 1, 353761109831e + 01 Form ng output: C / C ++ function: Copyright © 2012, P. Lutus - https://www.arachnoid.com. Nakareserba ang Lahat ng Karapatan. * / doble f (doble 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); }

Tandaan ang pagbabago ng kuwit ayon sa tuldok na naghihiwalay.

Hakbang 23: Makunan Gamit ang Pagwawasto - Serial ng Plotter

Makunan Gamit ang Pagwawasto - Serial ng Plotter
Makunan Gamit ang Pagwawasto - Serial ng Plotter

Hakbang 24: Gastos sa Computational

Computational Cost
Computational Cost
Computational Cost
Computational Cost

Upang maisagawa ang mga kalkulasyon ng polynomial, kinakailangan upang hawakan ng processor ang gawaing ito. Maaari itong humantong sa pagkaantala sa pagpapatupad, nakasalalay sa source code at magagamit na lakas ng computing.

Dito, nakikita namin ang isang talahanayan ng resulta ng isang pagsubok na gumagamit ng mga multi-degree polynomial. Pansinin ang pagkakaiba sa pagitan ng mga oras kung kailan ginamit ang pagpapaandar ng pow () at kung kailan hindi.

Hakbang 25: Test Code - Setup () at Loop Start ()

Narito, mayroon kaming code na ginamit sa aming pagsubok.

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 float contador = 0.0; // contador de chamadas

Hakbang 26: Code ng Pagsubok - Loop () at Pagproseso

Ginamit ko ang pagpapaandar ng micros () upang makuha ang halaga sa mga microsecond.

// ================= inicia o processo float agora = micros (); // marca o instante hindi opisyal habang (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) / dami; // determina o intervalo que se passou para cada iteração // ========= finaliza o processo

Hakbang 27: Code ng Pagsubok - Loop () - Mga Resulta

Nai-print namin ang halagang ibinalik mula sa pag-andar ng grade 13 na mayroon at walang POW para sa paghahambing, pati na rin ang agwat ng pagproseso.

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

Hakbang 28: Code ng Pagsubok - Mga Ginamit na Pag-andar

Walang laman na mga pag-andar (may pagbabalik lamang) ng degree 0 at 1.

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

Mga pagpapaandar sa Baitang 2, 3, at 4.

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

Mga pagpapaandar sa Baitang 5 at 6.

// FUNÇÃO DE GRAU 5doble f5 (dobleng 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 doble f6 (dobleng 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); }

Pag-andar ng grade 13 gamit ang POW.

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

Pag-andar ng grade 13 nang hindi gumagamit ng POW.

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

Hakbang 29: Mga File

I-download ang mga file:

PDF

INO

Spreadsheet

Inirerekumendang: