Съдържание:
- Консумативи
- Стъпка 1: Поставяне на платката
- Стъпка 2: Оценете нивото на сигнала към шума
- Стъпка 3: Интегрална нелинейност и диференциална нелинейност
- Стъпка 4: Пропускателна способност
- Стъпка 5: Затваряне на мисли
Видео: Как да направите и тествате по -добър DAC с ESP32: 5 стъпки
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:50
ESP32 има 2 8-битови цифрово-аналогови преобразуватели (DAC). Тези DAC ни позволяват да произвеждаме произволни напрежения в определен диапазон (0-3.3V) с 8 бита резолюция. В този Instructable ще ви покажа как да изградите DAC и да характеризирате неговата производителност, както и да го сравните с ESP32 DAC. Индексите на ефективност, които ще разгледам, включват
- Ниво на шум
- Пропускателна способност
- Интегрална нелинейност
- Диференциална нелинейност
За да тествам тези индекси, ще използвам ADS1115.
Важно е да се отбележи, че вашата оценка на всички тези индекси ще бъде толкова точна, колкото вашето референтно устройство (в този случай ADS115). Например, ADS115 няма 16-битова прецизност, когато става въпрос за изместване и усилване на напрежението. Тези грешки могат да достигнат 0,1%. За много системи тези грешки могат да бъдат пренебрегнати, когато абсолютната точност е от ограничено значение.
Консумативи
- ADS1115
- ESP32 платка
- макет
- джъмперни проводници
- 5 kOhm резистор
- 1 керамичен кондензатор с микрофарад
Стъпка 1: Поставяне на платката
Свържете следните щифтове
Между ESP32 и ADS1115
3v3 VDD
GND GND
GPIO22 SCL
GPIO21 SDA
В ADS1115
ADDR GND (ADS115)
Изработване на DAC
Има много начини да направите DAC. Най-простото е нискочестотният филтър на ШИМ сигнал с резистор и кондензатор. Можех да добавя оп-усилвател тук като буфер, но исках нещата да бъдат прости. Този дизайн е прост и евтин за изпълнение с всеки микроконтролер, който поддържа ШИМ. Няма да разгледам теорията на дизайна тук (google PWM DAC).
Просто свържете GPIO255 KOhm резистор 1 microFarad кондензатор gnd
Сега свържете джъмпер проводник от мястото, където резисторът се среща с кондензатора към A0 на ADS115.
Стъпка 2: Оценете нивото на сигнала към шума
За да оцените нивото на шума, просто стартирайте скрипта по -долу. За да оценим това, просто оставяме DAC на фиксирана стойност и измерваме как напрежението се колебае с течение на времето.
Поради дизайна на DAC, шумът ще бъде най -голям, когато PWM сигналът е на 50% работен цикъл. Следователно тук ще го оценим. Ние също ще оценим ESP32 на същото ниво на сигнала. Ние също така ще филтрираме ESP32 DAC със същия нискочестотен филтър, за да направим измерването сравнимо.
За мен изходът беше ясен. Дизайнът на ШИМ имаше> 6dB по -добър SNR (това е 2 пъти по -добре). Явна победа за новия DAC. Едно леко объркване е, че има вградени филтри в ADC, които определено повишават SNR. Така че абсолютните стойности може да са трудни за тълкуване. Ако бях използвал филтър от втори ред, това нямаше да е така.
Във всеки случай кодът е по -долу
#включва
#включете Adafruit_ADS1115 реклами; // adafruit библиотека за adc int16_t adc0; // void setup (void) {Serial.begin (115200); // Стартиране на сериен ads.setGain (GAIN_TWO); // 2x усилване +/- 2.048V 1 бит = 0.0625mV ads.begin (); // започва adc float M = 0; // начално средно плаващо Mp = 0; // предварителен среден поплавък S = 0; // начален Variance float Sp = 0; // предишна вариация const int reps = 500; // брой повторения int n = 256; // брой проби ledcSetup (0, 25000, 8); // задаваме pwm frequecny = 25000 Hz при 8 битова разделителна способност ledcAttachPin (25, 0); // задаваме pwm на щифт 25 ledcWrite (0, 128); // настройваме на половин работен цикъл (най -голям шум) забавяне (3000); // изчакайте времето за уреждане float snrPWM [повторения]; // масив от snrs за PWM float snrDAC [повторения]; // масив от snrs за DAC за (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 в dB snrPWM = 20 * log10 (3.3 / (sqrt (S / n) *.0625 *.001)); // нулиране на стойности M = 0; Мр = 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; Мр = 0; S = 0; Sp = 0; } // нанесете SNRs на една графика за (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 (void) {}
Стъпка 3: Интегрална нелинейност и диференциална нелинейност
Интегралната нелинейност е мярка за приблизително колко отклонение има между вашето изходно напрежение на DAC и права линия. Колкото по -голямо е това, толкова по -лошо е …
Диференциалната нелинейност е мярка за това приблизително колко наблюдаваната промяна в напрежението (от един код към друг) се отклонява от това, което би се очаквало от права линия.
Резултатите тук бяха наистина интересни. На първо място, и двата имат по-малко от 0.5lsb грешка (при 8-битова резолюция), което е добре, но ШИМ има много по-добра интегрална линейност. И двата имат сравнима диференциална нелинейност, но ESP32 DAC има някои много странни скокове. Нещо повече, PWM методът има известна структура на грешките. По същество той превишава и понижава правилното напрежение по променлив начин.
Подозирам, че това е някаква странна грешка при закръгляване на начина, по който се произвежда 8-битов PWM сигнал на ESP32.
Един от начините за коригиране на това е бързото преминаване между два съседни кода (например 128, 129) с ШИМ. При аналогов нискочестотен филтър получените грешки ще бъдат средни до нула. Симулирах това в софтуера и наистина всички грешки изчезнаха. Сега PWM методът има линейност, която е точна до 16-бита!
Който и да е кодът за генериране на данните е по -долу. Изходът ще бъде на серийния монитор във формат.csv. Просто го копирайте в текстов файл за по -нататъшна обработка.
#включва
#включете Adafruit_ADS1115 реклами; / * Използвайте това за 16-битовата версия */ int16_t adc0; void setup (void) {Serial.begin (115200); ads.setGain (GAIN_ONE); // 2x усилване +/- 2.048V 1 бит = 1mV 0.0625mV 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.print (","); Serial.println (adc0); }} void loop (void) {}
Стъпка 4: Пропускателна способност
Ще дефинирам честотната лента тук като честотата, при която изходът на DAC пада с 3dB. Това е конвенция и до известна степен произволна. Например, в точката 6dB, DAC все още ще извежда сигнал, който ще бъде само ~ 50% амплитуда.
За да измерим това, просто предаваме синусоиди с нарастваща честота от DAC към ADC и измерваме стандартното им отклонение. Не е изненадващо, че 3dB точката е на 30Hz (1/(2*pi*5000*1e-6)).
ESP32 може да прави 1 мега проба в секунда. Това е победа за ESP32. Амплитудата му изобщо не намалява в тестовата зона на честотната лента 100Hz.
Кодът по -долу може да тества PWM DAC честотната лента.
#включва
#включете Adafruit_ADS1115 реклами; / * Използвайте това за 16-битовата версия */ int16_t adc0; int16_t adc1; void setup (void) {float M; поплавък Mp = 0; поплавък S = 0; поплавък Sp = 0; Serial.begin (115200); ads.setGain (GAIN_ONE); // 1x усилване +/- 4.096V 1 бит = 2mV 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 = милис (); Sp = 0; S = 0; М = 0; Мр = 0; int k = 1; плаваща норма; докато ((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; Т = милис (); k ++; } if (i == 1) {норма = sqrt (S / k); } Serial.print (i); Serial.print (","); Serial.println (sqrt (S / k) / норма, 3); k = 0; }} void loop (void) {}
И този код ще тества честотната лента на ESP32. Не забравяйте да премахнете кондензатора или резултатите ще бъдат еднакви и при двата метода.
#включва
#включете Adafruit_ADS1115 реклами; / * Използвайте това за 16-битовата версия */ int16_t adc0; int16_t adc1; void setup (void) {float M; поплавък Mp = 0; поплавък S = 0; поплавък Sp = 0; Serial.begin (115200); ads.setGain (GAIN_ONE); // 1x усилване +/- 4.096V 1 бит = 2mV 0.125mV ads.begin (); забавяне (5000); Serial.println ("Честота, амплитуда"); for (int i = 1; i <100; i ++) {unsigned long start = millis (); без знаци дълъг T = милис (); Sp = 0; S = 0; М = 0; Мр = 0; int k = 1; плаваща норма; докато ((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; Т = милис (); k ++; } if (i == 1) {норма = sqrt (S / k); } Serial.print (i); Serial.print (","); Serial.println (sqrt (S / k) / норма, 3); k = 0; }} void loop (void) {}
Стъпка 5: Затваряне на мисли
Новият DAC дизайн печели от линейността и шума, но губи от честотната лента. В зависимост от приложението ви един от тези индекси може да е по -важен от другия. С тези процедури за тестване трябва да можете да вземете обективно това решение!
Също така, мисля, че си струва да се отбележи тук, че тъй като PWM изходът е с нисък шум, с изключителна линейност би трябвало да е възможно да се конструира много по-висока резолюция на DAC с PWM изход (може би дори 16-битова прецизност). Това ще отнеме известна работа. Дотогава ти казвам сбогом!
Препоръчано:
Как да направите 4G LTE двойна BiQuade антена Лесни стъпки: 3 стъпки
Как да направя 4G LTE двойна BiQuade антена лесни стъпки: През повечето време, с което се сблъсквах, нямам добра сила на сигнала за ежедневните ми работи. Така. Търся и опитвам различни видове антени, но не работи. След загубено време намерих антена, която се надявам да направя и изпробвам, защото тя не градивен принцип
Как да направите брояч на стъпки?: 3 стъпки (със снимки)
Как да си направя брояч на стъпки?: Някога се представях добре в много спортове: ходене, бягане, каране на колело, игра на бадминтон и т.н. Е, вижте дебелото ми коремче … … Е, все пак решавам да рестартирам, за да тренирам. Какво оборудване трябва да подготвя?
Как да направите множество ESP разговори чрез ESP-NOW с помощта на ESP32 и ESP8266: 8 стъпки
Как да направя множество ESP разговори чрез ESP-NOW с помощта на ESP32 и ESP8266: В текущия ми проект се нуждая от множество ESP, за да разговарям помежду си без рутер. За да направя това, ще използвам ESP-NOW, за да направя безжична комуникация помежду си без рутер на ESP
Как да направите видео на разделен екран с четири стъпки: 4 стъпки (със снимки)
Как да направите видео на разделен екран с четири стъпки: Често виждаме едно и също лице да се показва в сцена два пъти в телевизионна пиеса. А доколкото знаем, актьорът няма брат близнак. Гледахме също, че два пеещи клипа се поставят на един екран, за да се сравнят техните певчески умения. Това е силата на spl
Как да тествате биполярни транзистори, ако имате аналогов мултицет: 4 стъпки
Как да тестваме биполярни транзистори, ако имате аналогов мултицет: Ние знаем как работи транзисторът, но някои от нас всъщност не знаят как да тестват самия компонент. В днешно време повечето цифрови мултицети разполагат с гнезда, които да ги тестват, но какво ще направите, ако имате тези стари аналогови/иглени? Това е сим