प्रोग्रामिंग पीआईडी ​​लूप्स सी में


11

मैं एक इलेक्ट्रिकल इंजीनियर हूं जो डिजिटल दुनिया में था और जैसे-जैसे मैं सीखता जा रहा था। मैं एक पीआईडी ​​(आनुपातिक-अभिन्न-व्युत्पन्न) लूप करने के लिए एक टीआई प्रोसेसर की प्रोग्रामिंग कर रहा हूं , इस चित्र द्वारा सचित्र:

विकिपीडिया से पीआईडी ​​लूप इमेज

मैं इसका वर्णन भी करूँगा:

नकारात्मक प्रतिक्रिया op-amp, गैर-इनवर्टिंग टर्मिनल के साथ। नकारात्मक टर्मिनल के माध्यम से इनपुट। प्रतिक्रिया लूप एक आरई श्रृंखला सर्किट है जिसमें एक रोकनेवाला और एक टोपी के समानांतर सभी के साथ समानांतर है।

किसी को भी किसी भी विचार है कि इस सर्किट को सी कोड में कैसे बदलना है? मैं इस पर अपने तत्व से थोड़ा बाहर हूं और मदद का उपयोग कर सकता हूं।


आप किसी चित्र से लिंक कर सकते हैं और कोई व्यक्ति आपके लिए उस लिंक को वास्तविक चित्र में बदलने में मदद करेगा।
जोकिम सॉयर

2
आपके द्वारा पोस्ट किया गया लिंक इसके बारे में जाने के लिए एक बुनियादी स्यूडोकोड प्रदान करता है। अगर आपको C # से एतराज नहीं है, तो यहां C # में एक पिड लूप का उदाहरण दिया गया है
नील

1
नील सही है। मैंने लगभग ठीक उसी लूप को टीआई पर लागू किया है। एक संकेत: एक निरंतर समय लूप का उपयोग करें, और लूप dtमें अतिरिक्त विभाजन और गुणा करने के बजाय, स्थिरांक में निश्चित कारक का उपयोग करें ।
AShelly

1
@ नील जो एक लिंक था जिसे मैंने संशोधन 2 में जोड़ा क्योंकि मुझे नहीं पता था कि एक पीआईडी ​​लूप क्या था और मुझे कई अन्य लोगों पर भी संदेह था।

@ मिचेल्ट, आह मेरी माफी तब।
नील

जवाबों:


18

सर्किट

ठीक है, जब मैंने यह प्रश्न देखा तो मैंने यहाँ एक खाता बनाया। अपने प्रश्न को संपादित करने में सक्षम नहीं हूं ताकि मैं आपके द्वारा किए गए टाइपो को सही कर सकूं। मेरा मानना ​​है कि आप आरई के बजाय समानांतर में आरसी श्रृंखला सर्किट का मतलब था (यदि यह है, तो मुझे एक भी सुराग नहीं है कि इसका क्या मतलब है)

लगता है एनालॉग सर्किट जिसे आप सी का उपयोग करके अनुकरण करना चाहते हैं, ऐसा कुछ दिखता है

                         Ci
                  |------| |--------------|
                  |           Rp          |
                  |----/\/\/\/\-----------|
                  |          Rd    Cd     |
           Rf     |----/\/\/\---| |-------|
Vin o----/\/\/\---|                       |
                  |    |\                 |
                  |    | \                |
                  |----|- \               | 
                       |   \              |
                       |    \-------------|---------o  Vout
                       |    /
                       |   /
                       |+ /
                   ----| /
                  |    |/
                  |
                  |
               ___|___ GND
                _____
                 ___
                  _

LEGEND:
  Vin is the input signal.
  Vout is the Output.
  Rp controls the propotional term ( P in PID) 
  Ci controls the Integral term ( I id PID)
  Rd and Cd controls the differential term ( D in PID)
  Rf is the gain control, which is common to all of the above controllers.

(मैं इसे आकर्षित करने के लिए अपने आग्रह का विरोध नहीं कर सका क्योंकि मैं आपको बताना चाहता था कि विद्युत / इलेक्ट्रॉनिक्स इंजीनियर छवियों के बिना मंचों और ईमेल में कैसे संवाद करते थे ... और हम सिर्फ कूरियर, निश्चित चौड़ाई फ़ॉन्ट से क्यों प्यार करते हैं)

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

मैं दृढ़ता से सुझाव देता हूं कि आप अध्ययन के लिए इस स्रोत से सर्किट का उपयोग करें ।

भले ही स्थापित करने के लिए थोड़ा थकाऊ हो, गणितीय रूप से इसका विश्लेषण करने में बहुत सरल है क्योंकि आप इसे आदर्श गणितीय के बजाय सीधे मानक गणितीय रूप से संबंधित कर सकते हैं।

अंत में वाउट एक मोटर को नियंत्रित करने के लिए जाता है या जिसे नियंत्रित करने की आवश्यकता होती है। और विन प्रोसेस चर वोल्टेज है।

सी (समुद्र?) में अपने पैरों को गीला होने से पहले?

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

यदि हमारे पास मानक रूप का उपयोग कर रहे हैं,

मान लें कि लूप रनिंग टाइम काफी छोटा है (एक धीमी प्रक्रिया), हम आउटपुट की गणना के लिए निम्न फ़ंक्शन का उपयोग कर सकते हैं,

output = Kp * err + (Ki * int * dt) + (Kd * der /dt);

कहाँ पे

Kp = Proptional Constant.
Ki = Integral Constant.
Kd = Derivative Constant.
err = Expected Output - Actual Output ie. error;
int  = int from previous loop + err; ( i.e. integral error )
der  = err - err from previous loop; ( i.e. differential error)
dt = execution time of loop.

जहां शुरू में 'डेर' और 'इंट' शून्य होगा। यदि आप लूप फ्रीक्वेंसी को 1 KHz कहने के लिए कोड में देरी फ़ंक्शन का उपयोग करते हैं तो आपका dt 0.001 सेकंड होगा।

सी में खींच रहा है

मुझे C में PID के लिए यह उत्कृष्ट कोड मिला , हालांकि यह इसके हर पहलू को कवर नहीं करता है, फिर भी यह एक अच्छा है।

//get value of setpoint from user
while(1){
  // reset Timer
  // write code to escape loop on receiving a keyboard interrupt.
  // read the value of Vin from ADC ( Analogue to digital converter).
  // Calculate the output using the formula discussed previously.
  // Apply the calculated outpout to DAC ( digital to analogue converter).
  // wait till the Timer reach 'dt' seconds.
}

यदि हम एक धीमी प्रक्रिया लेते हैं, तो हम निम्न आवृत्ति का उपयोग कर सकते हैं जैसे कि dt >>> एकल लूप के लिए कोड निष्पादन समय (अब तक की तुलना में अधिक)। ऐसे मामलों में हम टाइमर के साथ दूर कर सकते हैं और इसके बजाय एक देरी फ़ंक्शन का उपयोग कर सकते हैं।


6
अस्की डायग्राम ने मेरे दिमाग को उड़ा दिया। +1
l46kok

1
लिंक "यह स्रोत" काम नहीं कर रहा है
Ccr

ओह, यह सुनकर मुझे खेद है कि एक अच्छा संसाधन खो गया :( अच्छी तरह से इस अवधारणा को समझाया गया है जबकि लूप उदाहरण कोड में मैंने साझा किया था। मुझे इस स्थिति को संभालने के तरीके का अनुभव नहीं है, शायद कुछ संपादक इसे ठीक कर सकते हैं। उचित संदेश। (मृत लिंक)
D34dman

2
अनुपलब्ध "यह स्रोत" यहां उपलब्ध हो सकता है: educationypedia.karadimov.info/library/piddocs.pdf
डेविड सुआरेज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.