Мазмуну:
- Жабдуулар
- 1 -кадам: Нан тактасын коюу
- 2 -кадам: сигналды ызы -чуу деңгээлине баалоо
- 3 -кадам: Интегралдык сызыктуу эмес жана дифференциалдык сызыктуу эмес
- 4 -кадам: өткөрүү жөндөмдүүлүгү
- 5 -кадам: Жыйынтыктоочу ойлор
Video: Кантип ESP32 менен жакшыраак DAC жасоо жана текшерүү: 5 кадам
2024 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2024-01-30 10:36
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 -кадам: өткөрүү жөндөмдүүлүгү
Мен бул жерде өткөрүү жөндөмдүүлүгүн 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-бит тактык). Бул бир аз эмгекти талап кылат. Ага чейин, мен сага сунуштайм!
Сунушталууда:
Өзгөчө PCB формаларын кантип жасоо керек (Inkscape жана Fritzing менен): 4 кадам (Сүрөттөр менен)
Өзгөчөлөнгөн PCB формаларын кантип жасоо керек (Inkscape жана Fritzing менен): Эгерде сиз жаңыдан баштасаңыз жана ыңгайлаштырылган формага ээ болгон ПХБга муктаж болсоңуз … жана аны мүмкүн болушунча кыска мөөнөттө керек … ЖЕ эгер сиз өнүккөн программалар менен иштөөнү үйрөнүү үчүн көп убакыт, анткени сиз акыры тактай же башка жасайсыз … бул
Arduino жана TFT дисплейин колдонуу менен кантип реалдуу убакытты жасоо керек - Arduino Mega RTC 3.5 дюймдук TFT дисплейи менен: 4 кадам
Arduino жана TFT дисплейин колдонуу менен кантип реалдуу убакытты жасоо керек | 3.5 дюймдук TFT дисплейи бар Arduino Mega RTC: Менин Youtube каналыма баш багыңыз:- Бул постто мен 3,5 дюймдук TFT сенсордук ЖК, "Arduino Mega" менен "Реалдуу убакыт саатын" жасайм. 2560 жана DS3231 RTC модулу …. .Баштар алдында… менин YouTube каналымдагы видеону текшериңиз .. Эскертүү:- Эгерде сиз Arduin колдонуп жатсаңыз
Тинкеркадды кантип колдонсоңуз болот? Аппаратты текшерүү жана ишке ашыруу: 5 кадам (Сүрөттөр менен)
Тинкеркадды кантип колдонсоңуз болот: Аппаратты тестирлөө жана ишке ашыруу: Райондук симуляция - бул компьютердик программа электрондук схеманын же тутумдун жүрүм -турумун окшоштуруучу техника. Жаңы конструкцияларды чындыгында схеманы же системаны курбастан эле сынап, баалоого жана диагноз коюуга болот. Райондук симуляция болушу мүмкүн
ПКБны кантип кол менен текшерүү керек: 5 кадам
ПКБны кол менен кантип текшерүү керек: Бул Нускамада сиз басылган электр тактасын кол менен визуалдык текшерүү үчүн кантип туура орнотууну үйрөнөсүз
Sony гарнитурасы джекти алмаштыруу - жакшыраак жана күчтүү: 10 кадам (сүрөттөр менен)
Sony гарнитурасы джекти алмаштыруу - жакшыраак жана күчтүү: көпчүлүк гарнитуралар жеңил, жакшы угулат жана сайгычтан чыгып кетүү үчүн иштелип чыккан. Бул кадамдар гарнитуранын көпчүлүк моделдери үчүн колдонулушу мүмкүн. Абдан арзан гарнитуралар үчүн зымдар иштөө үчүн өтө кичинекей (кичинекей) болуп калат, бул инструкция үчүн мен