आउटपुट पिन पर एक सच्चे एनालॉग वोल्टेज का उत्पादन कैसे करें


12

मेरे कार्यक्रम के बारे में, यह एक ऐसा कार्यक्रम है जो कुछ गणना करता है और फिर analogWrite फ़ंक्शन का उपयोग करके परिणाम के आधार पर एक वोल्टेज को आउटपुट करता है। हालाँकि मेरी समस्या यह है कि मैंने अपनी प्रोग्रामिंग एक गलत धारणा के आधार पर की थी कि PWM के माध्यम से एनालॉगवर्ट फंक्शन एक एनालॉग वोल्टेज का उत्पादन करता है, जहाँ वास्तव में यह एनालॉग वोल्टेज के बजाय केवल "अनुकरण" करता है।

यहाँ मेरे कोड के प्रासंगिक भाग हैं:

int pwmOutput = 11;
int pwm = 0;

void compareNewOldVoltageYes(void)
{
  if(pv_Vnew > pv_Vold && pwm != 255)
  {
    ++pwm;           //increasing value
  }
  else if(pwm != 0)
  {
    --pwm;           //decreasing
  }
}

void compareNewOldVoltageNo(void)
{
  if(pv_Vnew > pv_Vold && pwm != 0)
  {
    --pwm;
  }
  else if(pwm != 255)
  {
    ++pwm;
  }
}

void loop() 
{
   reading();
   PowerCalculation();

   if(pv_NewP > pv_OldP)
   {
      compareNewOldVoltageYes();
   }
   else
   {
      compareNewOldVoltageNo();
   }

   analogWrite(pwmOutput, pwm);           //analogWrite

   float displayPWMvolt = pwm * 0.0196;

   Serial.print("Output Voltage: ");
   Serial.print(displayPWMvolt);
   Serial.println(" V");

   pv_OldP = pv_NewP;

   Serial.print("Previous Power: ");
   Serial.print(pv_OldP);
   Serial.println(" W");

}

सर्किट्री के लिए, आउटपुट पिन 11 को 1 ओम रोकनेवाला और फिर GND से जोड़ा जा रहा है। (जहां मैंने वोल्टेज मापा) मैं Arduino Uno बोर्ड का उपयोग कर रहा हूं।

अद्यतन :

जैसा कि @DatHa द्वारा टिप्पणियों में कहा गया है, pwm आउटपुट वोल्टेज नहीं देता है। क्या बोर्ड को बदले बिना, आउटपुट वोल्टेज का एक तरीका है?


पीएस एनालॉग राइट पीडब्लूएम का उपयोग करता है और यह एनालॉग वोल्टेज का उत्पादन नहीं करता है।
डाट हा

@ दाता का मतलब यह है कि यह इस तरह से नहीं किया जा सकता है? क्या एनालॉग वोल्टेज को आउटपुट करने का एक और कार्य है?
बजे

पर @Russell जवाब देखें arduino.stackexchange.com/questions/10041/...
dhimaspw

@dpw मुझे नहीं लगता है कि मेरे प्रोग्राम के रूप में काम करता है, इसके बाहरी प्रोग्रामिंग पोर्ट के माध्यम से एक इलेक्ट्रॉनिक लोड से कनेक्ट होता है और 0-5 वी का उपयोग करके इसे नियंत्रित करता है।
bytk

पीडब्लूएम एक विशिष्ट वोल्टेज का उत्पादन करता है, या मैं हमारे भगवान 1734 के वर्ष में एक समुद्री डाकू हूं। आप 8-बिट मूल्य से ऊपर नहीं जा सकते हैं, और इसे पढ़ने में हमेशा कुछ अशुद्धि होती है।
user400344

जवाबों:


11

आपके पास मूल रूप से तीन विकल्प हैं:

  1. एक Arduino पर स्विच करें जिसके पास एक अंतर्निहित DAC है जो एक वास्तविक वोल्टेज का उत्पादन करता है।
  2. आपके लिए वोल्टेज बनाने के लिए एक बाहरी DAC चिप (जैसे MCP4821 / 2) जोड़ें
  3. PWM पिन पर एक कम-पास फ़िल्टर (RC नेटवर्क) का उपयोग करें।

तीन विकल्पों में से मैं आमतौर पर एक MCP4822 का उपयोग करता हूं क्योंकि यह सबसे अच्छा परिणाम देता है और एक देय का उपयोग करने में उतना खर्च नहीं होता है।


धन्यवाद। विकल्प 2 वास्तव में अच्छा लगता है, लेकिन समय की कमी के कारण, मैं विकल्प 3 के साथ आगे बढ़ गया और मुझे जो परिणाम चाहिए वह मिला।
bytk

1
या "गरीब आदमी की DAC" के रूप में R-2R सीढ़ी का उपयोग करें
आंद्रे होल्ज़नर

1
@AndreHolzner मैं एक R-2R सीढ़ी को DAC चिप के समान मानता हूं लेकिन आपके औसत Arduino पर इसे व्यावहारिक बनाने के लिए बहुत सारे तारों के साथ।
Majenko

@ माजेंको मैं सिर्फ यह जोड़ना चाहता था कि "डिजिटल पोटेंशियोमीटर" या "डिजीपोट्स" मौजूद हैं जो डीआईपी -8 चिप के अंदर बहुत अधिक आर -2 आर सीढ़ी हैं। वे सस्ती हैं तो डीएसी। (उदाहरण के लिए X9C103)
फिलिप फ्रांस

1
@FilipFranik को छोड़कर वे R-2R लैडर नहीं हैं। वे प्रतिरोधों के बीच प्रत्येक कनेक्शन से जुड़े FET वाले प्रतिरोधों की एक श्रृंखला मात्र हैं। केवल आर। कई सारे समान हैं। हां, यदि आप इसे पोटेंशियोमीटर के दो सिरों के साथ VCC और GND में लिखते हैं तो आपको एक तरह का DAC मिलता है, लेकिन यह उसी तरह की प्रतिबाधा की समस्या से जूझता है जो एक वास्तविक पोटेंशियोमीटर करता है। यह प्रतिरोधों की एक जोड़ी प्रदान करता है, जबकि एक डीएसी एक वोल्टेज प्रदान करता है।
Majenko

7

5 वी पर, एक 1 ओम अवरोधक 1 ए को डुबाने की कोशिश करेगा और 40mA चश्मा से अधिक होगा। अपने पिन की सुरक्षा के लिए कृपया कम से कम 5 / 0.040 = 125 ओम रोकनेवाला का उपयोग करें। और यदि आप अपने अवरोधक और जमीन के बीच संधारित्र लगाते हैं, तो संधारित्र का आरसी सर्किट PWM को एक एनालॉग वोल्टेज में सुचारू कर देगा।

कृपया 47K रोकनेवाला और 1uF संधारित्र के साथ सुझाए गए @russell उत्तर का प्रयास करें , आपको अपने इलेक्ट्रॉनिक लोड के साथ उपयोग करने के लिए जंक्शन पर एक एनालॉग वोल्टेज मिलेगा।


2

जहां तक ​​मुझे पता है कि Arduinos में ADC (एनालॉग से डिजिटल कन्वर्टर्स) है, लेकिन कोई DAC (डिजिटल से एनालॉग कन्वर्टर्स) नहीं है। तो आप एक डिजिटल मूल्य के आधार पर किसी भी पिन से एक सेट वोल्टेज आउटपुट नहीं कर सकते।


2
एआरएम आधारित Arduinos में आमतौर पर कम से कम एक DAC चैनल होता है।
किवी

0

नहीं .. Arduino से एनालॉग वोल्टेज प्राप्त करने का कोई तरीका नहीं है। सबसे अच्छा है कि आप Arduino का उपयोग कर सकते हैं रैखिक वोल्टेज या बूस्ट मोड में वोल्टेज नियामक, प्रारंभ करनेवाला और mosfet ट्रांजिस्टर का उपयोग करके एक बक वोल्ट वोल्टेज कनवर्टर के रूप में। तुम भी एक मेगा या Dulorme जो मानक 50o हर्ट्ज एक PWM आवृत्ति अन्य प्रदान करने की आवश्यकता हो सकती है।

अच्छी किस्मत


0

कोई सीधा रास्ता नहीं है।

@ मजनको के अलावा

वैकल्पिक तरीका: निरंतर स्तर प्रदान करने के लिए आप L293d जैसे H ब्रिज का उपयोग कर सकते हैं। कई diy इन्वर्टर सर्किट इस तकनीक का उपयोग कर रहे हैं।

http://www.instructables.com/id/How-to-Make-an-Inverter-Using-ARDUINO/?ALLSTEPS

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