क्या वोल्टेज में ADC रूपांतरण +5 V पिन के वास्तविक मूल्य पर निर्भर करता है?


13

प्रशन:

  1. क्या ADC का वोल्टेज में रूपांतरण +5 V पिन के वास्तविक वोल्टेज पर निर्भर करता है?
  2. यदि हाँ, तो बोर्ड से उस वोल्टेज को प्राप्त करने की स्वीकृत विधि क्या है?

पृष्ठभूमि / विवरण:

मेरे पास एक सर्किट है जिसमें मेरे पास एक अरुदिनो नैनो (क्लोन) है जो एक यूएसबी कनेक्टर (एक हब से) से चल रहा है। Arduino का काम एक बैटरी पर वोल्टेज को मापना है जो नैनो द्वारा स्विच / बंद एक दूसरे सर्किट को चलाएगा। संदर्भ के लिए यह एक बैटरी परीक्षक है।

टेस्ट सर्किट

एक नोकिया 5110 स्क्रीन है जो नीचे बहुत ही साधारण स्केच से वोल्टेज प्रदर्शित करता है।

void setup() {
  Serial.begin(9600);
  display.begin();
  // Init done

  // You can change the contrast around to adapt the display
  // for the best viewing!
  display.setContrast(50);

  // Text display tests
  display.setTextSize(1);
  display.setTextColor(BLACK);
}


void loop() {
  display.clearDisplay();   // Clears the screen and buffer
  display.setCursor(0,0);
  display.print("Vin=");
  int rawVIN = analogRead(VIN);
  float floatVin = (rawVIN*4.75)/1023.0;
  display.println(floatVin);
  Serial.println(rawVIN);
  display.display();
  delay(1000);
}
  • मैंने DVM का उपयोग करके बैटरी के वोल्टेज को मापा और यह 4.13 V है, फिर भी नैनो 4.35 V की रिपोर्ट करता है।
  • मेरे पास बैटरी और Arduino के बीच एक आम जमीन है।
  • क्योंकि वोल्टेज का परीक्षण करने के लिए कनेक्शन तैर सकता है, मेरे पास जंगली उतार-चढ़ाव को रोकने के लिए एक पुलडाउन अवरोधक है (> 10 k test)

कुछ जांच के बाद मैंने पाया कि +5 V वास्तव में 4.75 V आउटपुट कर रहा था और इससे मेरा स्केच बदल गया

float v = (rawVIN*5.0)/1024.0;

सेवा

float v = (rawVIN*4.75)/1024.0;

और Arduino पर वोल्टेज पढ़ना अब सही था। मैंने ऐसा नहीं किया क्योंकि मैं समझता हूं कि मैंने क्या किया, मैंने ऐसा किया क्योंकि मेरे पास एक कूबड़ था जो मूल्य को सही में बदल सकता है।


3
एक तरफ आप 1024 विभाजित किया जाना चाहिए नहीं के रूप में, नहीं 1023. यह एक गलती है जो एक से अधिक बार-बार दोहराया जाता है, शायद गलती Arduino उदाहरण में किया जा रहा से उत्पन्न है। स्रोत? AVR के लिए डेटाशीट।
टॉम कारपेंटर

@TomCarpenter मुझे लगता है कि यह गणना के साथ मेरी गड़गड़ाहट का परिणाम है और डेस्क के खिलाफ मेरे सिर को पीटने के काफी समय बाद कुछ पढ़ा है - मैंने 1024 से शुरुआत की थी लेकिन जैसा कि आप देख रहे हैं कि यह 1023 के साथ समाप्त हो गया है - मैं अपना सवाल सही करूंगा ।
कारिबू

जवाबों:


16

Arduino के अंदर ADC वोल्टेज को मापता नहीं है, बल्कि वोल्टेज अनुपात को मापता है । Vref पिन पर वोल्टेज के अनुरूप इनपुट पर वोल्टेज से अनुपात।

डिफ़ॉल्ट कॉन्फ़िगरेशन में, Vref पिन आंतरिक रूप से +5 V लाइन से बंधा होता है। आप आंतरिक संदर्भ के बजाय Vref के रूप में उपयोग करना चुन सकते हैं :

analogReference(INTERNAL);

यह संदर्भ लगभग 1.1 V है, और +5 V पर उतार-चढ़ाव के लिए काफी प्रतिरक्षा है। समस्या यह है कि आप संदर्भ से अधिक वोल्टेज को माप नहीं सकते हैं।

अपने बैटरी परीक्षक के लिए, यदि आप किसी प्रकार का "पूर्ण" माप चाहते हैं, तो आप आंतरिक संदर्भ और वोल्टेज विभक्त का उपयोग कर सकते हैं ताकि यह सुनिश्चित किया जा सके कि मापा वोल्टेज 1.1 V से नीचे है।

संपादित करें : एक अन्य विकल्प जिसके लिए वोल्टेज विभक्त की आवश्यकता नहीं है , एनालॉग इनपुट और आंतरिक 1.1 V "बैंडगैप" संदर्भ दोनों को मापने के लिए एक संदर्भ के रूप में Vcc का उपयोग करना है । Vcc के विरुद्ध 1.1 V को मापना Vcc को मापने का एक अप्रत्यक्ष तरीका है। यह Arduino कोर लाइब्रेरी द्वारा समर्थित नहीं है, लेकिन आप इसे ADC के नियंत्रण रजिस्टरों पर सीधे प्रोग्रामिंग करके कर सकते हैं:

// Return the supply voltage in volts.
float read_vcc()
{
    const float V_BAND_GAP = 1.1;     // typical
    ADMUX  = _BV(REFS0)    // ref = Vcc
           | 14;           // channel 14 is the bandgap reference
    ADCSRA |= _BV(ADSC);   // start conversion
    loop_until_bit_is_clear(ADCSRA, ADSC);  // wait until complete
    return V_BAND_GAP * 1024 / ADC;
}

खबरदार कि बूट के बाद पहली बार पढ़ने वाला फर्जी हो सकता है।


शीघ्र उत्तर के लिए धन्यवाद :) यह अब सही समझ में आता है और बताता है कि मेरे कोड (ठगना) समायोजन से मुझे सही उत्तर क्यों मिलता है। यह एनरिक उत्तर के साथ संयुक्त मुझे सब मुझे जारी रखने की आवश्यकता है।
कारिबू

9

एक USB- संचालित Arduino नैनो में ADC वोल्टेज संदर्भ होगा जो आने वाले USB वोल्टेज के +/- 5% सहिष्णुता के कारण पर निर्भर नहीं हो सकता है। उसके ऊपर, नैनो में एक MBR0520 Schottky डायोड (D1) है जो 0.1 और 0.5 V के बीच अपने स्वयं के विनिर्माण सहिष्णुता, इसके तापमान और आपके बोर्ड के वर्तमान ड्रॉ के आधार पर छोड़ देगा।

आप इसके बारे में क्या कर सकते हैं?

Arduino नैनो पर MCU ऑन-बोर्ड एक ATmega328P है। नैनो के एडीसी कई उपलब्ध संदर्भों के अनुसार अपने एनालॉग वोल्टेज रीडिंग को स्केल कर सकते हैं (और आप उस सूट को चुन सकते हैं जो आपको बेहतर लगता है)। आप इसे analogReference (type)फ़ंक्शन के माध्यम से कर सकते हैं , और निम्नलिखित संदर्भों में से एक को चुन सकते हैं type:

  • DEFAULT: 5 वोल्ट (5 V Arduino बोर्ड पर) या 3.3 वोल्ट (3.3 V Arduino बोर्ड पर) का डिफ़ॉल्ट एनालॉग संदर्भ
  • आंतरिक: एक निर्मित संदर्भ, ATmega168 या ATmega328 पर 1.1 वोल्ट के बराबर और ATmega8 पर 2.56 वोल्ट (Arduino मेगा पर उपलब्ध नहीं) [...]
  • बाहरी: आरईएफ पिन (0 से 5 वी केवल) पर लागू वोल्टेज को संदर्भ के रूप में उपयोग किया जाता है।

स्रोत: analogReference

यह ADmega328 के अंदर क्या है के लिए ADC योजनाबद्ध है ताकि आप देख सकें कि वहां क्या चल रहा है:

ATmega328P ADC ब्लॉक

स्रोत: ATmega328 डेटशीट

तो सीधा समाधान एक कमजोर वोल्टेज विभक्त का निर्माण कर रहा है ताकि आप जिस वोल्टेज को आंतरिक 1.1 वी संदर्भ से नीचे मापना चाहते हैं, और उसके analogReferenceअनुसार कॉन्फ़िगर कर सकें ।

वोल्टेज डिवाइडर को कमजोर (उच्च आर मान) करने की आवश्यकता होती है, ताकि आप बैटरी से बहुत अधिक वर्तमान न खींचें, लेकिन एडीसी इनपुट प्रतिबाधा द्वारा लोड होने के लिए बहुत कमजोर नहीं है।

बक्शीश

हालाँकि, यदि आपको एक वोल्टेज संदर्भ की आवश्यकता है जो कि ATmega328 के आंतरिक 1.1 V बैंडगैप संदर्भ से आप अभी भी भाग्य से बाहर हैं। एक विकल्प ऑन-बोर्ड FT232RL से 3.3 V एलडीओ नियामक आउटपुट का उपयोग करना होगा, जो कि हेडर के पिन 14 पर आपके लिए उपलब्ध है, लेकिन मुझे नहीं लगता कि यह विश्वसनीय है। FT232RL डेटापत्रक 3.0 पर निर्दिष्ट करता है यह - 3.6 वी (नाममात्र 3.3 वी)

तो एक सार्वभौमिक समाधान एक सस्ते TL431 पर आधारित एक बाहरी वोल्टेज संदर्भ का निर्माण होगा । यह आपको 4.0 / 4.25 वी तक +/- 1% सटीकता के साथ एक विश्वसनीय संदर्भ दे सकता है।

बाहरी वोल्टेज संदर्भ सर्किट कुछ इस तरह से आसान होगा, और टीएल 431 ब्रेडबोर्ड के अनुकूल TO-92 पैकेज में उपलब्ध है:

TL431- आधारित शंट वोल्टेज नियामक


इस व्यापक उत्तर और मेरे द्वारा लिए जा सकने वाले सभी विकल्पों के लिए धन्यवाद - मैं शायद सरल जाऊंगा और 0 और 1.1 के बीच मेरे इनपुट को स्केल करने के लिए एक वोल्टेज डिवाइडर करूंगा। अवरोधक मूल्यों के बारे में संकेत मेरे लिए मूल्यवान था - धन्यवाद
कारिबू

3

मेरे पास Atmega328P पर ADC कनवर्टर के बारे में एक पृष्ठ हैपृष्ठ के कुछ नीचे मैं वोल्टेज संदर्भों का वर्णन करता हूं। आप TL431 चिप का उपयोग मिश्रित संदर्भ वोल्टेज प्रदान करने के लिए कर सकते हैं, उदाहरण के लिए 4V:

4V वोल्टेज संदर्भ

प्रतिरोधों को बदलकर आप अन्य वोल्टेज प्राप्त कर सकते हैं (ऐसा लगता है कि आप लगभग 4.2 वी चाहते हैं)।

आउटपुट वोल्टेज इनपुट वोल्टेज (इस मामले में 5 वी) से प्रभावित नहीं है।

लिंक किए गए पृष्ठ का वर्णन है कि आप अवरोधक मूल्यों को कैसे चुन सकते हैं।


2

क्या adc count को वोल्टेज में बदलना वास्तविक 5V पिन के वास्तविक वोल्टेज पर निर्भर करता है?

हां और नहीं: adc मॉड्यूल को Vref की परवाह है, जिसे Vdd, आंतरिक या बाहरी रूप से आपूर्ति की जा सकती है।

यदि हाँ, तो बोर्ड से उस वोल्टेज को प्राप्त करने की स्वीकृत विधि क्या है?

adc मॉड्यूल को कॉन्फ़िगर करके। डिवाइस डेटाशीट में रजिस्टर्स / बिट्स होने चाहिए जो उसके लिए सेट किए जाने की आवश्यकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.