Orodha ya maudhui:
- Vifaa
- Hatua ya 1: Kuweka Bodi ya Mkate
- Hatua ya 2: Tathmini Ishara kwa Kiwango cha Kelele
- Hatua ya 3: Kuunganisha kwa umoja na kutofautisha tofauti
- Hatua ya 4: Bandwidth
- Hatua ya 5: Kufunga Mawazo
Video: Jinsi ya Kutengeneza na Kujaribu DAC Bora na ESP32: Hatua 5
2024 Mwandishi: John Day | [email protected]. Mwisho uliobadilishwa: 2024-01-30 12:48
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
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
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
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
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:
Jinsi ya kutengeneza RADAR Kutumia Arduino kwa Mradi wa Sayansi Miradi Bora ya Arduino: Hatua 5
Jinsi ya kutengeneza RADAR Kutumia Arduino kwa Mradi wa Sayansi Miradi bora ya Arduino: Halo marafiki, katika hii nitafundishwa nitakuonyesha jinsi ya kutengeneza mfumo mzuri wa rada uliojengwa kwa kutumia arduino nano mradi huu ni mzuri kwa miradi ya sayansi na unaweza kuifanya kwa urahisi na uwekezaji mdogo na nafasi ikiwa tuzo ya kushinda ni nzuri kwa
Jinsi ya Kutengeneza Mzunguko Bora wa Chaser ya LED Bila IC: Hatua 15
Jinsi ya Kutengeneza Mzunguko Bora wa Chaser bila IC: Hii rafiki, Leo nitatengeneza mzunguko wa Chaser ya LED bila kutumia IC. Mzunguko huu ni wa kushangaza na nitafanya mzunguko huu kutumia BC547 Transistor. Hii ni Mzunguko bora wa Chaser ya LED. Tuanze
Jinsi ya kutengeneza Ukanda wa Nguvu Bora: Hatua 4
Jinsi ya Kutengeneza Ukanda wa Nguvu Bora: Jinsi ya Kutengeneza Ukanda wa Nguvu Bora - Ulinzi wa Umeme - Ukandamizaji wa Kelele - Fyonza Vipimo
Jinsi ya Kujaribu Transistors ya Bipolar Ikiwa Una Multimeter ya Analog: Hatua 4
Jinsi ya Kujaribu Transistors ya Bipolar Ikiwa Una Multimeter ya Analog: Tunajua jinsi transistor inavyofanya kazi lakini wengine wetu hawajui jinsi ya kujaribu sehemu yenyewe. Siku hizi, Multimeter nyingi za Dijiti zina soketi zilizotolewa ili kuzijaribu, lakini utafanya nini ikiwa una zile za zamani za Analog / Needletype? Hii ni sim
Jinsi ya Kujaribu na Kupata Vipengele vya Bure: Hatua 5
Jinsi ya Kujaribu na Kupata Vipengele vya Bure: wakati mwingine huna pesa, lakini unataka kujenga kitu kizuri. hapa kuna mwongozo wa kukusaidia