Mündəricat:
- Təchizat
- Addım 1: Çörək lövhəsinin qoyulması
- Addım 2: Siqnalın səs -küy səviyyəsinə görə qiymətləndirilməsi
- Addım 3: İnteqral qeyri -xətti və diferensial qeyri -xətti
- Addım 4: Bant genişliyi
- Addım 5: Düşüncələri bağlayın
Video: Daha yaxşı bir DAC -ı ESP32 ilə necə sınamaq olar: 5 addım
2024 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2024-01-30 07:43
ESP32, 2 ədəd 8 bitlik rəqəmsaldan analoqa çeviriciyə (DAC) malikdir. Bu DAC'lar, 8 bit qətnamə ilə müəyyən bir aralıqda (0-3.3V) ixtiyari gərginliklər istehsal etməyə imkan verir. Bu Təlimat kitabında, bir DAC qurmağı və performansını xarakterizə etməyi və ESP32 DAC ilə müqayisə etməyi sizə göstərəcəyəm. Baxacağım performans indeksləri daxildir
- Səs -küy səviyyəsi
- Bant
- İnteqral qeyri -xətilik
- Diferensial qeyri -xətilik
Bu indeksləri yoxlamaq üçün ADS1115 istifadə edəcəyəm.
Qeyd etmək vacibdir ki, bütün bu indeksləri qiymətləndirməyiniz yalnız istinad cihazınız qədər dəqiq olacaq (bu halda ADS115). Məsələn, ADS115, gərginlik ofsetinə və qazancına gəldikdə 16 bit dəqiqliyə malik deyil. Bu səhvlər 0,1%-ə qədər ola bilər. Bir çox sistem üçün mütləq dəqiqlik məhdud narahatlıq doğuranda bu səhvlər göz ardı edilə bilər.
Təchizat
- ADS1115
- ESP32 lövhəsi
- çörək taxtası
- tullanan tellər
- 5 kOhm rezistor
- 1 ədəd mikro Farad keramika kondansatörü
Addım 1: Çörək lövhəsinin qoyulması
Aşağıdakı sancaqları bağlayın
ESP32 ilə ADS1115 arasında
3v3 VDD
GND GND
GPIO22 SCL
GPIO21 SDA
ADS1115 -də
ADDR GND (ADS115)
DAC -ın hazırlanması
DAC yaratmağın bir çox yolu var. Ən sadə bir rezistor və kondansatörlü bir PWM siqnalının aşağı keçid filtridir. Buraya tampon olaraq bir op-amp əlavə edə bilərdim, amma hər şeyi sadə saxlamaq istəyirdim. Bu dizayn, PWM -i dəstəkləyən hər hansı bir mikro nəzarətçi ilə həyata keçirilməsi sadə və ucuzdur. Burada dizayn nəzəriyyəsindən keçməyəcəyəm (google PWM DAC).
Yalnız GPIO255 KOhm rezistor 1 microFarad Capacitor gnd bağlayın
İndi rezistorun kondansatörlə birləşdiyi nöqtədən ADS115 -də A0 -a keçid telini bağlayın.
Addım 2: Siqnalın səs -küy səviyyəsinə görə qiymətləndirilməsi
Səs -küy səviyyəsini qiymətləndirmək üçün aşağıdakı skriptdən istifadə edin. Bunu qiymətləndirmək üçün DAC -ı sabit bir dəyərdə buraxırıq və gərginliyin zamanla necə salındığını ölçürük.
DAC dizaynına görə, PWM siqnalı 50% iş dövrü olduqda səs -küy ən böyük olacaq. Buna görə də qiymətləndirəcəyimiz yer budur. ESP32 -ni də eyni siqnal səviyyəsində qiymətləndirəcəyik. Ölçümü müqayisə etmək üçün ESP32 DAC -ı eyni aşağı keçid filtri ilə süzəcəyik.
Mənim üçün çıxış aydın idi. PWM dizaynında> 6dB daha yaxşı SNR var idi (bu 2 qat daha yaxşıdır). Yeni DAC üçün açıq bir qələbə. Kiçik bir qarışıqlıq, ADC -də SNR -ni mütləq şəkildə artıran filtrlərin olmasıdır. Beləliklə, mütləq dəyərləri şərh etmək çətin ola bilər. İkinci dərəcəli filtrdən istifadə etsəydim, belə olmazdı.
Hər halda kod aşağıda
#daxil edin
#Adafruit_ADS1115 reklamlarını daxil edin; // adc int16_t adc0 üçün adafruit kitabxanası; // void setup (void) {Serial.begin (115200); // Serial ads.setGain (GAIN_TWO) başlayın; // 2x qazanc +/- 2.048V 1 bit = 0.0625mV ads.begin (); // adc floatına başla M = 0; // ilkin orta float Mp = 0; // previouos float S = 0 deməkdir; // ilkin Varians floatı Sp = 0; // əvvəlki variasiya const int reps = 500; // təkrar sayı int n = 256; // nümunələrin sayı ledcSetup (0, 25000, 8); // pwm freececny = 25000 Hz -i 8 bit qətnamə ilə təyin edin ledcAttachPin (25, 0); // pin 25 -də pwm qurmaq ledcWrite (0, 128); // yarı iş dövrü (ən böyük səs -küy) gecikməsinə təyin edin (3000); // həll vaxtını gözləyin float snrPWM [reps]; // PWM float snrDAC [reps] üçün snrs dizisi; // (int i = 0; i <reps; i ++) {// üçün DAC üçün snrs dizisi (int k = 1; k <(n+1); k ++) {// döngələri üzərində nümunələr adc0 = ads.readADC_SingleEnded (0); // oxu almaq M = Mp + (adc0 - Mp) / k; // hesablama yuvarlanan orta Mp = M; // əvvəlki ortalamanı təyin edin S = Sp + (adc0 - Mp) * (adc0 - M); // hesablama yuvarlanma dispersiyası Sp = S; // əvvəlki varyansı təyin edin} // snr dB snrPWM = 20 * log10 (3.3 / (sqrt (S / n) *.0625 *.001)); // dəyərləri sıfırlayın M = 0; Mp = 0; S = 0; Sp = 0; } ledcDetachPin (25); // 25 dacWrite (25, 128) pinindən PWM ayırın; // DAC gecikməsinə yazın (3000); // həllini gözləyin (int i = 0; i <reps; i ++) {// (int k = 1; k <(n+1); k ++) {PWM loopu ilə eynidir {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 -ləri bir qrafik üzərində qurun (int i = 1; i <reps; i ++) {Serial.print ("PWM_SNR (dB):"); Serial.print (snrPWM ); Serial.print (","); Serial.print ("ESP32_SNR (dB):"); Serial.println (snrDAC ); }} boşluq döngəsi (boş) {}
Addım 3: İnteqral qeyri -xətti və diferensial qeyri -xətti
İnteqral qeyri -xətti, DAC çıxış gərginliyinizlə düz bir xətt arasında təxminən nə qədər sapmanın olduğunu göstərən bir ölçüdür. Bu nə qədər böyükdürsə, bir o qədər pisdir…
Diferensial qeyri -xətilik, gərginlikdə (bir koddan digərinə) müşahidə olunan dəyişikliyin düz bir xətdən gözləniləndən nə qədər kənara çıxdığını ölçməkdir.
Buradakı nəticələr həqiqətən maraqlı idi. Hər şeydən əvvəl, hər ikisinin də 0.5lsb-dən az (8 bitlik qətnamədə) səhvləri var, amma PWM-in daha yaxşı inteqral xətti var. Hər ikisinin müqayisə edilə bilən diferensial qeyri -xətti var, lakin ESP32 DAC -ın çox qəribə tırmanışları var. Üstəlik, PWM metodu səhvlərə bəzi quruluşa malikdir. Əslində, alternativ bir şəkildə doğru gerilimi aşır və açır.
Şübhəm, ESP32-də 8 bitlik PWM siqnalının istehsalında qəribə bir yuvarlaqlaşdırma səhvidir.
Bunu düzəltməyin bir yolu, PWM ilə iki bitişik kod (məsələn, 128, 129) arasında sürətlə keçməkdir. Bir analoq aşağı keçid filtri ilə ortaya çıxan səhvlər sıfıra bərabər olacaq. Bunu proqramda simulyasiya etdim və həqiqətən bütün səhvlər yox oldu. İndi PWM metodu 16 bit üçün dəqiq olan xəttiliyə malikdir!
Məlumat yaratmaq üçün hər kəs kodu aşağıda verilmişdir. Çıxış serial monitorda.csv formatında olacaq. Daha çox işləmək üçün onu mətn sənədinə kopyalayın.
#daxil edin
#Adafruit_ADS1115 reklamlarını daxil edin; / * Bunu 16 bitlik versiya üçün istifadə edin */ int16_t adc0; void setup (void) {Serial.begin (115200); ads.setGain (GAIN_ONE); // 2x qazanc +/- 2.048V 1 bit = 1mV 0.0625mV ads.begin (); ledcSetup (0, 25000, 8); ledcAttachPin (25, 0); Serial.println ("Gözlənilən, Müşahidə Edilən"); ledcWrite (0, 2); gecikmə (3000); for (int i = 2; i <255; i ++) {ledcWrite (0, i); gecikmə (100); adc0 = ads.readADC_SingleEnded (0); gözlənilən float = (i / 256.0 * 3.3) / 4.096 * 32767; Serial.print (gözlənilir); Serial.print (","); Serial.println (adc0); }} boşluq döngəsi (boş) {}
Addım 4: Bant genişliyi
Bant genişliyini burada DAC çıxışının 3dB -ə düşmə tezliyi olaraq təyin edəcəyəm. Bu konvensiya və müəyyən dərəcədə ixtiyari bir haldır. Məsələn, 6dB nöqtəsində, DAC hələ də ~ 50% amplituda olacaq bir siqnal çıxaracaq.
Bunu ölçmək üçün sinus dalğalarını DAC -dən ADC -yə artan bir tezlikdə keçiririk və onların standart sapmasını ölçürük. Təəccüblü deyil ki, 3dB nöqtəsi 30Hz-dir (1/(2*pi*5000*1e-6)).
ESP32 saniyədə 1 Mega nümunə edə bilər. Bu, ESP32 üçün əlçatmaz bir qələbədir. 100Hz bant genişliyi test bölgəsində onun amplitudası heç də çürüməz.
Aşağıdakı kod PWM DAC bant genişliyini sınaya bilər.
#daxil edin
#Adafruit_ADS1115 reklamlarını daxil edin; / * Bunu 16 bitlik versiya üçün istifadə edin */ int16_t adc0; int16_t adc1; void quraşdırma (void) {float M; float Mp = 0; float S = 0; float Sp = 0; Serial.begin (115200); ads.setGain (GAIN_ONE); // 1x qazanc +/- 4.096V 1 bit = 2mV 0.125mV ads.begin (); ledcSetup (0, 25000, 8); ledcAttachPin (25, 0); gecikmə (5000); Serial.println ("Tezlik, Genişlik"); for (int i = 1; i <100; i ++) {işarəsiz uzun başlanğıc = millis (); işarəsiz uzun T = millis (); Sp = 0; S = 0; M = 0; Mp = 0; int k = 1; üzmə norması; while ((T - start) <1000) {int out = 24 * sin (2 * PI * i * (T - start) / 1000.0) + 128; ledcWrite (0, çıxdı); adc0 = ads.readADC_SingleEnded (0); M = Mp + (adc0 - Mp) / k; Mp = M; S = Sp + (adc0 - Mp) * (adc0 - M); Sp = S; T = milis (); k ++; } əgər (i == 1) {norm = sqrt (S / k); } Serial.print (i); Serial.print (","); Serial.println (sqrt (S / k) / norm, 3); k = 0; }} boşluq döngəsi (boş) {}
Və bu kod ESP32 bant genişliyini sınayacaq. Kondansatörü çıxardığınızdan əmin olun, yoxsa nəticələr hər iki üsul üçün eyni olacaq.
#daxil edin
#Adafruit_ADS1115 reklamlarını daxil edin; / * Bunu 16 bitlik versiya üçün istifadə edin */ int16_t adc0; int16_t adc1; void quraşdırma (void) {float M; float Mp = 0; float S = 0; float Sp = 0; Serial.begin (115200); ads.setGain (GAIN_ONE); // 1x qazanc +/- 4.096V 1 bit = 2mV 0.125mV ads.begin (); gecikmə (5000); Serial.println ("Tezlik, Genişlik"); for (int i = 1; i <100; i ++) {işarəsiz uzun başlanğıc = millis (); işarəsiz uzun T = millis (); Sp = 0; S = 0; M = 0; Mp = 0; int k = 1; üzmə norması; while ((T - start) <1000) {int out = 24 * sin (2 * PI * i * (T - start) / 1000.0) + 128; dacWrite (25, çıxdı); adc0 = ads.readADC_SingleEnded (0); M = Mp + (adc0 - Mp) / k; Mp = M; S = Sp + (adc0 - Mp) * (adc0 - M); Sp = S; T = milis (); k ++; } əgər (i == 1) {norm = sqrt (S / k); } Serial.print (i); Serial.print (","); Serial.println (sqrt (S / k) / norm, 3); k = 0; }} boşluq döngəsi (boş) {}
Addım 5: Düşüncələri bağlayın
Yeni DAC dizaynı xətti və səs -küyə görə qalib gəlir, lakin bant genişliyinə görə itirir. Tətbiqinizə görə bu indekslərdən biri digərindən daha vacib ola bilər. Bu test prosedurları ilə obyektiv olaraq bu qərarı verməyi bacarmalısınız!
Ayrıca, PWM çıxışı aşağı səs-küy olduğundan, müstəsna xətti olması ilə, PWM çıxışı ilə (bəlkə də 16 bitlik dəqiqliklə) daha yüksək qətnamə DAC qurmaq mümkün olacağını da burada qeyd etməyə dəyər. Bunun üçün bir az iş lazım olacaq. O vaxta qədər sənə bir şey deyərəm!
Tövsiyə:
Dar Bant IoT: Ağıllı İşıqlandırma və Ölçmə daha yaxşı və daha sağlam bir ekosistemə yol açır: 3 addım
Dar Bant IoT: Ağıllı İşıqlandırma və Ölçmə daha yaxşı və daha sağlam bir ekosistemə yol açır: Avtomatika demək olar ki, hər sektorda öz yerini tapmışdır. İstehsaldan başlayaraq səhiyyəyə, nəqliyyata və təchizat zəncirinə qədər avtomatlaşdırma günün işığını gördü. Şübhəsiz ki, bunların hamısı cazibədardır, amma görünən biri var
Dinamikinizi necə daha yaxşı etmək olar ?: 4 addım
Dinamikinizi necə daha yaxşı etmək olar ?: Dinamikimi daha yaxşı etmək istəyirəm, çünki bu problem mənim spikerimin aralığına malik deyildi. Məsələn, hovuzda olanda və o biri tərəfə üzəndə musiqini bir tərəfdən o biri tərəfə çalıram. Bunun xüsusi olduğunu düşünürəm, çünki düşünürəm ki
Pulsuz komponentləri necə sınamaq və əldə etmək olar: 5 addım
Pulsuz Komponentləri Necə Denəmək və Əldə etmək olar: bəzən pulunuz yoxdur, amma yaraşıqlı bir şey qurmaq istəyirsiniz. burada sizə kömək edəcək bir bələdçi var
Klipinizi necə daha yaxşı etmək olar Tek Gun: 4 addım
Klip Tek Gününüzü Daha Yaxşı Niyyətləndirmək üçün: Deməli, Clip Tek silahınızın daha yaxşı bir məqsədi olmasını istəyirsiniz? sənə bunu necə edəcəyimi söyləyəcəyəm. Məqsədinizi yaxşılaşdırmağın ən yaxşı yolu lazer nişanlayıcı istifadə etməkdir. 10 dollardan aşağıya başa gələcək
YENİLƏNİB !!!! Kağızlardan daha yaxşı və daha sürətli ucuz və asan WIFI Anten Siqnal Gücləndiricisi !!!: 9 addım
YENİLƏNİB !!!! Kağızlardan daha yaxşı və daha sürətli olan ucuz və asan WIFI Anten Siqnal Gücləndiricisi!: WIFI siqnalınızı yaxşılaşdırmaq üçün köhnə bir fikir üzərində yeni bir yelləncək