Mündəricat:

Daha yaxşı bir DAC -ı ESP32 ilə necə sınamaq olar: 5 addım
Daha yaxşı bir DAC -ı ESP32 ilə necə sınamaq olar: 5 addım

Video: Daha yaxşı bir DAC -ı ESP32 ilə necə sınamaq olar: 5 addım

Video: Daha yaxşı bir DAC -ı ESP32 ilə necə sınamaq olar: 5 addım
Video: Mining Pakai Handphone HP, Mining Noble Coin NOBL 2024, Iyul
Anonim
ESP32 ilə daha yaxşı bir DAC -ı necə etmək və sınamaq olar
ESP32 ilə daha yaxşı bir DAC -ı necə etmək və sınamaq olar
ESP32 ilə daha yaxşı bir DAC -ı necə etmək və sınamaq olar
ESP32 ilə daha yaxşı bir DAC -ı necə etmək və sınamaq olar

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ı

Çörək lövhəsinin qoyulması
Çö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

Siqnalın səs -küy səviyyəsinə görə qiymətləndirilməsi
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 və diferensial qeyri -xətti
İ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
Bant

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ə: