Агуулгын хүснэгт:
- Хангамж
- Алхам 1: Талхны самбар тавих
- Алхам 2: Дуу чимээний түвшинг дохиог үнэлэх
- Алхам 3: Интеграл шугаман бус ба дифференциал шугаман бус байдал
- Алхам 4: зурвасын өргөн
- Алхам 5: Хаалтын бодол
Видео: ESP32: 5 алхамаар илүү сайн DAC -ийг хэрхэн хийх, турших
2024 Зохиолч: John Day | [email protected]. Хамгийн сүүлд өөрчлөгдсөн: 2024-01-30 11:01
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 битийн нарийвчлалтай ч байж магадгүй) гэдгийг энд онцлох нь зүйтэй болов уу гэж бодож байна. Энэ нь жаахан ажил шаардах болно. Тэр болтол би чамд санал болгож байна!
Зөвлөмж болгож буй:
Arduino Volt Meter (0-100V DC) - Хувилбар 2 (илүү сайн): 3 алхам
Arduino Volt Meter (0-100V DC)-Хувилбар 2 (илүү сайн): Энэхүү зааварчилгаанд би Arduino Nano болон ADS 1115 ADC ашиглан DC (0-100v) өндөр хүчдэлийг харьцангуй нарийвчлалтай, нарийвчлалтай хэмжих вольтметрийг бүтээсэн. .Энэ бол миний өмнө зааж өгсөн вольтметрийн хоёр дахь хувилбар юм: https: // ww
Илүү сайн матрын клип: 3 алхам (зурагтай)
Илүү сайн матрын клип: Намайг бага байхад матрын клип хүнд, сайн ажилладаг байсан. Тэд шураг терминал, сайн булагтай хүнд гангаар хийгдсэн байв. Одоо матрын хавчаарууд нь эрүү нь өчүүхэн жижиг нүхтэй цус багадалт юм. Би илүү сайн матар cl хүсч байна
Зааварчилгаа хийх файлуудыг үзэх/баримтжуулах илүү сайн арга: 4 алхам
Зааварчилгаа хийх боломжтой файлуудыг үзэх/баримтжуулах илүү сайн арга: Хүмүүс ихэвчлэн Instructables -ийг ашиглан төслийн файлуудыг оруулдаг.Ихэнх тохиолдолд програм хангамжийн эх файлууд нь зааварлагчдын цохилж буй зүрх байж болно. Гэхдээ Instructables нь уншигчдад кодыг унших, хянахад хялбар аргыг өгдөггүй. (
Илтгэгчээ хэрхэн илүү сайн болгох вэ ?: 4 алхам
Илтгэгчээ хэрхэн яаж сайжруулах вэ? Жишээлбэл, би усан санд байхдаа нөгөө тал руугаа сэлж байхдаа нэг талаас нөгөөдөх хөгжим сонсогддоггүй. Энэ бол онцгой зүйл гэж би бодож байна, учир нь би
Тек Ган клипээ хэрхэн илүү сайн болгох вэ: 4 алхам
Тек бууны клипээ хэрхэн илүү сайн болгох вэ: Тэгэхээр та клипээ илүү сайн болгохыг хүсч байна уу? Би үүнийг яаж хийхийг танд хэлэх болно. Зорилгоо сайжруулах хамгийн сайн арга бол лазер ашиглах явдал юм. энэ нь танд 10 доллараас бага үнэтэй байх болно