Мазмұны:
- Жабдықтар
- 1 -қадам: Нан тақтасын орналастыру
- 2 -қадам: сигналды шу деңгейіне бағалаңыз
- 3 -қадам: Интегралды сызықтық емес және дифференциалды сызықтық емес
- 4 -қадам: өткізу қабілеті
- 5 -қадам: Қорытынды ойлар
Бейне: ESP32: 5 қадамымен жақсы DAC қалай жасауға және сынауға болады
2024 Автор: John Day | [email protected]. Соңғы өзгертілген: 2024-01-30 10:23
ESP32-де 8 биттік 2 цифрлық аналогты түрлендіргіштер бар (DAC). Бұл DACs рұқсат етілген 8 бит ажыратымдылығымен белгілі бір диапазонда (0-3.3В) еркін кернеулер шығаруға мүмкіндік береді. Бұл нұсқаулықта мен сізге 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 құрудың көптеген әдістері бар. Ең қарапайым-резисторы мен конденсаторы бар PWM сигналын төмен өткізу сүзгісі. Мен мұнда буфер ретінде оп-амп қосатын едім, бірақ қарапайым нәрселерді сақтағым келді. Бұл дизайнды PWM қолдайтын кез келген микроконтроллермен іске асыру қарапайым және арзан. Мен мұнда дизайн теориясынан өтпеймін (google PWM DAC).
GPIO255 KOhm резисторы 1 microFarad Capacitor gnd қосыңыз
Енді резистор ADS115 конденсаторына сәйкес келетін нүктеден А0 -ға қосылады.
2 -қадам: сигналды шу деңгейіне бағалаңыз
Шу деңгейін бағалау үшін төмендегі сценарийді орындаңыз. Мұны бағалау үшін біз DAC -ты белгіленген мәнде қалдырамыз және кернеудің уақыт бойынша қалай тербелетінін өлшейміз.
DAC дизайнына байланысты, PWM сигналы 50% жұмыс циклінде болғанда, шу ең үлкен болады. Сондықтан бұл жерде біз оны бағалаймыз. Біз ESP32 сигналын дәл осы деңгейде бағалаймыз. Біз сондай -ақ өлшеуді салыстыру үшін ESP32 DAC -ті бірдей төмен өту сүзгісімен сүземіз.
Мен үшін шығыс анық болды. PWM дизайны> 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,048В 1 бит = 0,0625мВ ads.begin (); // begin adc float M = 0; // бастапқы орташа өзгеріс Mp = 0; // previouos float S = 0 білдіреді; // бастапқы Variance float Sp = 0; // алдыңғы дисперсия const int reps = 500; // қайталау саны int n = 256; // үлгілер саны ledcSetup (0, 25000, 8); // pwm freececny = 25000 Гц 8 бит ажыратымдылықпен ledcAttachPin (25, 0) орнатыңыз; // pwm 25 істікшеге орнату ledcWrite (0, 128); // оны жартылай жұмыс цикліне орнатыңыз (ең үлкен шу) кешігу (3000); // уақыттың өзгеруін күту snrPWM [reps]; // PWM float snrDAC [reps] үшін snrs жиыны; // DAC үшін snrs жиыны (int i = 0; i <reps; i ++) {// (int k = 1; k <(n+1); k ++) {// loop бойынша 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; Mp = 0; S = 0; Sp = 0; } ledcDetachPin (25); // 25 dacWrite (25, 128) түйреуішінен PWM ажырату; // 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 (дБ):»); Serial.println (snrDAC ); }} жарамсыз цикл (жарамсыз) {}
3 -қадам: Интегралды сызықтық емес және дифференциалды сызықтық емес
Интегралды сызықтықсыздық - бұл сіздің DAC шығыс кернеуі мен түзу сызық арасындағы шамалы ауытқудың шамасы. Бұл неғұрлым үлкен болса, соғұрлым нашар …
Дифференциалды емес сызық - бұл кернеудің (бір кодтан екіншісіне) байқалған өзгерісінің түзу сызықтан күткеннен қаншалықты ауытқып кететінін өлшейтін өлшем.
Мұндағы нәтижелер өте қызықты болды. Біріншіден, екеуінде де кемінде 0,5 лб қателік бар (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,048В 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.print («,»); Serial.println (adc0); }} жарамсыз цикл (жарамсыз) {}
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; float Sp = 0; Serial.begin (115200); ads.setGain (GAIN_ONE); // 1x күшейту +/- 4,096В 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; М = 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; қалқыма S = 0; float Sp = 0; Serial.begin (115200); ads.setGain (GAIN_ONE); // 1x күшейту +/- 4,096В 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; М = 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 биттік дәлдік). Бұл біраз еңбекті қажет етеді. Осы уақытқа дейін мен саған айтамын!
Ұсынылған:
DIY қалай керемет көрінетін сағатты жасауға болады - StickC - Оңай жасауға болады: 8 қадам
DIY қалай керемет көрінетін сағатты жасауға болады - StickC - Оңай жасауға болады: Бұл оқулықта біз ESP32 M5Stack StickC -ті Arduino IDE және Visuino көмегімен СКД -де уақытты көрсету үшін қалай бағдарламалауды, сонымен қатар StickC түймелерінің көмегімен уақытты орнатуды үйренеміз
NodeMCU ESP8266 Blynk DHT11, MQ-2, MQ-3: 7 қадамымен темекі/алкоголь детекторлары мен өрт дабылдарын қалай жасауға болады?
NodeMCU ESP8266 Blynk DHT11, MQ-2, MQ-3 көмегімен темекі шегу/алкоголь детекторлары мен өрт дабылдарын қалай жасауға болады: толығырақ менің Youtube бейнесін көре аласыз
Ең жақсы қуат жолағын қалай жасауға болады: 4 қадам
Ең жақсы электрлік жолақты қалай жасауға болады: ең жақсы электр жолағын қалай жасауға болады - найзағайдан қорғау - шуды басу - толқындарды сіңіру
Ескі пластикалық қораптан жақсы 3 портты USB хабын қалай жасауға болады: 6 қадам
Ескі пластикалық қораптан 3 портты USB-хабын қалай жақсы жасауға болады: Сәлеметсіз бе:) Бұл жобада біз ескі заттардан және арзан заттардан жақсы USB портын жасаймыз, біріншіден, кешіріңіз, себебі мен түсірген фото өте жақсы емес шығар. Егер түсініксіз нәрсе болса, мені түсініктемеде сұрайды
Ең жақсы гаверкрафты қалай жасауға болады - Люк пен Франк: 8 қадам
Люк пен Фрэнктің ең жақсы ұшу құралын қалай жасауға болады: Материалдар: 1. 4х4 мөлшердегі фанера 2. ауыр душқа арналған перде 3. жабысқақ таспа 4. қапсырма мылтық 5. жапырақ үрлегіш 6. құм қағаз (міндетті емес) 7. ара 8. қорап кескіш 9. 5 кішкене бұранда 10. бұрағыш 11. картонның немесе ақ тақтаның қатты бөлігі