Агуулгын хүснэгт:

ESP32: 5 алхамаар илүү сайн DAC -ийг хэрхэн хийх, турших
ESP32: 5 алхамаар илүү сайн DAC -ийг хэрхэн хийх, турших

Видео: ESP32: 5 алхамаар илүү сайн DAC -ийг хэрхэн хийх, турших

Видео: ESP32: 5 алхамаар илүү сайн DAC -ийг хэрхэн хийх, турших
Видео: Equipment Corner - Steppers 2024, Арваннэгдүгээр
Anonim
ESP32 ашиглан илүү сайн DAC -ийг хэрхэн хийх, турших
ESP32 ашиглан илүү сайн DAC -ийг хэрхэн хийх, турших
ESP32 ашиглан илүү сайн DAC -ийг хэрхэн хийх, турших
ESP32 ашиглан илүү сайн DAC -ийг хэрхэн хийх, турших

ESP32 нь 2 8 битийн тооноос аналог хөрвүүлэгчтэй (DACs). Эдгээр DAC нь бидэнд 8 битийн нарийвчлалтай дурын хүчдэлийг тодорхой хязгаарт (0-3.3V) гаргах боломжийг олгодог. Энэхүү зааварчилгаанд би DAC -ийг хэрхэн бүтээх, түүний гүйцэтгэлийг тодорхойлох, мөн ESP32 DAC -тэй харьцуулах талаар танд үзүүлэх болно. Миний авч үзэх гүйцэтгэлийн индексүүд багтана

  • Дуу чимээний түвшин
  • Зурвасын өргөн
  • Интеграл шугаман бус байдал
  • Дифференциал шугаман бус байдал

Эдгээр индексийг шалгахын тулд би ADS1115 -ийг ашиглах болно.

Эдгээр бүх индексийн үнэлгээ нь зөвхөн таны лавлах төхөөрөмжтэй яг адилхан байх болно гэдгийг анхаарах нь чухал юм (энэ тохиолдолд ADS115). Жишээлбэл, ADS115 нь хүчдэлийн орлого, ашиг орлогын хувьд 16 битийн нарийвчлалтай байдаггүй. Эдгээр алдаа нь 0.1%хүртэл байж болно. Олон системийн хувьд үнэмлэхүй нарийвчлал нь хязгаарлагдмал асуудалтай байгаа тохиолдолд эдгээр алдааг үл тоомсорлож болно.

Хангамж

  • ADS1115
  • ESP32 самбар
  • талх
  • холбогч утас
  • 5 кОм эсэргүүцэл
  • 1 микро Фарад керамик конденсатор

Алхам 1: Талхны самбар тавих

Талхны самбарыг байрлуулах
Талхны самбарыг байрлуулах

Дараах тээглүүрүүдийг утсаар холбоно уу

ESP32 ба ADS1115 хооронд

3v3 VDD

GND GND

GPIO22 SCL

GPIO21 SDA

ADS1115 дээр

ADDR GND (ADS115)

DAC хийх

DAC хийх олон арга бий. Хамгийн энгийн нь резистор ба конденсатор бүхий ХОУХ-ны дохиог бага нэвтрүүлэх шүүлтүүрээр хийх явдал юм. Би энд op-amp-ийг буфер болгон нэмж болох байсан ч бүх зүйлийг энгийн байлгахыг хүссэн. Энэхүү загварыг ХОУХ -ийг дэмждэг аливаа микроконтроллерийн тусламжтайгаар хэрэгжүүлэхэд хялбар бөгөөд хямдхан юм. Би энд дизайны онолыг дамжуулахгүй (google PWM DAC).

GPIO255 KOhm эсэргүүцэл 1 microFarad Capacitor gnd -ийг холбоно уу

Одоо резистор нь конденсаторыг ADS115 дээрх A0 -тэй холбосон цэгээс холбогч утсыг холбоно уу.

Алхам 2: Дуу чимээний түвшинг дохиог үнэлэх

Дуу чимээний түвшинд дохиог үнэлэх
Дуу чимээний түвшинд дохиог үнэлэх

Дуу чимээний түвшинг үнэлэхийн тулд доорх скриптийг ажиллуулна уу. Үүнийг үнэлэхийн тулд бид DAC -ийг тогтмол утгаар нь үлдээж, хүчдэл цаг хугацааны явцад хэрхэн хэлбэлздэгийг хэмждэг.

DAC -ийн дизайнаас шалтгаалан ХОУХ -ны дохио 50% -ийн ажлын мөчлөгийн үед дуу чимээ хамгийн их байх болно. Тиймээс энд бид үүнийг үнэлэх болно. Бид ESP32 -ийг ижил дохионы түвшинд үнэлэх болно. Хэмжилтийг харьцуулахын тулд бид ESP32 DAC -ийг ижил нэвтрүүлэх шүүлтүүрээр шүүнэ.

Миний хувьд гарц нь тодорхой байсан. ХОУХ -ны дизайн нь> 6dB илүү сайн SNR -тэй байсан (энэ нь 2 дахин сайн). Шинэ DAC -ийн хувьд тодорхой ялалт. Бага зэрэг ойлгомжгүй зүйл бол ADC -д суурилуулсан шүүлтүүрүүд байдаг бөгөөд эдгээр нь SNR -ийг сайжруулж байгаа юм. Тиймээс үнэмлэхүй утгыг тайлбарлахад хэцүү байж магадгүй юм. Хэрэв би хоёрдахь зэрэглэлийн шүүлтүүр ашигласан бол ийм зүйл болохгүй.

Ямар ч байсан код доор байна

#оруулах

#Adafruit_ADS1115 зар оруулах; // adc int16_t adc0 -д зориулсан adafruit номын сан; // void setup (void) {Serial.begin (115200); // Цуваа ads.setGain (GAIN_TWO) эхлүүлэх; // 2x ашиг +/- 2.048V 1 бит = 0.0625mV ads.begin (); // эхлэх adc float M = 0; // анхны дундаж хөвөгч Mp = 0; // previouos гэдэг нь хөвөх утгыг илэрхийлнэ S = 0; // анхны Variance float Sp = 0; // өмнөх дисперс const int reps = 500; // давталтын тоо int n = 256; // дээжийн тоо ledcSetup (0, 25000, 8); // тохируулах pwm давтамж = 25000 Гц 8 битийн нарийвчлалтайгаар ledcAttachPin (25, 0); // 25 -р зүү дээр pwm тохируулах ledcWrite (0, 128); // үүнийг хагас ажлын мөчлөгт тохируулах (хамгийн том дуу чимээ) саатал (3000); // тогтох хугацааг хүлээх float snrPWM [reps]; // PWM float snrDAC [reps] -д зориулсан олон тооны snrs; // DAC -ийн snrs массив (int i = 0; i <reps; i ++) {// давталтын давталт (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; // өмнөх дисперсийг тохируулах} // snr in dB snrPWM = 20 * log10 (3.3 / (sqrt (S / n) *.0625 *.001)); // утгыг дахин тохируулах M = 0; Mp = 0; S = 0; Sp = 0; } ledcDetachPin (25); // 25 dacWrite (25, 128) зүүгээс ХОУХ -ийг салгах; // DAC саатал руу бичих (3000); // (int i = 0; i <reps; 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)); М = 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 ); }} void loop (хүчингүй) {}

Алхам 3: Интеграл шугаман бус ба дифференциал шугаман бус байдал

Интеграл шугаман бус ба дифференциал шугаман бус байдал
Интеграл шугаман бус ба дифференциал шугаман бус байдал

Интеграл шугаман бус байдал нь таны DAC гаралтын хүчдэл ба шулуун шугамын хооронд хэр их хазайлт байгааг хэмждэг. Энэ нь том байх тусам улам дордох болно …

Дифференциал шугаман бус байдал нь хүчдэлийн ажиглагдсан өөрчлөлт (нэг кодоос нөгөө рүү шилжих) нь шулуун шугамаас хүлээгдэж буй хэмжээнээс хэр их зөрж байгааг хэмжих хэмжүүр юм.

Энд гарсан үр дүн үнэхээр сонирхолтой байсан. Нэгдүгээрт, хоёулаа 0.5 лс-ээс бага алдаатай (8 битийн нягтралтай) сайн боловч ХОУХ нь илүү сайн интеграл шугаман шинж чанартай байдаг. Аль аль нь шугаман бус дифференциал ялгаатай боловч ESP32 DAC нь маш хачирхалтай огцом өсөлттэй байдаг. Үүнээс гадна ХОУХ -ны арга нь алдааны зарим бүтэцтэй байдаг. Үндсэндээ энэ нь ээлжлэн зөв хүчдэлийг хэтрүүлж, доогуур харуулдаг.

Миний сэжиглэж байгаа зүйл бол ESP32 дээр 8 битийн ХОУХШ-ийн дохиог хэрхэн үйлдвэрлэх талаар хийсэн дугуй хэлбэрийн алдаа юм.

Үүнийг засах нэг арга бол ХОУХ -тэй хоёр зэргэлдээ кодын хооронд хурдан эргэлт хийх (жишээлбэл 128, 129). Аналог бага дамжуулалтын шүүлтүүртэй бол алдаа нь дунджаар тэг болно. Би үүнийг програм хангамж дээр дуурайсан бөгөөд үнэхээр бүх алдаа алга болсон. Одоо ХОУХ-ны арга нь 16 битийн нарийвчлалтай шугаман шинж чанартай болсон!

Өгөгдөл үүсгэх кодын хэнийг ч доор үзүүлэв. Гаралт нь цуваа дэлгэц дээр.csv форматтай байх болно. Үүнийг цаашид боловсруулахын тулд текст файл руу хуулна уу.

#оруулах

#Adafruit_ADS1115 зар оруулах; / * Үүнийг 16 битийн хувилбарт ашиглах */ int16_t adc0; void setup (void) {Serial.begin (115200); ads.setGain (GAIN_ONE); // 2х олз +/- 2.048V 1 бит = 1мВ 0.0625мВ ads.begin (); ledcSetup (0, 25000, 8); ledcAttachPin (25, 0); Serial.println ("Хүлээгдэж буй, ажиглагдсан"); ledcWrite (0, 2); саатал (3000); for (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.println (adc0); }} void loop (хүчингүй) {}

Алхам 4: зурвасын өргөн

Зурвасын өргөн
Зурвасын өргөн

Би энд зурвасын өргөнийг DAC -ийн гаралт 3dB -ээр буурах давтамж гэж тодорхойлох гэж байна. Энэ бол уламжлал бөгөөд тодорхой хэмжээгээр дур зоргоороо байдаг. Жишээлбэл, 6dB цэг дээр DAC нь ~ 50% далайцтай байх дохиог гаргасаар байх болно.

Үүнийг хэмжихийн тулд бид синус долгионыг DAC -ээс ADC руу тогтмол давтамжтайгаар дамжуулж, стандарт хазайлтыг хэмждэг. 3dB цэг нь 30 Гц (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; Цуваа.begin (115200); ads.setGain (GAIN_ONE); // 1х ашиг +/- 4.096V 1 бит = 2мВ 0.125mV ads.begin (); ledcSetup (0, 25000, 8); ledcAttachPin (25, 0); саатал (5000); Serial.println ("Давтамж, далайц"); for (int i = 1; i <100; i ++) {unsigned long start = millis (); тэмдэггүй урт T = millis (); Sp = 0; S = 0; М = 0; Mp = 0; int k = 1; хөвөх норм; while ((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 = миллис (); k ++; } if (i == 1) {norm = sqrt (S / k); } Serial.print (i); Serial.print (","); Serial.println (sqrt (S / k) / норм, 3); k = 0; }} void loop (хүчингүй) {}

Мөн энэ код нь ESP32 зурвасын өргөнийг шалгах болно. Конденсаторыг зайлуулахаа мартуузай, эс тэгвээс үр дүн нь хоёуланд нь адилхан байх болно.

#оруулах

#Adafruit_ADS1115 зар оруулах; / * Үүнийг 16 битийн хувилбарт ашиглах */ int16_t adc0; int16_t adc1; void setup (void) {float M; хөвөх Mp = 0; хөвөх S = 0; хөвөгч Sp = 0; Цуваа.begin (115200); ads.setGain (GAIN_ONE); // 1х олз +/- 4.096V 1 бит = 2мВ 0.125mV ads.begin (); саатал (5000); Serial.println ("Давтамж, далайц"); for (int i = 1; i <100; i ++) {unsigned long start = millis (); тэмдэггүй урт T = millis (); Sp = 0; S = 0; М = 0; Mp = 0; int k = 1; хөвөх норм; while ((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 = миллис (); k ++; } if (i == 1) {norm = sqrt (S / k); } Serial.print (i); Serial.print (","); Serial.println (sqrt (S / k) / норм, 3); k = 0; }} void loop (хүчингүй) {}

Алхам 5: Хаалтын бодол

Шинэ DAC загвар нь шугаман байдал, дуу чимээгээр ялдаг боловч зурвасын өргөний хувьд алдагддаг. Таны хэрэглээнээс хамааран эдгээр индексүүдийн нэг нь нөгөөгөөсөө илүү чухал байж магадгүй юм. Эдгээр туршилтын процедурын тусламжтайгаар та энэ шийдвэрийг бодитойгоор гаргах боломжтой байх ёстой!

Түүнчлэн, ХОУХ-ны гаралт нь дуу чимээ багатай, онцгой шугаман шинж чанартай тул ХОУХ-ны гаралттай хамаагүй өндөр нарийвчлалтай DAC бүтээх боломжтой (магадгүй 16 битийн нарийвчлалтай ч байж магадгүй) гэдгийг энд онцлох нь зүйтэй болов уу гэж бодож байна. Энэ нь жаахан ажил шаардах болно. Тэр болтол би чамд санал болгож байна!

Зөвлөмж болгож буй: