विषयसूची:

ESP32 के साथ एक बेहतर DAC कैसे बनाएं और उसका परीक्षण कैसे करें: 5 कदम
ESP32 के साथ एक बेहतर DAC कैसे बनाएं और उसका परीक्षण कैसे करें: 5 कदम

वीडियो: ESP32 के साथ एक बेहतर DAC कैसे बनाएं और उसका परीक्षण कैसे करें: 5 कदम

वीडियो: ESP32 के साथ एक बेहतर DAC कैसे बनाएं और उसका परीक्षण कैसे करें: 5 कदम
वीडियो: #381 How to work with a Real Time Operating System and is it any good? (FreeRTOS, ESP32) 2024, जुलाई
Anonim
ESP32 के साथ एक बेहतर DAC कैसे बनाएं और उसका परीक्षण कैसे करें
ESP32 के साथ एक बेहतर DAC कैसे बनाएं और उसका परीक्षण कैसे करें
ESP32 के साथ एक बेहतर DAC कैसे बनाएं और उसका परीक्षण कैसे करें
ESP32 के साथ एक बेहतर DAC कैसे बनाएं और उसका परीक्षण कैसे करें

ESP32 में 2 8-बिट डिजिटल टू एनालॉग कन्वर्टर्स (DACs) हैं। ये DAC हमें 8 बिट रिज़ॉल्यूशन के साथ एक निश्चित सीमा (0-3.3V) के भीतर मनमाने वोल्टेज का उत्पादन करने की अनुमति देते हैं। इस निर्देश में, मैं आपको दिखाऊंगा कि कैसे एक डीएसी का निर्माण किया जाए और इसके प्रदर्शन को चिह्नित किया जाए और साथ ही इसकी तुलना ईएसपी 32 डीएसी से की जाए। मैं जिन प्रदर्शन सूचकांकों को देखूंगा उनमें शामिल हैं

  • शोर स्तर
  • बैंडविड्थ
  • अभिन्न अरैखिकता
  • विभेदक अरैखिकता

इन सूचकांकों का परीक्षण करने के लिए मैं ADS1115 का उपयोग करूंगा।

यह ध्यान रखना महत्वपूर्ण है कि इन सभी सूचकांकों का आपका आकलन केवल आपके संदर्भ उपकरण (इस मामले में ADS115) जितना सटीक होगा। उदाहरण के लिए, जब वोल्टेज ऑफसेट और लाभ की बात आती है तो ADS115 में 16-बिट सटीकता नहीं होती है। ये त्रुटियां 0.1% जितनी बड़ी हो सकती हैं। कई प्रणालियों के लिए, इन त्रुटियों को अनदेखा किया जा सकता है जब पूर्ण सटीकता सीमित चिंता का विषय हो।

आपूर्ति

  • एडीएस1115
  • ESP32 बोर्ड
  • ब्रेड बोर्ड
  • जम्पर तार
  • 5 कोहम प्रतिरोधी
  • 1 माइक्रो-फैराड सिरेमिक कैपेसिटर

चरण 1: ब्रेडबोर्ड बिछाना

ब्रेडबोर्ड बिछाना
ब्रेडबोर्ड बिछाना

निम्नलिखित पिनों को तार करें

ESP32 और ADS1115. के बीच

3v3 वीडीडी

जीएनडी जीएनडी

GPIO22 एससीएल

GPIO21 एसडीए

ADS1115. पर

एडीडीआर जीएनडी (ADS115)

डीएसी बनाना

DAC बनाने के कई तरीके हैं। एक रोकनेवाला और एक संधारित्र के साथ एक पीडब्लूएम सिग्नल को कम-पास फ़िल्टर करना सबसे आसान है। मैं यहाँ एक बफर के रूप में एक op-amp जोड़ सकता था, लेकिन चीजों को सरल रखना चाहता था। पीडब्लूएम का समर्थन करने वाले किसी भी माइक्रोकंट्रोलर के साथ लागू करने के लिए यह डिज़ाइन सरल और सस्ता है। मैं यहां डिजाइन के सिद्धांत (गूगल पीडब्लूएम डीएसी) के माध्यम से नहीं जा रहा हूं।

बस GPIO255 KOhm रोकनेवाला 1 माइक्रोफ़ारड कैपेसिटर gnd. कनेक्ट करें

अब एक जम्पर तार को उस बिंदु से कनेक्ट करें जहां रोकनेवाला संधारित्र से A0 से ADS115 पर मिलता है।

चरण 2: शोर स्तर के लिए सिग्नल का आकलन करें

शोर स्तर के लिए सिग्नल का आकलन करें
शोर स्तर के लिए सिग्नल का आकलन करें

शोर स्तर का आकलन करने के लिए बस नीचे दी गई स्क्रिप्ट चलाएँ। इसका आकलन करने के लिए हम बस डीएसी को एक निश्चित मूल्य पर छोड़ देते हैं और मापते हैं कि वोल्टेज समय के साथ कैसे दोलन करता है।

डीएसी के डिजाइन के कारण, पीडब्लूएम सिग्नल 50% कर्तव्य चक्र पर होने पर शोर सबसे बड़ा होगा। इसलिए यह वह जगह है जहां हम इसका आकलन करेंगे। हम इसी सिग्नल स्तर पर ESP32 का भी आकलन करेंगे। हम ESP32 DAC को भी उसी लो पास फ़िल्टर से फ़िल्टर करेंगे ताकि माप को तुलनीय बनाया जा सके।

मेरे लिए आउटपुट स्पष्ट था। PWM डिज़ाइन में> 6dB बेहतर SNR था (यह 2 गुना बेहतर है)। नए डीएसी के लिए एक स्पष्ट जीत। एक मामूली उलझन यह है कि एडीसी में ऐसे फिल्टर बनाए गए हैं जो निश्चित रूप से एसएनआर को बढ़ा रहे हैं। तो निरपेक्ष मूल्यों की व्याख्या करना मुश्किल हो सकता है। अगर मैंने दूसरे क्रम के फिल्टर का इस्तेमाल किया होता तो ऐसा नहीं होता।

वैसे भी कोड नीचे है

#शामिल

#include Adafruit_ADS1115 विज्ञापन; // adc int16_t adc0 के लिए एडफ्रूट लाइब्रेरी; // शून्य सेटअप (शून्य) {Serial.begin (115200); // सीरियल ads.setGain (GAIN_TWO) शुरू करें; // 2x लाभ +/- 2.048V 1 बिट = 0.0625mV ads.begin(); // एडीसी फ्लोट एम = 0 शुरू करें; // प्रारंभिक माध्य फ्लोट एमपी = 0; // previouos मतलब फ्लोट एस = 0; // प्रारंभिक विचरण फ्लोट एसपी = 0; // पिछला विचरण कास्ट इंट रेप्स = ५००; // पुनरावृत्तियों की संख्या int n = 256; // नमूनों की संख्या एलईडीसेटअप (0, 25000, 8); // सेट pwm frequecny = २५००० Hz 8 बिट रिज़ॉल्यूशन पर LEDcAttachPin (२५, ०); // पिन 25 LEDcWrite (0, 128) पर pwm सेट करें; // इसे आधा कर्तव्य चक्र (सबसे बड़ा शोर) विलंब (3000) पर सेट करें; // फ्लोट snrPWM [प्रतिनिधि] के निपटान के लिए प्रतीक्षा करें; // PWM फ्लोट snrDAC [प्रतिनिधि] के लिए snrs की सरणी; // DAC के लिए snrs की सरणी (int i = 0; i <reps; i++) {// लूप ओवर रिपीटिशन फॉर (int k = 1; k <(n + 1); k++) {// लूप ओवर सैंपल adc0 = ads.readADC_SingleEnded(0); // पढ़ने के लिए एम = एमपी + (adc0 - एमपी) / के; // गणना रोलिंग माध्य Mp = M; // पिछला माध्य सेट करें S = Sp + (adc0 - Mp) * (adc0 - M); // रोलिंग विचरण एसपी = एस की गणना करें; // पिछला विचरण सेट करें } // snr dB snrPWM = 20 * log10 (3.3 / (sqrt (S / n) *.0625 *.001) में); // मान रीसेट करें एम = 0; एमपी = 0; एस = 0; सपा = 0; } LEDcDetachPin(25); // PWM को पिन 25 dacWrite (25, 128) से अलग करें; // डीएसी देरी को लिखें (3000); // के लिए व्यवस्थित होने की प्रतीक्षा करें (int i = 0; i < reps; i++) {// PWM लूप के समान (int k = 1; k < (n + 1); k++) {adc0 = ads.readADC_SingleEnded(0); एम = एमपी + (एडीसी0 - एमपी) / के; एमपी = एम; एस = एसपी + (एडीसी0 - एमपी) * (एडीसी0 - एम); सपा = एस; } एसएनआरडीएसी = 20 * लॉग 10 (3.3 / (वर्ग (एस / एन) *.0625 *.001)); एम = 0; एमपी = 0; एस = 0; सपा = 0; } // के लिए एक ग्राफ पर SNRs प्लॉट करें (int i = 1; i <reps; i++) { Serial.print("PWM_SNR(dB):"); सीरियल.प्रिंट (snrPWM ); सीरियल.प्रिंट ("", "); सीरियल.प्रिंट ("ईएसपी 32_एसएनआर (डीबी):"); Serial.println (snrDAC ); } } शून्य लूप (शून्य) { }

चरण 3: इंटीग्रल नॉनलाइनरिटी और डिफरेंशियल नॉनलाइनियरिटी

इंटीग्रल नॉनलाइनरिटी और डिफरेंशियल नॉनलाइनरिटी
इंटीग्रल नॉनलाइनरिटी और डिफरेंशियल नॉनलाइनरिटी

इंटीग्रल नॉनलाइनियरिटी इस बात का माप है कि आपके DAC आउटपुट वोल्टेज और एक सीधी रेखा के बीच कितना विचलन है। ये जितना बड़ा है उतना ही बुरा है…

डिफरेंशियल नॉनलाइनरिटी मोटे तौर पर एक माप है कि वोल्टेज (एक कोड से दूसरे कोड में) में देखा गया परिवर्तन एक सीधी रेखा से क्या अपेक्षित होगा।

यहां परिणाम वास्तव में दिलचस्प थे। सबसे पहले, दोनों में 0.5lsb से कम त्रुटि (8-बिट रिज़ॉल्यूशन पर) है जो अच्छी है लेकिन PWM में बेहतर इंटीग्रल लीनियरिटी है। दोनों में तुलनीय अंतर गैर-रैखिकता है लेकिन ESP32 DAC में कुछ बहुत ही अजीब स्पाइक्स हैं। क्या अधिक है, PWM पद्धति में त्रुटियों के लिए कुछ संरचना है। अनिवार्य रूप से यह बारी-बारी से सही वोल्टेज को ओवरशूट और अंडरशूट करता है।

मेरा संदेह यह है कि ईएसपी 32 पर 8-बिट पीडब्लूएम सिग्नल कैसे उत्पन्न होता है, यह कुछ अजीब गोल त्रुटि है।

इसे ठीक करने का एक तरीका पीडब्लूएम के साथ दो आसन्न कोड (जैसे 128, 129) के बीच तेजी से चक्र करना है। एनालॉग लोपास फिल्टर के साथ, परिणामी त्रुटियां औसत से शून्य हो जाएंगी। मैंने सॉफ्टवेयर में इसका अनुकरण किया और वास्तव में सभी त्रुटियां गायब हो गईं। अब PWM पद्धति में रैखिकता है जो 16-बिट्स के लिए सटीक है!

कोई भी डेटा उत्पन्न करने के लिए कोड नीचे है। आउटपुट सीरियल मॉनिटर पर.csv फॉर्मेट में होगा। आगे की प्रक्रिया के लिए बस इसे एक टेक्स्ट फ़ाइल में कॉपी करें।

#शामिल

#include Adafruit_ADS1115 विज्ञापन; /* 16-बिट संस्करण के लिए इसका उपयोग करें */ int16_t adc0; शून्य सेटअप (शून्य) {Serial.begin(११५२००); ads.setGain(GAIN_ONE); // 2x गेन +/- 2.048V 1 बिट = 1mV 0.0625mV ads.begin(); एलईडीसेटअप (0, 25000, 8); एलईडीअटैचपिन (२५, ०); Serial.println ("अपेक्षित, मनाया गया"); एलईडीसीराइट (0, 2); देरी (3000); के लिए (int i = 2; i <255; i++) {ledcWrite(0, i); देरी (100); adc0 = ads.readADC_SingleEnded(0); फ्लोट अपेक्षित = (i / 256.0 * 3.3) / 4.096 * 32767; सीरियल.प्रिंट (अपेक्षित); सीरियल.प्रिंट ("", "); Serial.println(adc0); } } शून्य लूप (शून्य) { }

चरण 4: बैंडविड्थ

बैंडविड्थ
बैंडविड्थ

मैं बैंडविड्थ को यहां उस आवृत्ति के रूप में परिभाषित करने जा रहा हूं जिस पर डीएसी का आउटपुट 3 डीबी तक गिर जाता है। यह एक परंपरा है और कुछ हद तक मनमाना है। उदाहरण के लिए, 6dB बिंदु पर, DAC अभी भी एक सिग्नल आउटपुट करेगा, यह केवल ~ 50% आयाम होगा।

इसे मापने के लिए हम केवल डीएसी से एडीसी तक बढ़ती आवृत्ति पर साइन तरंगों को पास करते हैं और उनके मानक विचलन को मापते हैं। अप्रत्याशित रूप से, 3dB बिंदु 30Hz (1/(2*pi*5000*1e-6)) पर है।

ESP32 प्रति सेकंड 1 मेगा नमूना कर सकता है। यह ESP32 के लिए एक हैंड्स-डाउन जीत है। इसका आयाम 100Hz बैंडविड्थ परीक्षण क्षेत्र में बिल्कुल भी क्षय नहीं होता है।

नीचे दिया गया कोड PWM DAC बैंडविड्थ का परीक्षण कर सकता है।

#शामिल

#include Adafruit_ADS1115 विज्ञापन; /* 16-बिट संस्करण के लिए इसका उपयोग करें */ int16_t adc0; int16_t adc1; शून्य सेटअप (शून्य) {फ्लोट एम; फ्लोट एमपी = 0; फ्लोट एस = 0; फ्लोट सपा = 0; सीरियल.बेगिन (115200); ads.setGain(GAIN_ONE); // 1x गेन +/- 4.096V 1 बिट = 2mV 0.125mV ads.begin(); एलईडीसेटअप (0, 25000, 8); एलईडीअटैचपिन (२५, ०); देरी (5000); Serial.println ("आवृत्ति, आयाम"); के लिए (int i = 1; i <100; i++) { अहस्ताक्षरित लंबी शुरुआत = मिली (); अहस्ताक्षरित लंबा टी = मिली (); सपा = 0; एस = 0; एम = 0; एमपी = 0; इंट के = 1; फ्लोट मानदंड; जबकि ((टी - स्टार्ट) <1000) {इंट आउट = 24 * पाप (2 * पीआई * आई * (टी - स्टार्ट) / 1000.0) + 128; एलईडीसीराइट (0, आउट); adc0 = ads.readADC_SingleEnded(0); एम = एमपी + (एडीसी0 - एमपी) / के; एमपी = एम; एस = एसपी + (एडीसी0 - एमपी) * (एडीसी0 - एम); सपा = एस; टी = मिली (); के++; } अगर (i == 1) {मानदंड = वर्ग (एस / के); } सीरियल.प्रिंट (i); सीरियल.प्रिंट ("", "); Serial.println(sqrt(S / k) / मानदंड, 3); कश्मीर = 0; } } शून्य लूप (शून्य) { }

और यह कोड ESP32 बैंडविड्थ की जांच करेगा। संधारित्र को हटाना सुनिश्चित करें या परिणाम दोनों विधियों के लिए समान होंगे।

#शामिल

#include Adafruit_ADS1115 विज्ञापन; /* 16-बिट संस्करण के लिए इसका उपयोग करें */ int16_t adc0; int16_t adc1; शून्य सेटअप (शून्य) {फ्लोट एम; फ्लोट एमपी = 0; फ्लोट एस = 0; फ्लोट सपा = 0; सीरियल.बेगिन (115200); ads.setGain(GAIN_ONE); // 1x गेन +/- 4.096V 1 बिट = 2mV 0.125mV ads.begin(); देरी (5000); Serial.println ("आवृत्ति, आयाम"); के लिए (int i = 1; i <100; i++) { अहस्ताक्षरित लंबी शुरुआत = मिली (); अहस्ताक्षरित लंबा टी = मिली (); सपा = 0; एस = 0; एम = 0; एमपी = 0; इंट के = 1; फ्लोट मानदंड; जबकि ((टी - स्टार्ट) <1000) {इंट आउट = 24 * पाप (2 * पीआई * आई * (टी - स्टार्ट) / 1000.0) + 128; dacWrite (25, आउट); adc0 = ads.readADC_SingleEnded(0); एम = एमपी + (एडीसी0 - एमपी) / के; एमपी = एम; एस = एसपी + (एडीसी0 - एमपी) * (एडीसी0 - एम); सपा = एस; टी = मिली (); के++; } अगर (i == 1) {मानदंड = वर्ग (एस / के); } सीरियल.प्रिंट (i); सीरियल.प्रिंट ("", "); Serial.println(sqrt(S / k) / मानदंड, 3); कश्मीर = 0; } } शून्य लूप (शून्य) { }

चरण 5: समापन विचार

नया DAC डिज़ाइन रैखिकता और शोर पर जीतता है लेकिन बैंडविड्थ पर हार जाता है। आपके आवेदन के आधार पर इनमें से एक सूचकांक दूसरे की तुलना में अधिक महत्वपूर्ण हो सकता है। इन परीक्षण प्रक्रियाओं के साथ, आपको निष्पक्ष रूप से यह निर्णय लेने में सक्षम होना चाहिए!

साथ ही, मुझे लगता है कि यहां यह इंगित करना उचित है कि क्योंकि पीडब्लूएम आउटपुट कम शोर है, असाधारण रैखिकता के साथ पीडब्लूएम आउटपुट (शायद 16-बिट परिशुद्धता भी) के साथ एक उच्च रिज़ॉल्यूशन डीएसी बनाना संभव होना चाहिए। यह कुछ काम करने वाला है। तब तक, मैं आपको अलविदा कहता हूँ!

सिफारिश की: