Բովանդակություն:

Ինչպես կատարել և փորձարկել ավելի լավ DAC ESP32: 5 քայլով
Ինչպես կատարել և փորձարկել ավելի լավ DAC ESP32: 5 քայլով

Video: Ինչպես կատարել և փորձարկել ավելի լավ DAC ESP32: 5 քայլով

Video: Ինչպես կատարել և փորձարկել ավելի լավ DAC ESP32: 5 քայլով
Video: Servo Motor with Potentiometer and LCD with Arduino 2024, Նոյեմբեր
Anonim
Ինչպես կատարել և փորձարկել ավելի լավ DAC ESP32- ով
Ինչպես կատարել և փորձարկել ավելի լավ DAC ESP32- ով
Ինչպես կատարել և փորձարկել ավելի լավ DAC ESP32- ով
Ինչպես կատարել և փորձարկել ավելի լավ DAC ESP32- ով

ESP32- ն ունի թվային անալոգային թվային 2 փոխարկիչ (DAC): Այս DAC- ները թույլ են տալիս արտադրել կամայական լարումներ որոշակի տիրույթի (0-3.3V) սահմաններում `8 բիթ լուծույթով: Այս Instructable- ում ես ձեզ ցույց կտամ, թե ինչպես կառուցել DAC և բնութագրել դրա կատարումը, ինչպես նաև համեմատել այն ESP32 DAC- ի հետ: Կատարման ցուցանիշները, որոնք ես կանդրադառնամ, ներառում են

  • Աղմուկի մակարդակ
  • Թողունակություն
  • Ինտեգրալ ոչ գծայնություն
  • Դիֆերենցիալ ոչ գծայնություն

Այս ցուցանիշները ստուգելու համար ես կօգտագործեմ ADS1115- ը:

Կարևոր է նշել, որ այս բոլոր ցուցանիշների վերաբերյալ ձեր գնահատականը կլինի նույնքան ճշգրիտ, որքան ձեր տեղեկատու սարքը (այս դեպքում ՝ ADS115): Օրինակ, ADS115- ը չունի 16-բիթանոց ճշգրտություն, երբ խոսքը վերաբերում է լարման անջատմանը և ավելացմանը: Այս սխալները կարող են լինել մինչև 0.1%: Շատ համակարգերի համար այդ սխալները կարող են անտեսվել, երբ բացարձակ ճշգրտությունը սահմանափակ մտահոգություն ունի:

Պարագաներ

  • ADS1115
  • ESP32 տախտակ
  • տախտակ
  • jumper լարերը
  • 5 կՕմ դիմադրություն
  • 1 միկրո-Ֆարադի կերամիկական կոնդենսատոր

Քայլ 1: Տեղադրեք Breadboard- ը

Տեղադրելով դուրս Breadboard
Տեղադրելով դուրս Breadboard

Լարացրեք հետևյալ կապում

ESP32- ի և ADS1115- ի միջև

3v3 VDD

GND GND

GPIO22 SCL

GPIO21 SDA

ADS1115- ում

ADDR GND (ADS115)

DAC- ի պատրաստում

DAC- ի ստեղծման բազմաթիվ եղանակներ կան: Ամենապարզն այն է, որ ցածր փոխանցման միջոցով զտեք PWM ազդանշանը ՝ դիմադրիչով և կոնդենսատորով: Ես կարող էի այստեղ որպես բուֆեր ավելացնել op-amp, բայց ուզում էի ամեն ինչ պարզ պահել: Այս դիզայնը պարզ և էժան է իրականացնել ցանկացած միկրոկոնտրոլերի հետ, որն աջակցում է PWM- ին: Ես մտադիր չեմ այստեղ անցնել դիզայնի տեսությունը (google PWM DAC):

Պարզապես միացրեք GPIO255 KOhm դիմադրություն 1 microFarad կոնդենսատոր gnd

Այժմ միացրեք jumper մետաղալարն այն կետից, որտեղ դիմադրիչը հանդիպում է կոնդենսատորին ADS115- ի A0- ին:

Քայլ 2. Գնահատեք ազդանշանը մինչև աղմուկի մակարդակը

Գնահատեք ազդանշանը մինչև աղմուկի մակարդակը
Գնահատեք ազդանշանը մինչև աղմուկի մակարդակը

Աղմուկի մակարդակը գնահատելու համար պարզապես գործարկեք ստորև բերված սցենարը: Դա գնահատելու համար մենք պարզապես թողնում ենք DAC- ը ֆիքսված արժեքի վրա և չափում ենք, թե ինչպես է լարումը տատանվում ժամանակի ընթացքում:

DAC- ի նախագծման շնորհիվ աղմուկն առավել մեծ կլինի, երբ PWM ազդանշանը գտնվում է աշխատանքային ցիկլի 50% -ում: Հետևաբար, այստեղ մենք կգնահատենք այն: Մենք նաև ESP32- ը կգնահատենք այս նույն ազդանշանի մակարդակով: Մենք նաև զտելու ենք ESP32 DAC- ն նույն ցածր անցման զտիչով, որպեսզի չափումը համեմատելի լինի:

Ինձ համար ելքը պարզ էր: PWM դիզայնն ուներ> 6dB ավելի լավ SNR (դա 2 անգամ ավելի լավ է): Հստակ հաղթանակ նոր DAC- ի համար: Մի փոքր շփոթություն այն է, որ ADC- ում ներկառուցված են զտիչներ, որոնք միանշանակ բարելավում են SNR- ը: Այսպիսով, բացարձակ արժեքները կարող են դժվար մեկնաբանվել: Եթե ես երկրորդ կարգի ֆիլտր օգտագործեի, դա այդպես չէր լինի:

Ինչևէ, ծածկագիրը ստորև է

#ներառում

#ներառել Adafruit_ADS1115 գովազդ; // adafruit գրադարան adc int16_t adc0- ի համար; // void setup (void) {Serial.begin (115200); // Սկսեք սերիական գովազդներ. SetGain (GAIN_TWO); // 2x շահույթ +/- 2.048V 1 բիթ = 0.0625 մՎ ads.begin (); // սկսել adc float M = 0; // սկզբնական միջին բոց Mp = 0; // previouos միջին բոց S = 0; // սկզբնական Variance float Sp = 0; // նախորդ շեղումը const int կրկնություններ = 500; // կրկնությունների թիվը int n = 256; // ledcSetup նմուշների քանակը (0, 25000, 8); // սահմանել pwm frequecny = 25000 Հց 8 բիթ թույլատրությամբ ledcAttachPin (25, 0); // սահմանել pwm 25 կապում ledcWrite (0, 128); // սահմանել այն կես աշխատանքային ցիկլի (ամենամեծ աղմուկի) հետաձգման (3000); // սպասել ժամանակի կարգավորմանը float snrPWM [կրկնություններ]; // զանգված snrs համար PWM float snrDAC [կրկնություններ]; // snrs զանգված DAC- ի համար (int i = 0; i <կրկնություններ; i ++) {// loope over repititions for (int k = 1; k <(n+1); k ++) {// loope over sample adc0 = ads.readADC_SingleEnded (0); // ստանալ ընթերցում M = Mp + (adc0 - Mp) / k; // հաշվել շարժակազմի միջին Mp = M; // սահմանել նախորդ միջին S = Sp + (adc0 - Mp) * (adc0 - M); // հաշվել շարժակազմի շեղումը Sp = S; // սահմանել նախորդ շեղումը} // snr dB- ում snrPWM = 20 * log10 (3.3 / (sqrt (S / n) *.0625 *.001)); // վերականգնել արժեքները M = 0; Mp = 0; S = 0; Sp = 0; } ledcDetachPin (25); // անջատել PWM- ը քորոցից 25 dacWrite (25, 128); // գրել DAC ուշացմանը (3000); // սպասեք, որ բավարարվեք (int i = 0; i <կրկնություններ; i ++) {// նույնը, ինչ PWM օղակը (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; } // գծել SNR- ները մեկ գրաֆիկի վրա (int i = 1; i <reps; i ++) {Serial.print ("PWM_SNR (dB):"); Serial.print (snrPWM ); Serial.print (","); Serial.print ("ESP32_SNR (dB):"); Serial.println (snrDAC ); }} դատարկ շրջան (դատարկ) {}

Քայլ 3. Ինտեգրալ ոչ գծայնություն և դիֆերենցիալ ոչ գծայնություն

Ինտեգրալ ոչ գծայնություն և դիֆերենցիալ ոչ գծայնություն
Ինտեգրալ ոչ գծայնություն և դիֆերենցիալ ոչ գծայնություն

Ինտեգրալ ոչ գծայնությունը չափում է մոտավորապես այն, թե որքան շեղում կա ձեր DAC ելքային լարման և ուղիղ գծի միջև: Որքան մեծ է սա, այնքան վատ է…

Դիֆերենցիալ ոչ գծայնությունը չափում է մոտավորապես այն, թե որքանով է լարման (մեկ կոդից մյուսը) նկատվող փոփոխությունը շեղվում այն բանից, ինչ սպասվում էր ուղիղ գծից:

Այստեղ ստացված արդյունքներն իսկապես հետաքրքիր էին: Առաջին հերթին, երկուսն էլ ունեն 0.5lsb- ից պակաս սխալ (8-բիթանոց լուծաչափով), ինչը լավ է, բայց PWM- ն ունի շատ ավելի լավ ինտեգրալ գծայնություն: Երկուսն էլ ունեն համեմատելի դիֆերենցիալ ոչ գծայնություն, բայց ESP32 DAC- ն ունի շատ տարօրինակ բծեր: Ավելին, PWM մեթոդը որոշ կառուցվածք ունի սխալների նկատմամբ: Ըստ էության, այն գերազանցում և նվազեցնում է ճիշտ լարման փոփոխական եղանակը:

Ես կասկածում եմ, որ սա ինչ-որ տարօրինակ կլորացման սխալ է, թե ինչպես է 8-բիթանոց PWM ազդանշանը արտադրվում ESP32- ում:

Դա շտկելու եղանակներից մեկը PWM- ի հետ արագորեն շրջել երկու հարակից ծածկագրերի միջև (օրինակ ՝ 128, 129): Անալոգային ցածրուղու զտիչով ստացված սխալները միջինում կդառնան զրոյի: Ես նմանակեցի ծրագրային ապահովման մեջ և իսկապես բոլոր սխալներն անհետացան: Այժմ PWM մեթոդը ունի գծայնություն, որը ճշգրիտ է 16 բիթ:

Wանկացած անձ, որը կստեղծի տվյալները ՝ ստորև: Ելքը կլինի սերիական մոնիտորի վրա.csv ձևաչափով: Պարզապես պատճենեք այն տեքստային ֆայլում `հետագա մշակման համար:

#ներառում

#ներառել Adafruit_ADS1115 գովազդ; / * Օգտագործեք սա 16-բիթանոց տարբերակի համար */ int16_t adc0; void setup (void) {Serial.begin (115200); ads.setGain (GAIN_ONE); // 2x շահույթ +/- 2.048V 1 բիթ = 1 մՎ 0.0625 մՎ ads.begin (); ledcSetup (0, 25000, 8); ledcAttachPin (25, 0); Serial.println («Սպասված, դիտարկված»); ledcWrite (0, 2); ուշացում (3000); համար (int i = 2; i <255; i ++) {ledcWrite (0, i); ուշացում (100); adc0 = ads.readADC_SingleEnded (0); ակնկալվող բոց = (i / 256.0 * 3.3) / 4.096 * 32767; Serial.print (սպասվում է); Serial.print (","); Serial.println (adc0); }} դատարկ շրջան (դատարկ) {}

Քայլ 4: Թողունակություն

Թողունակություն
Թողունակություն

Ես թողունակության սահմանը սահմանելու եմ այստեղ որպես հաճախականություն, որով DAC- ի թողարկումը նվազում է 3dB- ով: Սա պայմանականություն է և որոշ չափով կամայական: Օրինակ, 6 դԲ կետում DAC- ն դեռ ազդանշան կտա, այն կլինի ընդամենը ~ 50% ամպլիտուդ:

Սա չափելու համար մենք պարզապես սինուսային ալիքներ ենք անցնում DAC- ից դեպի ADC աճող հաճախականությամբ և չափում դրանց ստանդարտ շեղումը: Sարմանալի չէ, որ 3dB կետը գտնվում է 30Hz- ում (1/(2*pi*5000*1e-6)):

ESP32- ը կարող է վայրկյանում կատարել 1 Մեգա նմուշ: Սա ESP32- ի անհաղթ հաղթանակն է: Նրա ամպլիտուդը ընդհանրապես չի քայքայվում 100 Հց թողունակության փորձարկման շրջանում:

Ստորև բերված ծածկագիրը կարող է ստուգել PWM DAC թողունակությունը:

#ներառում

#ներառել Adafruit_ADS1115 գովազդ; / * Օգտագործեք սա 16-բիթանոց տարբերակի համար */ int16_t adc0; int16_t adc1; void setup (void) {float M; բոց Mp = 0; բոց S = 0; բոց Sp = 0; Serial.begin (115200); ads.setGain (GAIN_ONE); // 1x շահույթ +/- 4.096V 1 բիթ = 2mV 0.125mV ads.begin (); ledcSetup (0, 25000, 8); ledcAttachPin (25, 0); ուշացում (5000); Serial.println («Հաճախականություն, ամպլիտուդիա»); համար (int i = 1; i <100; i ++) {անստորագիր երկար մեկնարկ = millis (); անստորագիր երկար T = millis (); Sp = 0; S = 0; M = 0; Mp = 0; int k = 1; լողացող նորմ; իսկ ((T - սկիզբ) <1000) {int out = 24 * sin (2 * PI * i * (T - սկիզբ) / 1000.0) + 128; ledcWrite (0, դուրս); adc0 = ads.readADC_SingleEnded (0); M = Mp + (adc0 - Mp) / k; Mp = M; S = Sp + (adc0 - Mp) * (adc0 - M); Sp = S; T = millis (); k ++; } if (i == 1) {norm = sqrt (S / k); } Serial.print (i); Serial.print (","); Serial.println (sqrt (S / k) / նորմ, 3); k = 0; }} դատարկ շրջան (դատարկ) {}

Եվ այս ծածկագիրը կփորձարկի ESP32 թողունակությունը: Համոզվեք, որ հեռացրեք կոնդենսատորը, հակառակ դեպքում արդյունքները նույնը կլինեն երկու մեթոդների դեպքում:

#ներառում

#ներառել Adafruit_ADS1115 գովազդ; / * Օգտագործեք սա 16-բիթանոց տարբերակի համար */ int16_t adc0; int16_t adc1; void setup (void) {float M; բոց Mp = 0; բոց S = 0; բոց Sp = 0; Serial.begin (115200); ads.setGain (GAIN_ONE); // 1x շահույթ +/- 4.096V 1 բիթ = 2mV 0.125mV ads.begin (); ուշացում (5000); Serial.println («Հաճախականություն, ամպլիտուդիա»); համար (int i = 1; i <100; i ++) {անստորագիր երկար մեկնարկ = millis (); անստորագիր երկար T = millis (); Sp = 0; S = 0; M = 0; Mp = 0; int k = 1; լողացող նորմ; իսկ ((T - սկիզբ) <1000) {int out = 24 * sin (2 * PI * i * (T - սկիզբ) / 1000.0) + 128; dacWrite (25, դուրս); adc0 = ads.readADC_SingleEnded (0); M = Mp + (adc0 - Mp) / k; Mp = M; S = Sp + (adc0 - Mp) * (adc0 - M); Sp = S; T = millis (); k ++; } if (i == 1) {norm = sqrt (S / k); } Serial.print (i); Serial.print (","); Serial.println (sqrt (S / k) / նորմ, 3); k = 0; }} դատարկ շրջան (դատարկ) {}

Քայլ 5: Մտքերի փակումը

DAC- ի նոր դիզայնը հաղթում է գծայնության և աղմուկի վրա, բայց կորցնում է թողունակության վրա: Կախված ձեր դիմումից, այս ցուցանիշներից մեկը կարող է ավելի կարևոր լինել, քան մյուսը: Այս թեստավորման ընթացակարգերով դուք պետք է կարողանաք օբյեկտիվորեն կայացնել այդ որոշումը:

Բացի այդ, ես կարծում եմ, որ այստեղ արժե նշել, որ քանի որ PWM թողունակությունը ցածր աղմուկ է, բացառիկ գծայնությամբ հնարավոր է, որ PWM ելքով շատ ավելի բարձր լուծաչափով DAC կառուցվի (գուցե նույնիսկ 16 բիթ ճշգրտությամբ): Դա որոշակի աշխատանք կպահանջի: Մինչ այդ, ես ձեզ ողջունում եմ:

Խորհուրդ ենք տալիս: