विषयसूची:

Arduino और PCF8591 ADC DAC IC: 7 चरण
Arduino और PCF8591 ADC DAC IC: 7 चरण

वीडियो: Arduino और PCF8591 ADC DAC IC: 7 चरण

वीडियो: Arduino और PCF8591 ADC DAC IC: 7 चरण
वीडियो: #Shorts 24 Bit ADC Module BMH23M001 and BMH23M002 01 2024, नवंबर
Anonim
Arduino और PCF8591 ADC DAC IC
Arduino और PCF8591 ADC DAC IC

क्या आप कभी भी अपने Arduino प्रोजेक्ट पर अधिक एनालॉग इनपुट पिन चाहते हैं, लेकिन मेगा के लिए कांटा नहीं करना चाहते हैं? या आप एनालॉग सिग्नल उत्पन्न करना चाहेंगे? फिर हमारे ट्यूटोरियल का विषय देखें - NXP PCF8591 IC।

यह इन दोनों समस्याओं को हल करता है क्योंकि इसमें एक एकल डीएसी (डिजिटल से एनालॉग) कनवर्टर के साथ-साथ चार एडीसी (डिजिटल कन्वर्टर्स के एनालॉग) हैं - सभी I2C बस के माध्यम से सुलभ हैं। PCF8591 DIP, सरफेस माउंट और मॉड्यूल फॉर्म में उपलब्ध है, जिससे इसे प्रयोग करना आसान हो जाता है।

आगे बढ़ने से पहले, डेटा शीट डाउनलोड करें। PCF8591 5V और 3.3V दोनों पर काम कर सकता है, इसलिए यदि आप Arduino ड्यू, रास्पबेरी पाई या अन्य 3.3 V डेवलपमेंट बोर्ड का उपयोग कर रहे हैं तो आप ठीक हैं। अब हम पहले DAC, फिर ADCs की व्याख्या करेंगे।

चरण 1: DAC (डिजिटल-से-एनालॉग कन्वर्टर) का उपयोग करना

DAC (डिजिटल-से-एनालॉग कन्वर्टर) का उपयोग करना
DAC (डिजिटल-से-एनालॉग कन्वर्टर) का उपयोग करना

PCF8591 पर DAC का रिज़ॉल्यूशन 8-बिट्स है - इसलिए यह 255 चरणों में शून्य वोल्ट और संदर्भ वोल्टेज (Vref) के बीच एक सैद्धांतिक संकेत उत्पन्न कर सकता है। प्रदर्शन उद्देश्यों के लिए हम 5V के Vref का उपयोग करेंगे, और आप कम Vref का उपयोग कर सकते हैं जैसे कि 3.3V या जो भी आप चाहते हैं कि अधिकतम मान हो … हालांकि यह आपूर्ति वोल्टेज से कम होना चाहिए।

ध्यान दें कि जब एनालॉग आउटपुट (एक वास्तविक दुनिया की स्थिति) पर लोड होता है, तो अधिकतम आउटपुट वोल्टेज गिर जाएगा - डेटा शीट (जिसे आपने डाउनलोड किया है) 10kΩ लोड के लिए 10% की गिरावट दिखाती है। अब हमारे प्रदर्शन सर्किट के लिए।

I2C बस पर 10kΩ पुल-अप प्रतिरोधों और 5V और GND के बीच 10μF संधारित्र के उपयोग पर ध्यान दें। I2C बस का पता पिन A0 ~ A2 के संयोजन द्वारा निर्धारित किया जाता है, और उन सभी के साथ GND का पता 0x90 है। एनालॉग आउटपुट पिन 15 से लिया जा सकता है (और पिन 13 पर एक अलग एनालॉग जीएनडी है। इसके अलावा, पिन 13 को जीएनडी से कनेक्ट करें, और सर्किट जीएनडी को अरुडिनो जीएनडी से कनेक्ट करें।

DAC को नियंत्रित करने के लिए हमें दो बाइट्स डेटा भेजने की आवश्यकता होती है। पहला नियंत्रण बाइट है, जो केवल DAC को सक्रिय करता है और 1000000 (या 0x40) है और अगला बाइट 0 और 255 (आउटपुट स्तर) के बीच का मान है। यह निम्नलिखित स्केच में प्रदर्शित किया गया है:

// उदाहरण 52.1 PCF8591 DAC डेमो

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C बस पता शून्य सेटअप () { Wire.begin (); } शून्य लूप() { के लिए (int i=0; i<256; i++) { Wire.beginTransmission(PCF8591); // जागो PCF8591 Wire.write(0x40); // नियंत्रण बाइट - DAC (बाइनरी 1000000) वायर चालू करें। लिखें (i); // डीएसी वायर.एंडट्रांसमिशन () को भेजने के लिए मूल्य; // अंत संचरण }

के लिए (int i=255; i>=0; --i)

{वायर.बेगिनट्रांसमिशन (PCF8591); // जागो PCF8591 Wire.write(0x40); // नियंत्रण बाइट - DAC (बाइनरी 1000000) वायर चालू करें। लिखें (i); // डीएसी वायर.एंडट्रांसमिशन () को भेजने के लिए मूल्य; // अंत संचरण } }

क्या आपने #define स्टेटमेंट में बस के पते में थोड़ा बदलाव देखा है? Arduino 7-बिट पते भेजता है लेकिन PCF8591 8-बिट चाहता है, इसलिए हम बाइट को एक बिट से अधिक स्थानांतरित करते हैं।

चरण 2:

छवि
छवि

स्केच के परिणाम छवि में दिखाए गए हैं, हमने Vref को 5V और ऑसिलोस्कोप जांच और GND को क्रमशः एनालॉग आउटपुट और GND से जोड़ा है।

चरण 3:

छवि
छवि

यदि आप वक्र पसंद करते हैं तो आप नीचे दिए गए स्केच के साथ साइन तरंगें उत्पन्न कर सकते हैं। यह एक सरणी में एक लुकअप तालिका का उपयोग करता है जिसमें आवश्यक पूर्व-परिकलित डेटा बिंदु होते हैं:

// उदाहरण 52.2 PCF8591 DAC डेमो - साइन वेव

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C बस पता uint8_t sine_wave[256] = { 0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96, 0x99, 0x9C, 0x9F, 0xA2, 0xA5, 0xA8, 0xAB, 0xAE, 0xB1, 0xB3, 0xB6, 0xB9, 0xBC, 0xBF, 0xC1, 0xC4, 0xC7, 0xC9, 0xCC, 0xCE, 0xD1, 0xD3, 0xD5, 0xD8, 0xDA, 0xD0, 0xD5, 0xD8, 0xDA 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC, 0xFD, 0xFD, 0x, 0x, 0x, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6, 0xF5, 0xF4, 0xF3, 0xF1, 0xF1, 0xF1, 0xF1, 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, 0xB6, 0xC4, 0xC1, 0xBF, 0xB6, 0xC1, 0xBF, 0xB6 0xB3, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7A, 0x77, 0x74, 0x6A 0x67, 0x64, 0x61, 0x5E, 0x5B, 0x58, 0x55, 0x52, 0x4F, 0x4D, 0x4A, 0x47, 0x44, 0x41, 0x3F, 0x 3सी, 0x39, 0x37, 0x34, 0x32, 0x2F, 0x2D, 0x2B, 0x28, 0x26, 0x24, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18, 0x16, 0x15, 0x13, 0x11, 0x10, 0x0 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x26, 0x26, 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37, 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D, 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x67, 0x5, 0x5B, 0x5E, 0x67, 0x6, 0x6D, 0x61, 0x61 0x70, 0x74, 0x77, 0x7A, 0x7D}; शून्य सेटअप () {वायर.बेगिन (); } शून्य लूप() { के लिए (int i=0; i<256; i++) { Wire.beginTransmission(PCF8591); // जागो PCF8591 Wire.write(0x40); // नियंत्रण बाइट - DAC (बाइनरी 1000000) वायर चालू करें। लिखें (sine_wave ); // डीएसी वायर.एंडट्रांसमिशन () को भेजने के लिए मूल्य; // अंत संचरण } }

चरण 4:

छवि
छवि

निम्नलिखित DSO छवि डंप के लिए, हमने Vref को 3.3V में बदल दिया - साइन वेव पर मैक्सिमा में परिवर्तन पर ध्यान दें।

अब आप ध्वनि प्रभाव, सिग्नल बनाने या अन्य एनालॉग सर्किट को नियंत्रित करने के लिए डीएसी के साथ प्रयोग कर सकते हैं।

चरण 5: एडीसी (एनालॉग-टू-डिजिटल कन्वर्टर्स) का उपयोग करना

यदि आपने अपने Arduino (अध्याय एक में वापस) पर एनालॉग रीड () फ़ंक्शन का उपयोग किया है, तो आप पहले से ही एक एडीसी से परिचित हैं। PCF8591 के साथ हम शून्य और Vref के बीच एक वोल्टेज पढ़ सकते हैं और यह शून्य और 255 के बीच का मान लौटाएगा जो सीधे शून्य और Vref के समानुपाती होता है।

उदाहरण के लिए, 3.3V को मापने से 168 वापस आना चाहिए। ADC का रिज़ॉल्यूशन (8-बिट) ऑनबोर्ड Arduino (10-बिट) से कम है, हालांकि PCF8591 कुछ ऐसा कर सकता है जो Arduino का ADC नहीं कर सकता। लेकिन हम एक पल में उस तक पहुंच जाएंगे। सबसे पहले, प्रत्येक एडीसी पिन के मूल्यों को पढ़ने के लिए हम पीसीएफ 8591 को यह बताने के लिए एक नियंत्रण बाइट भेजते हैं कि हम कौन सा एडीसी पढ़ना चाहते हैं। एडीसी के लिए शून्य से तीन तक नियंत्रण बाइट क्रमशः 0x00, 0x01, ox02 और 0x03 है।

फिर हम एडीसी से दो बाइट्स डेटा वापस मांगते हैं, और दूसरे बाइट को उपयोग के लिए स्टोर करते हैं। दो बाइट्स क्यों? PCF8591 पहले मापा गया मान पहले लौटाता है - फिर वर्तमान बाइट। (डेटा शीट में चित्र 8 देखें)। अंत में, यदि आप सभी एडीसी पिन का उपयोग नहीं कर रहे हैं, तो अप्रयुक्त लोगों को जीएनडी से कनेक्ट करें। निम्न उदाहरण स्केच बस एक बार में प्रत्येक एडीसी पिन से मान प्राप्त करता है, फिर उन्हें सीरियल मॉनिटर में प्रदर्शित करता है:

#शामिल "वायर.एच"

# परिभाषित करें PCF8591 (0x90 >> 1) // I2C बस का पता # परिभाषित करें ADC0 0x00 // व्यक्तिगत ADCs पढ़ने के लिए बाइट्स को नियंत्रित करें # ADC1 0x01 को परिभाषित करें # ADC2 0x02 को परिभाषित करें # ADC3 0x03 बाइट मान 0, मान 1, मान 2, मान 3 परिभाषित करें; शून्य सेटअप () {वायर.बेगिन (); सीरियल.बेगिन (९६००); } शून्य लूप () {वायर.बेगिनट्रांसमिशन (PCF8591); // जागो PCF8591 Wire.write(ADC0); // नियंत्रण बाइट - ADC0 Wire.endTransmission () पढ़ें; // अंत ट्रांसमिशन वायर। रिक्वेस्टफ्रॉम (पीसीएफ 8591, 2); value0 = वायर.रीड (); value0 = वायर.रीड (); Wire.beginTransmission (PCF8591); // जागो PCF8591 Wire.write(ADC1); // नियंत्रण बाइट - ADC1 Wire.endTransmission () पढ़ें; // अंत ट्रांसमिशन वायर। रिक्वेस्टफ्रॉम (पीसीएफ 8591, 2); value1 = वायर.रीड (); value1 = वायर.रीड (); Wire.beginTransmission (PCF8591); // जागो PCF8591 Wire.write(ADC2); // नियंत्रण बाइट - ADC2 Wire.endTransmission () पढ़ें; // अंत ट्रांसमिशन वायर। रिक्वेस्टफ्रॉम (पीसीएफ 8591, 2); value2 = वायर.रीड (); value2 = वायर.रीड (); Wire.beginTransmission (PCF8591); // जागो PCF8591 Wire.write(ADC3); // नियंत्रण बाइट - ADC3 Wire.endTransmission () पढ़ें; // अंत ट्रांसमिशन वायर। रिक्वेस्टफ्रॉम (पीसीएफ 8591, 2); value3 = वायर.रीड (); value3 = वायर.रीड (); सीरियल.प्रिंट (मान 0); सीरियल.प्रिंट (""); सीरियल.प्रिंट (मान 1); सीरियल.प्रिंट (""); सीरियल.प्रिंट (मान 2); सीरियल.प्रिंट (""); सीरियल.प्रिंट (मान 3); सीरियल.प्रिंट (""); सीरियल.प्रिंट्लन (); }

स्केच चलाने पर आपको सीरियल मॉनिटर में प्रत्येक एडीसी के मूल्यों के साथ प्रस्तुत किया जाएगा। यद्यपि यह आपको दिखाने के लिए एक सरल प्रदर्शन था कि प्रत्येक एडीसी को व्यक्तिगत रूप से कैसे पढ़ा जाए, यह एक विशेष एडीसी से एक समय में एक से अधिक बाइट प्राप्त करने का एक बोझिल तरीका है।

चरण 6:

ऐसा करने के लिए, ऑटो-इन्क्रीमेंट का अनुरोध करने के लिए कंट्रोल बाइट को बदलें, जो कि कंट्रोल बाइट के बिट 2 को 1 पर सेट करके किया जाता है। इसलिए ADC0 से शुरू करने के लिए हम बाइनरी 00000100 या हेक्साडेसिमल 0x04 के एक नए कंट्रोल बाइट का उपयोग करते हैं। फिर डेटा के पांच बाइट्स का अनुरोध करें (एक बार फिर हम पहले बाइट को अनदेखा करते हैं) जिसके कारण PCF8591 बाइट्स की एक श्रृंखला में सभी मान वापस कर देगा। इस प्रक्रिया को निम्नलिखित रेखाचित्र में प्रदर्शित किया गया है:

#शामिल "वायर.एच"

#define PCF8591 (0x90 >> 1) // I2C बस एड्रेस बाइट वैल्यू 0, वैल्यू 1, वैल्यू 2, वैल्यू 3; शून्य सेटअप () {वायर.बेगिन (); सीरियल.बेगिन (९६००); } शून्य लूप () {वायर.बेगिनट्रांसमिशन (PCF8591); // जागो PCF8591 Wire.write(0x04); // कंट्रोल बाइट - ADC0 पढ़ें फिर ऑटो-इंक्रीमेंट वायर.एंडट्रांसमिशन (); // अंत ट्रांसमिशन वायर। रिक्वेस्टफ्रॉम (पीसीएफ 8591, 5); value0 = वायर.रीड (); value0 = वायर.रीड (); value1 = वायर.रीड (); value2 = वायर.रीड (); value3 = वायर.रीड (); सीरियल.प्रिंट (मान 0); सीरियल.प्रिंट (""); सीरियल.प्रिंट (मान 1); सीरियल.प्रिंट (""); सीरियल.प्रिंट (मान 2); सीरियल.प्रिंट (""); सीरियल.प्रिंट (मान 3); सीरियल.प्रिंट (""); सीरियल.प्रिंट्लन (); }

पहले हमने उल्लेख किया था कि PCF8591 कुछ ऐसा कर सकता है जो Arduino का ADC नहीं कर सकता है, और यह एक अंतर ADC प्रदान करता है। Arduino के सिंगल-एंडेड के विपरीत (यानी यह पॉजिटिव सिग्नल वोल्टेज और GND के बीच का अंतर देता है, डिफरेंशियल ADC दो सिग्नल स्वीकार करता है (जो जरूरी नहीं कि ग्राउंड को संदर्भित किया जाए), और दो सिग्नल के बीच का अंतर लौटाता है लोड सेल आदि के लिए वोल्टेज में छोटे बदलावों को मापने के लिए यह सुविधाजनक हो सकता है।

चरण 7:

छवि
छवि

अंतर ADC के लिए PCF8591 की स्थापना नियंत्रण बाइट को बदलने का एक साधारण मामला है। यदि आप डेटा शीट के पृष्ठ सात की ओर मुड़ते हैं, तो विभिन्न प्रकार के एनालॉग इनपुट प्रोग्रामिंग पर विचार करें। पहले हमने चार इनपुट के लिए मोड '00' का उपयोग किया था, हालांकि आप अन्य का चयन कर सकते हैं जो स्पष्ट रूप से सचित्र हैं, उदाहरण के लिए छवि।

तो दो अंतर इनपुट के लिए नियंत्रण बाइट सेट करने के लिए, बाइनरी 00110000 या 0x30 का उपयोग करें। फिर डेटा के बाइट्स का अनुरोध करने और उनके साथ काम करने का यह एक साधारण मामला है। जैसा कि आप देख सकते हैं कि संयोजन एकल / अंतर और एक जटिल तीन-अंतर इनपुट भी है। हालांकि हम उन्हें फिलहाल के लिए छोड़ देंगे।

उम्मीद है कि आपको यह रुचिकर लगी होगी, चाहे अपने प्रयोगों में डीएसी जोड़ना हो या एडीसी के बारे में कुछ और सीखना। कृपया अपने PCF8591 को PMD Way से ऑर्डर करने पर विचार करें।

यह पोस्ट आपके लिए pmdway.com द्वारा लाया गया है - निर्माताओं और इलेक्ट्रॉनिक्स के प्रति उत्साही लोगों के लिए, दुनिया भर में मुफ्त डिलीवरी के साथ।

सिफारिश की: