Sadržaj:
- Pribor
- Korak 1: Postavljanje tlocrta
- Korak 2: Procijenite signal na razinu buke
- Korak 3: Integralna nelinearnost i diferencijalna nelinearnost
- Korak 4: Propusnost
- Korak 5: Zatvaranje misli
Video: Kako napraviti i testirati bolji DAC pomoću ESP32: 5 koraka
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:32
ESP32 ima 2 8-bitna digitalno-analogna pretvarača (DAC). Ovi DAC-ovi omogućuju nam proizvođenje proizvoljnih napona u određenom rasponu (0-3,3 V) s razlučivošću od 8 bita. U ovom Instructable -u pokazat ću vam kako izgraditi DAC i okarakterizirati njegove performanse, kao i usporediti ga s ESP32 DAC -om. Indeksi izvedbe koje ću pogledati uključuju
- Razina buke
- Propusnost
- Integralna nelinearnost
- Diferencijalna nelinearnost
Za testiranje ovih indeksa upotrijebit ću ADS1115.
Važno je napomenuti da će vaša procjena svih ovih indeksa biti točna samo koliko i vaš referentni uređaj (u ovom slučaju ADS115). Na primjer, ADS115 nema 16-bitnu preciznost kada je u pitanju njegov pomak napona i pojačanje. Ove pogreške mogu iznositi čak 0,1%. Za mnoge sustave ove se pogreške mogu zanemariti kada je apsolutna točnost ograničena briga.
Pribor
- ADS1115
- ESP32 ploča
- matična ploča
- kratkospojne žice
- Otpornik od 5 kOhm
- 1 mikro-Farad keramički kondenzator
Korak 1: Postavljanje tlocrta
Ožičite sljedeće pinove
Između ESP32 i ADS1115
3v3 VDD
GND GND
GPIO22 SCL
GPIO21 SDA
Na adresi ADS1115
ADDR GND (ADS115)
Izrada DAC -a
Postoji mnogo načina za izradu DAC -a. Najjednostavnije je niskopropusno filtriranje PWM signala s otpornikom i kondenzatorom. Ovdje sam mogao dodati op-amp kao međuspremnik, ali želio bih da stvari budu jednostavne. Ovaj dizajn je jednostavan i jeftin za implementaciju sa bilo kojim mikrokontrolerom koji podržava PWM. Ovdje neću prolaziti kroz teoriju dizajna (google PWM DAC).
Samo spojite GPIO255 KOhm otpornik 1 microFarad kondenzator gnd
Sada spojite kratkospojnu žicu s mjesta gdje se otpornik susreće s kondenzatorom na A0 na ADS115.
Korak 2: Procijenite signal na razinu buke
Za procjenu razine buke jednostavno pokrenite donju skriptu. Da bismo to ocijenili, jednostavno ostavimo DAC na fiksnoj vrijednosti i izmjerimo kako napon oscilira tijekom vremena.
Zbog dizajna DAC -a, šum će biti najveći kada je PWM signal na radnom ciklusu od 50%. Stoga ćemo je ovdje ocijeniti. Također ćemo procijeniti ESP32 na istoj razini signala. Također ćemo filtrirati ESP32 DAC s istim niskopropusnim filtrom kako bismo mjerenje učinili usporedivim.
Za mene je izlaz bio jasan. Dizajn PWM -a imao je> 6dB bolji SNR (to je 2 puta bolje). Očigledna pobjeda za novi DAC. Jedna mala zabuna je u tome što postoje filteri ugrađeni u ADC koji definitivno poboljšavaju SNR. Dakle, apsolutne vrijednosti može biti teško tumačiti. Da sam koristio filter drugog reda to ne bi bio slučaj.
U svakom slučaju kôd je ispod
#uključi
#uključite oglase Adafruit_ADS1115; // adafruit knjižnica za adc int16_t adc0; // void setup (void) {Serial.begin (115200); // Pokretanje serijskog ads.setGain (GAIN_TWO); // 2x pojačanje +/- 2.048V 1 bit = 0,0625mV ads.begin (); // započinje adc float M = 0; // početna srednja vrijednost float Mp = 0; // previouos mean float S = 0; // početna varijacija plovka Sp = 0; // prethodna varijansa const int ponavljanja = 500; // broj ponavljanja int n = 256; // broj uzoraka ledcSetup (0, 25000, 8); // postavlja pwm frequecny = 25000 Hz pri razlučivosti 8 bita ledcAttachPin (25, 0); // postavite pwm na pin 25 ledcWrite (0, 128); // namjestimo na pola radnog ciklusa (najveća buka) kašnjenje (3000); // čekati vrijeme slijeganja float snrPWM [ponavljanja]; // niz snrs za PWM float snrDAC [ponavljanja]; // niz snrs -a za DAC za (int i = 0; i <reps; i ++) {// petlja preko ponavljanja za (int k = 1; k <(n+1); k ++) {// petlja preko uzoraka adc0 = ads.readADC_SingleEnded (0); // dobiti čitanje M = Mp + (adc0 - Mp) / k; // izračunati srednju vrijednost kotrljanja Mp = M; // postavite prethodnu srednju vrijednost S = Sp + (adc0 - Mp) * (adc0 - M); // izračunati varijancu valjanja Sp = S; // postavlja prethodnu varijansu} // snr u dB snrPWM = 20 * log10 (3.3 / (sqrt (S / n) *.0625 *.001)); // poništavanje vrijednosti M = 0; Mp = 0; S = 0; Sp = 0; } ledcDetachPin (25); // odvojimo PWM od pina 25 dacWrite (25, 128); // zapisivanje u DAC kašnjenje (3000); // čekamo da se zadovolji (int i = 0; i <reps; i ++) {// isto što i PWM petlja za (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; } // iscrtati SNR -ove na jednom grafikonu za (int i = 1; i <reps; i ++) {Serial.print ("PWM_SNR (dB):"); Serijski.ispis (snrPWM ); Serial.print (","); Serial.print ("ESP32_SNR (dB):"); Serial.println (snrDAC ); }} void petlja (void) {}
Korak 3: Integralna nelinearnost i diferencijalna nelinearnost
Integralna nelinearnost je mjera otprilike koliko postoji odstupanje između vašeg izlaznog napona DAC -a i ravne crte. Što je ovo veće to je gore…
Diferencijalna nelinearnost mjera je otprilike koliko opažena promjena napona (od jednog koda do drugog) odstupa od onoga što bi se očekivalo od ravne crte.
Ovdje su rezultati bili doista zanimljivi. Prije svega, oba imaju pogrešku manju od 0,5 l / s (pri 8-bitnoj razlučivosti) što je dobro, ali PWM ima puno bolju integralnu linearnost. Obje imaju usporedivu diferencijalnu nelinearnost, ali ESP32 DAC ima neke vrlo čudne skokove. Štoviše, PWM metoda ima određenu strukturu grešaka. U biti naizmjenično nadilazi i podcjenjuje ispravan napon.
Sumnjam da je to neka čudna pogreška zaokruživanja u načinu na koji se 8-bitni PWM signal proizvodi na ESP32.
Jedan od načina da to ispravite je brzo kretanje između dva susjedna koda (npr. 128, 129) pomoću PWM -a. S analognim niskopropusnim filtrom rezultirajuće pogreške bit će prosječne na nulu. Simulirao sam to u softveru i doista su sve pogreške nestale. Sada PWM metoda ima linearnost koja je točna do 16 bita!
U nastavku se nalazi bilo koji kôd za generiranje podataka. Izlaz će biti na serijskom monitoru u.csv formatu. Samo ga kopirajte u tekstualnu datoteku za daljnju obradu.
#uključi
#uključite oglase Adafruit_ADS1115; / * Koristite ovo za 16-bitnu verziju */ int16_t adc0; void setup (void) {Serial.begin (115200); ads.setGain (GAIN_ONE); // 2x pojačanje +/- 2.048V 1 bit = 1mV 0.0625mV ads.begin (); ledcSetup (0, 25000, 8); ledcAttachPin (25, 0); Serial.println ("Očekivano, uočeno"); ledcWrite (0, 2); kašnjenje (3000); za (int i = 2; i <255; i ++) {ledcWrite (0, i); kašnjenje (100); adc0 = ads.readADC_SingleEnded (0); očekivano plutanje = (i / 256,0 * 3,3) / 4,096 * 32767; Serial.print (očekivano); Serial.print (","); Serial.println (adc0); }} void petlja (void) {}
Korak 4: Propusnost
Ovdje ću definirati propusnost kao frekvenciju na kojoj izlaz DAC -a opada za 3 dB. Ovo je konvencija i donekle proizvoljna. Na primjer, na točki od 6 dB, DAC će i dalje emitirati signal čija će amplituda biti samo ~ 50%.
Kako bismo to izmjerili, jednostavno prosljeđujemo sinusne valove sve većom frekvencijom od DAC -a do ADC -a i mjerimo njihovu standardnu devijaciju. Ne iznenađuje da je 3dB točka na 30Hz (1/(2*pi*5000*1e-6)).
ESP32 može napraviti 1 mega uzorak u sekundi. Ovo je ručna pobjeda za ESP32. Njegova amplituda uopće ne opada u području testiranja propusnosti od 100Hz.
Donji kod može testirati PWM DAC propusnost.
#uključi
#uključite oglase Adafruit_ADS1115; / * Koristite ovo za 16-bitnu verziju */ int16_t adc0; int16_t adc1; void setup (void) {float M; plovak Mp = 0; plovak S = 0; plovak Sp = 0; Serial.begin (115200); ads.setGain (GAIN_ONE); // 1x pojačanje +/- 4.096V 1 bit = 2mV 0.125mV ads.begin (); ledcSetup (0, 25000, 8); ledcAttachPin (25, 0); kašnjenje (5000); Serial.println ("Frekvencija, amplituda"); za (int i = 1; i <100; i ++) {dug potpis bez potpisa = millis (); bezznačno dugo T = millis (); Sp = 0; S = 0; M = 0; Mp = 0; int k = 1; plutajuća norma; while ((T - početak) <1000) {int out = 24 * sin (2 * PI * i * (T - početak) / 1000.0) + 128; ledcWrite (0, izlaz); adc0 = ads.readADC_SingleEnded (0); M = Mp + (adc0 - Mp) / k; Mp = M; S = Sp + (adc0 - Mp) * (adc0 - M); Sp = S; T = milis (); k ++; } if (i == 1) {norma = sqrt (S / k); } Serial.print (i); Serial.print (","); Serial.println (sqrt (S / k) / norma, 3); k = 0; }} void petlja (void) {}
Ovaj kôd će testirati ESP32 propusnost. Uklonite kondenzator ili će rezultati biti isti za obje metode.
#uključi
#uključite oglase Adafruit_ADS1115; / * Koristite ovo za 16-bitnu verziju */ int16_t adc0; int16_t adc1; void setup (void) {float M; plovak Mp = 0; plovak S = 0; plovak Sp = 0; Serial.begin (115200); ads.setGain (GAIN_ONE); // 1x pojačanje +/- 4.096V 1 bit = 2mV 0.125mV ads.begin (); kašnjenje (5000); Serial.println ("Frekvencija, amplituda"); za (int i = 1; i <100; i ++) {dug potpis bez potpisa = millis (); bezznačno dugo T = millis (); Sp = 0; S = 0; M = 0; Mp = 0; int k = 1; plutajuća norma; while ((T - početak) <1000) {int out = 24 * sin (2 * PI * i * (T - početak) / 1000.0) + 128; dacWrite (25, izlaz); adc0 = ads.readADC_SingleEnded (0); M = Mp + (adc0 - Mp) / k; Mp = M; S = Sp + (adc0 - Mp) * (adc0 - M); Sp = S; T = milis (); k ++; } if (i == 1) {norma = sqrt (S / k); } Serial.print (i); Serial.print (","); Serial.println (sqrt (S / k) / norma, 3); k = 0; }} void petlja (void) {}
Korak 5: Zatvaranje misli
Novi DAC dizajn pobjeđuje na linearnosti i šumu, ali gubi na propusnosti. Ovisno o vašoj primjeni, jedan od ovih indeksa može biti važniji od drugog. S ovim postupcima testiranja trebali biste biti u mogućnosti objektivno donijeti tu odluku!
Također, mislim da je ovdje vrijedno istaknuti da bi, s obzirom na to da je izlaz PWM niskog šuma, s iznimnom linearnošću trebalo biti moguće konstruirati DAC puno veće razlučivosti s izlazni signal PWM (možda čak i 16-bitnu preciznost). To će potrajati. Do tada vas pozdravljam!
Preporučeni:
DIY Kako prikazati vrijeme na M5StickC ESP32 pomoću Visuina - jednostavno za napraviti: 9 koraka
DIY Kako prikazati vrijeme na M5StickC ESP32 pomoću Visuina - jednostavno za napraviti: U ovom ćemo vodiču naučiti kako programirati ESP32 M5Stack StickC s Arduino IDE -om i Visuinom za prikaz vremena na LCD -u
Uradi sam -- Kako napraviti Spider robota kojim se može upravljati pomoću pametnog telefona pomoću Arduino Uno: 6 koraka
Uradi sam || Kako napraviti Spider robota koji se može kontrolirati pomoću pametnog telefona pomoću Arduino Uno: Dok izrađujete Spider robota, možete naučiti toliko stvari o robotici. Kao što je izrada robota zabavna, ali i izazovna. U ovom videu pokazat ćemo vam kako napraviti Spider robota, kojim možemo upravljati pomoću našeg pametnog telefona (Androi
Bolji projekti pomoću PCB -a: 6 koraka
Bolji projekti pomoću PCB -a: Ako ste provodili vrijeme radeći na projektima elektronike, znate koliko to može biti zabavno i uzbudljivo. Ništa nije uzbudljivije nego vidjeti kako vaš krug oživljava pred vašim očima. Postaje još uzbudljivije kada se vaš projekt pretvori u
Kako napraviti bespilotnu letjelicu pomoću Arduina UNO - Napravite četverokopter pomoću mikrokontrolera: 8 koraka (sa slikama)
Kako napraviti bespilotnu letjelicu pomoću Arduina UNO | Napravite četverokopter pomoću mikrokontrolera: Uvod Posjetite moj kanal na YouTubeu Drone je vrlo skup gadget (proizvod) za kupnju. U ovom postu ću raspravljati o tome kako to učiniti jeftino ?? I kako možete sami napraviti ovakav po povoljnoj cijeni … Pa u Indiji svi materijali (motori, ESC
Kako testirati bipolarne tranzistore ako imate analogni multimetar: 4 koraka
Kako testirati bipolarne tranzistore ako imate analogni multimetar: Znamo kako tranzistor radi, ali neki od nas zapravo ne znaju testirati samu komponentu. Danas većina digitalnih multimetra ima predviđene utičnice za njihovo testiranje, ali što ćete učiniti ako imate one stare analogne/igle? Ovo je sim