Мазмуну:

Кантип ESP32 менен жакшыраак DAC жасоо жана текшерүү: 5 кадам
Кантип ESP32 менен жакшыраак DAC жасоо жана текшерүү: 5 кадам

Video: Кантип ESP32 менен жакшыраак DAC жасоо жана текшерүү: 5 кадам

Video: Кантип ESP32 менен жакшыраак DAC жасоо жана текшерүү: 5 кадам
Video: Output DC or AC Voltage using MCP4725 DAC with LCD and PWM to Voltage Converter with Arduino 2024, Июль
Anonim
Кантип ESP32 менен жакшыраак DAC жасоо жана тестирлөө
Кантип ESP32 менен жакшыраак DAC жасоо жана тестирлөө
Кантип ESP32 менен жакшыраак DAC жасоо жана тестирлөө
Кантип ESP32 менен жакшыраак DAC жасоо жана тестирлөө

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

  • Ызы -чуу деңгээли
  • Bandwidth
  • Интегралдык сызыксыздык
  • Дифференциалдык сызыксыздык

Бул индекстерди текшерүү үчүн мен 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 жасоонун көптөгөн жолдору бар. Эң жөнөкөй-резистор жана конденсатор менен PWM сигналын аз өткөрмө чыпкадан өткөрүү. Мен буфер катары бул жерге оп-ампти кошо алмакмын, бирок жөнөкөй болгум келди. Бул дизайн PWM колдогон ар кандай микроконтроллер менен ишке ашыруу үчүн жөнөкөй жана арзан. Мен бул жерде дизайн теориясынан өтпөйм (google PWM DAC).

Жөн гана GPIO255 KOhm каршылыгын 1 microFarad Capacitor gnd туташтырыңыз

Эми резистор ADS115теги A0 конденсаторуна жооп берген жерден секирүүчү зымды туташтырыңыз.

2 -кадам: сигналды ызы -чуу деңгээлине баалоо

Ызы -чуу деңгээлине сигналды баалаңыз
Ызы -чуу деңгээлине сигналды баалаңыз

Ызы -чуу деңгээлин баалоо үчүн жөн гана төмөнкү скриптти иштетиңиз. Муну баалоо үчүн, биз жөн гана белгиленген баада DAC таштап, убакыттын өтүшү менен чыңалуу кантип термелет өлчөө.

DACтин дизайнына байланыштуу, PWM сигналы 50% кызмат циклинде болгондо, ызы -чуу эң чоң болот. Ошондуктан бул жерде биз баа беребиз. Биз ESP32ди ушул эле сигнал деңгээлинде баалайбыз. Биз ошондой эле өлчөөнү салыштырмалуу кылуу үчүн ESP32 DACды ошол эле төмөн чыпкасы менен чыпкалайбыз.

Мен үчүн жыйынтык так болду. PWM дизайны> 6dB жакшыраак SNRге ээ болгон (бул 2 эсе жакшы). Жаңы DAC үчүн ачык жеңиш. Бир аз баш аламандык, ADCге курулган чыпкалар бар, алар SNRди сөзсүз жакшыртат. Ошентип, абсолюттук баалуулуктарды чечмелөө кыйын болушу мүмкүн. Эгерде мен экинчи даражадагы чыпканы колдонгондо, мындай болмок эмес.

Баары бир код төмөндө

#кошуу

#Adafruit_ADS1115 жарнактарын кошуу; // adaf 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 freecny = 25000 Гцти 8 битке чейин чыгаруу ledcAttachPin (25, 0); // pin 25ке pwm коюу ledcWrite (0, 128); // аны жарым кызмат циклине коюңуз (эң чоң ызы -чуу) кечигүү (3000); // чечилүүчү убакытты күтө туруңуз snrPWM [reps]; // PWM float snrDAC [reps] үчүн snrs массиви; // DAC үчүн snrs массиви (int i = 0; i <reps; i ++) {// кайталоолордун үстүнөн loop = 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; Mp = 0; S = 0; Sp = 0; } ledcDetachPin (25); // PWMди 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)); M = 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 (дБ):"); Serial.println (snrDAC ); }} боштук цикл (жараксыз) {}

3 -кадам: Интегралдык сызыктуу эмес жана дифференциалдык сызыктуу эмес

Интегралдык сызыксыздык жана дифференциалдык сызыксыздык
Интегралдык сызыксыздык жана дифференциалдык сызыксыздык

Интегралдык сызыксыздык - бул сиздин DAC чыгаруу чыңалууңуз менен түз сызыктын ортосунда канчалык четтөө бар экенин өлчөөчү нерсе. Бул канчалык чоң болсо, ошончолук жаман болот …

Дифференциалдык сызыксыздык - бул чыңалуунун байкалган өзгөрүүсү (бир коддон экинчисине чейин) түз сызыктан күтүлгөндөн канчалык четтеп кеткенин өлчөөчү көрсөткүч.

Бул жердеги жыйынтыктар чынында эле кызыктуу болду. Биринчиден, экөөнүн тең 0.5lsb кем эмес катасы бар (8-биттик чечилиште), бирок бул жакшы, бирок PWMде интегралдык линиялык сапаты жакшыраак. Экөөнүн тең окшош дифференциалдык эмес сапаттары бар, бирок ESP32 DAC кээ бир таң калыштуу чукулдарга ээ. Анын үстүнө, PWM ыкмасы каталардын кандайдыр бир структурасына ээ. Негизинен ал туура чыңалууну алмаштырып турат.

Менин шектенүүм-бул ESP32де 8-бит PWM сигналы кандайча өндүрүлгөндүгүндө кызыктай тегеректөө катасы.

Муну оңдоонун бир жолу - PWM менен чектеш эки коддун (мисалы, 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); }} боштук цикл (жараксыз) {}

4 -кадам: өткөрүү жөндөмдүүлүгү

Bandwidth
Bandwidth

Мен бул жерде өткөрүү жөндөмдүүлүгүн DACтин чыгышы 3dB түшүүчү жыштык катары аныктайм. Бул конвенция жана кандайдыр бир деңгээлде өзүм билемдик. Мисалы, 6dB чекитинде, DAC дагы эле 50% амплитудага чейин сигнал берет.

Муну өлчөө үчүн биз синус толкундарын DACтан ADCге көбөйгөн жыштыкта өткөрүп, алардын стандарттык четтөөсүн өлчөйбүз. Таң калыштуусу, 3dB чекити 30 Гцте (1/(2*pi*5000*1e-6)).

ESP32 секундасына 1 Mega үлгүсүн жасай алат. Бул ESP32 үчүн жеңиш. Анын амплитудасы 100 Гц өткөрүү жөндөмдүүлүгүнүн сыноо аймагында такыр чирибейт.

Төмөндөгү код PWM DAC өткөрүү жөндөмдүүлүгүн текшере алат.

#кошуу

#Adafruit_ADS1115 жарнактарын кошуу; / * Муну 16 биттик версия үчүн колдонуңуз */ int16_t adc0; int16_t adc1; void setup (void) {float M; калкыма Mp = 0; float S = 0; float Sp = 0; Serial.begin (115200); ads.setGain (GAIN_ONE); // 1x пайда +/- 4.096V 1 бит = 2мВ 0.125мВ 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; M = 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; }} боштук цикл (жараксыз) {}

Жана бул код ESP32 өткөрүү жөндөмдүүлүгүн текшерет. Конденсаторду алып салганыңызды текшериңиз, болбосо эки ыкма үчүн жыйынтык бирдей болот.

#кошуу

#Adafruit_ADS1115 жарнактарын кошуу; / * Муну 16 биттик версия үчүн колдонуңуз */ int16_t adc0; int16_t adc1; void setup (void) {float M; калкыма Mp = 0; float S = 0; float Sp = 0; Serial.begin (115200); ads.setGain (GAIN_ONE); // 1x пайда +/- 4.096V 1 бит = 2мВ 0.125мВ ads.begin (); кечигүү (5000); Serial.println ("Жыштык, Амплитуда"); for (int i = 1; i <100; i ++) {unsigned long start = millis (); белгисиз узун T = millis (); Sp = 0; S = 0; M = 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; }} боштук цикл (жараксыз) {}

5 -кадам: Жыйынтыктоочу ойлор

Жаңы DAC дизайны сызыктуу жана ызы -чуу боюнча жеңет, бирок өткөрүү жөндөмдүүлүгүн жоготот. Колдонмоңузга жараша бул индекстердин бири экинчисине караганда маанилүү болушу мүмкүн. Бул тестирлөө процедуралары менен, сиз объективдүү түрдө бул чечимди кабыл алышыңыз керек!

Ошондой эле, мен бул жерде белгилеп кетүү керек деп ойлойм, анткени PWM өндүрүшү аз ызы-чуу болгондуктан, өзгөчө линиялыктык менен PWM өндүрүмү менен бир топ жогорку DACти куруу мүмкүн болушу мүмкүн (балким 16-бит тактык). Бул бир аз эмгекти талап кылат. Ага чейин, мен сага сунуштайм!

Сунушталууда: