Orodha ya maudhui:

Jinsi ya Kutengeneza na Kujaribu DAC Bora na ESP32: Hatua 5
Jinsi ya Kutengeneza na Kujaribu DAC Bora na ESP32: Hatua 5

Video: Jinsi ya Kutengeneza na Kujaribu DAC Bora na ESP32: Hatua 5

Video: Jinsi ya Kutengeneza na Kujaribu DAC Bora na ESP32: Hatua 5
Video: Output DC or AC Voltage using MCP4725 DAC with LCD and PWM to Voltage Converter with Arduino 2024, Novemba
Anonim
Jinsi ya Kutengeneza na Kujaribu DAC Bora na ESP32
Jinsi ya Kutengeneza na Kujaribu DAC Bora na ESP32
Jinsi ya Kutengeneza na Kujaribu DAC Bora na ESP32
Jinsi ya Kutengeneza na Kujaribu DAC Bora na ESP32

ESP32 ina 2 8-bit Digital kwa Analog Converters (DACs). Hizi DAC zinaturuhusu kutoa voltages za kiholela ndani ya anuwai fulani (0-3.3V) na bits 8 za azimio. Katika Agizo hili, nitakuonyesha jinsi ya kujenga DAC na kuashiria utendaji wake na pia kuilinganisha na ESP32 DAC. Fahirisi za utendaji nitaangalia ni pamoja na

  • Kiwango cha kelele
  • Bandwidth
  • Ujamaa usio sawa
  • Unlinearity tofauti

Ili kupima fahirisi hizi nitatumia ADS1115.

Ni muhimu kutambua kuwa tathmini yako ya fahirisi hizi zote itakuwa sahihi tu kama kifaa chako cha rejeleo (katika kesi hii ADS115). Kwa mfano, ADS115 haina usahihi wa 16-bit linapokuja suala la upunguzaji wa voltage na faida. Makosa haya yanaweza kuwa makubwa kama 0.1%. Kwa mifumo mingi, makosa haya yanaweza kupuuzwa wakati usahihi kamili ni wa wasiwasi mdogo.

Vifaa

  • ADS1115
  • Bodi ya ESP32
  • ubao wa mkate
  • waya za kuruka
  • 5 kOhm Mpingaji
  • 1 ndogo-Farad kauri capacitor

Hatua ya 1: Kuweka Bodi ya Mkate

Kuweka Bodi ya Mkate
Kuweka Bodi ya Mkate

Waya pini zifuatazo

Kati ya ESP32 na ADS1115

3v3 VDD

GND GND

GPIO22 SCL

GPIO21 SDA

Katika ADS1115

ADDR GND (ADS115)

Kufanya DAC

Kuna njia nyingi za kutengeneza DAC. Rahisi zaidi ni kuchuja alama ya chini ya kupitisha ishara ya PWM na kontena na capacitor. Ningekuwa nimeongeza op-amp hapa kama bafa lakini nilitaka kuweka mambo rahisi. Ubunifu huu ni rahisi na rahisi kutekeleza na microcontroller yoyote inayounga mkono PWM. Sitapitia nadharia ya muundo hapa (google PWM DAC).

Unganisha tu GPIO255 KOhm resistor 1 microFarad Capacitor gnd

Sasa unganisha waya ya kuruka kutoka mahali ambapo kontena hukutana na capacitor hadi A0 kwenye ADS115.

Hatua ya 2: Tathmini Ishara kwa Kiwango cha Kelele

Tathmini Ishara kwa Kiwango cha Kelele
Tathmini Ishara kwa Kiwango cha Kelele

Ili kutathmini kiwango cha kelele fanya tu maandishi hapa chini. Ili kutathmini hii tunaacha DAC kwa bei iliyowekwa na kupima jinsi voltage inavyozunguka kwa muda.

Kwa sababu ya muundo wa DAC, kelele itakuwa kubwa wakati ishara ya PWM iko kwenye mzunguko wa ushuru wa 50%. Kwa hivyo hapa ndipo tutakapoitathmini. Pia tutatathmini ESP32 katika kiwango hiki hicho cha ishara. Pia tutachuja ESP32 DAC na kichujio sawa cha kupitisha chini ili kufanya kipimo kiwe sawa.

Kwangu pato lilikuwa wazi. Ubunifu wa PWM ulikuwa na> 6dB bora SNR (hiyo ni bora mara 2). Ushindi wazi wa DAC mpya. Kuchanganyikiwa kidogo ni kwamba kuna vichungi vilivyojengwa ndani ya ADC ambavyo hakika vinaimarisha SNR. Kwa hivyo maadili kamili inaweza kuwa ngumu kutafsiri. Ikiwa ningetumia kichujio cha agizo la pili hii isingekuwa hivyo.

Nambari yoyote iko hapa chini

# pamoja

# pamoja na Adafruit_ADS1115 matangazo; // maktaba ya adafruit ya adc int16_t adc0; // kuanzisha batili (batili) {Serial.begin (115200); // Anza matangazo ya mfululizo.setGain (GAIN_TWO); // 2x kupata +/- 2.048V 1 bit = 0.0625mV ads.begin (); // kuanza kuelea adc M = 0; // kuelea maana ya awali Mp = 0; // previouos inamaanisha kuelea S = 0; // kuelea ya awali Sp = 0; // tofauti ya awali const int reps = 500; // idadi ya marudio int n = 256; // idadi ya sampuli ledcSetup (0, 25000, 8); // set pwm frequencyecny = 25000 Hz katika 8 bits resolution resolution ledcAttachPin (25, 0); // weka pwm kwenye pin 25 ledcWrite (0, 128); // kuiweka kwa mzunguko wa nusu ya ushuru (kelele kubwa) kuchelewa (3000); // subiri kwa muda wa kuelea snrPWM [reps]; // safu ya snrs kwa PWM kuelea snrDAC [reps]; // safu ya snrs kwa DAC ya (int i = 0; i <reps; i ++) {// loope juu ya marejesho ya (int k = 1; k <(n + 1); k ++) {// loope juu ya sampuli adc0 = matangazo. somaADC_SingleEnded (0); // pata kusoma M = Mp + (adc0 - Mp) / k; // compute rolling inamaanisha Mp = M; // weka maana ya awali S = Sp + (adc0 - Mp) * (adc0 - M); // hesabu utofautishaji unaozunguka Sp = S; // weka utofauti wa hapo awali} // snr katika dB snrPWM = 20 * log10 (3.3 / (sqrt (S / n) *.0625 *.001)); // maadili ya kuweka upya M = 0; Mp = 0; S = 0; Sp = 0; } ledcDetachPin (25); // futa PWM kutoka kwa pini 25 dacWrite (25, 128); // kuandika kwa ucheleweshaji wa DAC (3000); // subiri kutulia (int i = 0; i <reps; i ++) {// sawa na kitanzi cha PWM cha (int k = 1; k <(n + 1); k ++) {adc0 = ads.readADC_SingleEnded (0); M = Mp + (adc0 - Mp) / k; Mp = M; S = Sp + (adc0 - Mp) * (adc0 - M); Sp = S; } snrDAC = 20 * log10 (3.3 / (sqrt (S / n) *.0625 *.001)); M = 0; Mp = 0; S = 0; Sp = 0; } // njama za SNR kwenye grafu moja ya (int i = 1; i <reps; i ++) {Serial.print ("PWM_SNR (dB):"); Printa ya serial (snrPWM ); Serial.print (","); Serial.print ("ESP32_SNR (dB):"); Serial.println (snrDAC ); }} kitanzi batili (batili) {}

Hatua ya 3: Kuunganisha kwa umoja na kutofautisha tofauti

Kuunganisha kwa umoja na kutofautisha tofauti
Kuunganisha kwa umoja na kutofautisha tofauti

Unlinearity muhimu ni kipimo cha takriban kupotoka kati ya voltage yako ya pato la DAC na laini moja kwa moja. Kadiri ilivyo kubwa ndivyo ilivyo mbaya zaidi…

Unlinearity tofauti ni kipimo cha takribani ni kiasi gani mabadiliko yaliyoonekana katika voltage (kutoka kwa kificho moja hadi nyingine) yanatoka kwa kile kinachotarajiwa kutoka kwa laini moja kwa moja.

Matokeo hapa yalikuwa ya kupendeza sana. Kwanza kabisa, zote zina makosa chini ya 0.5lsb (katika azimio la 8-bit) ambayo ni nzuri lakini PWM ina usawa bora zaidi wa ujumuishaji. Zote mbili zina usawa wa kutofautisha lakini ESP32 DAC ina miiko mingine ya kushangaza sana. Isitoshe, njia ya PWM ina muundo wa makosa. Kimsingi hupunguza na kusisitiza voltage sahihi kwa mtindo mbadala.

Shuku yangu ni kwamba hii ni makosa ya kushangaza katika jinsi ishara ya PWM ya 8-bit inazalishwa kwenye ESP32.

Njia moja ya kusahihisha hii ni kuzunguka kwa kasi kati ya nambari mbili zilizo karibu (k. 128, 129) na PWM. Na kichujio cha chini cha analog, makosa yanayosababishwa yatakuwa wastani hadi sifuri. Niliiga hii katika programu na kwa kweli makosa yote yalipotea. Sasa njia ya PWM ina laini ambayo ni sawa kwa bits 16!

Yeyote ambaye nambari ya kutengeneza data iko hapa chini. Pato litakuwa kwenye mfuatiliaji wa serial katika muundo wa.csv. Nakili tu kwa faili ya maandishi kwa usindikaji zaidi.

# pamoja

# pamoja na Adafruit_ADS1115 matangazo; / * Tumia hii kwa toleo la 16-bit * / int16_t adc0; kuanzisha batili (batili) {Serial.begin (115200); matangazo.setGain (GAIN_ONE); // 2x kupata +/- 2.048V 1 bit = 1mV 0.0625mV ads.begin (); ledcSetup (0, 25000, 8); ledcAttachPin (25, 0); Serial.println ("Inatarajiwa, Inazingatiwa"); iliyoandikwa (0, 2); kuchelewesha (3000); kwa (int i = 2; i <255; i ++) {ledcWrite (0, i); kuchelewesha (100); adc0 = matangazo. somaADC_SingleEnded (0); kuelea inatarajiwa = (i / 256.0 * 3.3) / 4.096 * 32767; Serial.print (inatarajiwa); Serial.print (","); Serial.println (adc0); }} kitanzi batili (batili) {}

Hatua ya 4: Bandwidth

Bandwidth
Bandwidth

Nitafafanua kipimo cha data kama hapa kama masafa ambayo pato la DAC linashuka kwa 3dB. Huu ni mkataba na, kwa kiwango fulani, kiholela. Kwa mfano, katika hatua ya 6dB, DAC bado itatoa ishara itakuwa tu 50 ~ amplitude.

Kupima hii tunapitisha tu mawimbi ya sine kwa masafa ya kuongezeka kutoka DAC kwenda ADC na kupima kupotoka kwao kwa kawaida. Haishangazi, hatua ya 3dB iko kwenye 30Hz (1 / (2 * pi * 5000 * 1e-6)).

ESP32 inaweza kufanya sampuli 1 ya Mega kwa sekunde. Huu ni ushindi wa mikono chini kwa ESP32. Amplitude yake haioi kabisa katika mkoa wa mtihani wa bandwidth 100Hz.

Nambari hapa chini inaweza kujaribu kipimo cha data cha PWM DAC.

# pamoja

# pamoja na Adafruit_ADS1115 matangazo; / * Tumia hii kwa toleo la 16-bit * / int16_t adc0; int16_t adc1; kuanzisha batili (batili) {kuelea M; kuelea Mp = 0; kuelea S = 0; kuelea Sp = 0; Serial. Kuanza (115200); ads.setGain (GAIN_ONE); // 1x kupata +/- 4.096V 1 bit = 2mV 0.125mV matangazo. Anza (); ledcSetup (0, 25000, 8); ledcAttachPin (25, 0); kuchelewesha (5000); Serial.println ("Mzunguko, Amplitude"); kwa (int i = 1; i <100; i ++) {unsigned long start = millis (); saini ndefu T = millis (); Sp = 0; S = 0; M = 0; Mp = 0; int k = 1; kawaida ya kuelea; wakati ((T - anza) <1000) {int out = 24 * dhambi (2 * PI * i * (T - kuanza) / 1000.0) + 128; ledcWrite (0, nje); adc0 = matangazo. somaADC_SingleEnded (0); M = Mp + (adc0 - Mp) / k; Mp = M; S = Sp + (adc0 - Mp) * (adc0 - M); Sp = S; T = milimita (); k ++; } ikiwa (i == 1) {kawaida = sqrt (S / k); } Serial.print (i); Serial.print (","); Serial.println (sqrt (S / k) / kawaida, 3); k = 0; }} kitanzi batili (batili) {}

Na nambari hii itajaribu kipimo cha ESP32. Hakikisha kuondoa capacitor au matokeo yatakuwa sawa kwa njia zote mbili.

# pamoja

# pamoja na Adafruit_ADS1115 matangazo; / * Tumia hii kwa toleo la 16-bit * / int16_t adc0; int16_t adc1; kuanzisha batili (batili) {kuelea M; kuelea Mp = 0; kuelea S = 0; kuelea Sp = 0; Serial. Kuanza (115200); matangazo.setGain (GAIN_ONE); // 1x kupata +/- 4.096V 1 bit = 2mV 0.125mV matangazo. Anza (); kuchelewesha (5000); Serial.println ("Mzunguko, Amplitude"); kwa (int i = 1; i <100; i ++) {unsigned long start = millis (); saini ndefu T = millis (); Sp = 0; S = 0; M = 0; Mp = 0; int k = 1; kawaida ya kuelea; wakati ((T - anza) <1000) {int out = 24 * dhambi (2 * PI * i * (T - kuanza) / 1000.0) + 128; Andika (25, nje); adc0 = matangazo. somaADC_SingleEnded (0); M = Mp + (adc0 - Mp) / k; Mp = M; S = Sp + (adc0 - Mp) * (adc0 - M); Sp = S; T = milimita (); k ++; } ikiwa (i == 1) {kawaida = sqrt (S / k); } Serial.print (i); Serial.print (","); Serial.println (sqrt (S / k) / kawaida, 3); k = 0; }} kitanzi batili (batili) {}

Hatua ya 5: Kufunga Mawazo

Ubunifu mpya wa DAC unashinda kwenye usawa na kelele lakini hupoteza kwa kipimo data. Kulingana na maombi yako fahirisi hizi zinaweza kuwa muhimu zaidi kuliko nyingine. Pamoja na taratibu hizi za upimaji, unapaswa kuwa na uamuzi mzuri!

Pia, nadhani ni muhimu kuashiria hapa kwamba kwa sababu pato la PWM ni kelele ya chini, na usawa wa kipekee inapaswa kuwekewa azimio kubwa zaidi DAC na pato la PWM (labda hata usahihi wa 16-bit). Hiyo itachukua kazi. Hadi wakati huo, ninakuambia adieu!

Ilipendekeza: