Мазмұны:

ESP32: 5 қадамымен жақсы DAC қалай жасауға және сынауға болады
ESP32: 5 қадамымен жақсы DAC қалай жасауға және сынауға болады

Бейне: ESP32: 5 қадамымен жақсы DAC қалай жасауға және сынауға болады

Бейне: ESP32: 5 қадамымен жақсы DAC қалай жасауға және сынауға болады
Бейне: ESP32 Tutorial 7 - Using Array with ESP32 Arduino Programming-SunFounder's ESP32 IoT Learnig kit 2024, Қараша
Anonim
ESP32 көмегімен жақсы DAC қалай жасауға және сынауға болады
ESP32 көмегімен жақсы DAC қалай жасауға және сынауға болады
ESP32 көмегімен жақсы DAC қалай жасауға және сынауға болады
ESP32 көмегімен жақсы DAC қалай жасауға және сынауға болады

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 биттік дәлдік). Бұл біраз еңбекті қажет етеді. Осы уақытқа дейін мен саған айтамын!

Ұсынылған: