मैं एक Arduino का उपयोग करके एक मोटरयुक्त फ़ेडर (रैखिक स्लाइड पोटेंशियोमीटर) को नियंत्रित करने की कोशिश कर रहा हूं।
पीआईडी नियंत्रण एक विशिष्ट लक्ष्य स्थिति के लिए "कूद" के लिए अच्छे परिणाम देता है, लेकिन रैंप पर नज़र रखना एक समस्या है, यह बिल्कुल भी चिकनी नहीं है। आंदोलन बहुत झटकेदार है, कोई फर्क नहीं पड़ता कि मैं क्या कोशिश करता हूं।
यहाँ रैंप पर नज़र रखने के दौरान संदर्भ स्थिति, मापा स्थिति और मोटर आउटपुट का एक प्लॉट है:
और यहाँ उसी परीक्षण का एक वीडियो है।
वाणिज्यिक सिस्टम पर, यह बहुत आसान लगता है, देखना यह ।
विवरण :
मोटर पिता एक आल्प्स RSA0N11M9A0K है । इसे चलाने के लिए, मैं एक एसटी L293D एच-ब्रिज का उपयोग कर रहा हूं , जो एक विनियमित 10 वी डीसी बिजली की आपूर्ति ( XL6009 ) द्वारा संचालित है ।
Arduino UNO (ATmega328P) पर, मैं पिन 9 और 10 का उपयोग कर रहा हूं, 31.372 kHz की PWM आवृत्ति के साथ इसे अश्रव्य बनाने के लिए (टाइमर 1 के प्रीस्कूलर के साथ टाइमर TCCR1B = (TCCR1B & 0b11111000) | 0b001
)।
नापने का यंत्र जमीन और 5V के बीच तार होता है, जिसमें वाइपर हमेशा की तरह ADC0 पर जाता है।
नियंत्रक :
मैं एंटी-विंडअप के साथ एक साधारण PID नियंत्रक का उपयोग कर रहा हूं, जो कि 1 kHz (Ts = 1e-3 s) की दर से अपडेट होता है:
float update(int16_t input) {
int16_t error = setpoint - input;
int16_t newIntegral = integral + error;
float output = k_p * error
+ k_i * newIntegral * Ts
+ k_d * (input - previousInput) / Ts;
if (output > maxOutput)
output = maxOutput;
else if (output < -maxOutput)
output = -maxOutput;
else
integral = newIntegral;
previousInput = input;
return output;
}
नियंत्रक का आउटपुट -127 से 127 तक का मान है। PWM आउटपुट निम्नानुसार उत्पन्न होता है:
const int8_t knee = 48;
uint8_t activation(int8_t val) {
if (val == 0)
return 0;
else {
return map(val, 0, 127, 2 * knee, 255);
}
}
void writeMotor(int8_t val) {
if (val >= 0) {
analogWrite(forward, activation(val));
digitalWrite(backward, 0);
} else {
analogWrite(backward, activation(-val));
digitalWrite(forward, 0);
}
}
मैंने 7-बिट पीडब्लूएम सिग्नल में 48 जोड़ दिया, क्योंकि यही वह जगह है जहां मोटर 31 kHz पर चलना शुरू करता है, और फिर मैं इसे 8-बिट संख्या तक बढ़ा देता हूं (क्योंकि यही analogWrite
फ़ंक्शन की उम्मीद है):
मैंने क्या कोशिश की है :
मैंने पीआईडी नियंत्रक के व्युत्पन्न घटक को इनपुट सिग्नल को कंट्रोल सिग्नल पर एक ईएमए फिल्टर जोड़ने की कोशिश की है, लेकिन कोई फायदा नहीं हुआ। मैंने एनालॉग इनपुट के रिज़ॉल्यूशन को कम करने की भी कोशिश की, हिस्टैरिसीस का उपयोग करते हुए इसे दो मूल्यों के बीच स्थिर होने से रोकने के लिए। यह कुछ भी प्रभावित नहीं करता है। समय कदम बढ़ाकर 10 एमएस करने से भी मदद नहीं लगती है।
मैंने MATLAB में एक सिस्टम आइडेंटिफिकेशन करने की भी कोशिश की है, और इसे Simulink (इस वीडियो सीरीज़ के बाद ) में ट्यूनिंग करने की कोशिश की है । मुझे 91% फिट के साथ एक मॉडल मिला, लेकिन मुझे नहीं पता था कि MATLAB मॉडल के इनपुट और आउटपुट गैर-रैखिकताओं से कैसे निपटना है, वे पीआईडी ट्यूनिंग को कैसे प्रभावित करते हैं, और इसे Arduino पर कैसे लागू किया जाए।
अंतिम चीज़ जो मैंने कोशिश की है, वह दो अलग-अलग नियंत्रक बना रही है: एक संदर्भ स्थिति में बड़ी छलांग के लिए, और एक रैंप पर नज़र रखने के दौरान छोटी त्रुटियों के लिए। यह थोड़ा मदद करने लगता है, क्योंकि तब मैं ट्रैकिंग के दौरान अभिन्न गुणांक को बढ़ा सकता हूं, जब कूदते हुए ओवरशूट को बढ़ाए बिना।
हालांकि, अभिन्न (और आनुपातिक) लाभ में वृद्धि करके, मोटर अब हमेशा कुछ कर रही है, तब भी जब यह स्थिर होना चाहिए और संदर्भ नहीं बदलता है। (यह वास्तव में स्थानांतरित नहीं होता है, लेकिन आप इसे कंपन महसूस कर सकते हैं।)
मेरे पास वस्तुतः कोई व्युत्पन्न लाभ नहीं है, क्योंकि 1e-4 से अधिक होने से यह और भी अजीब लगता है, और मुझे वास्तव में 0 और के बीच कोई अंतर नहीं दिखता है। 1e-4।
मेरा अनुमान है कि स्थैतिक घर्षण को दूर करने के लिए इसे अधिक शक्ति की आवश्यकता होती है, फिर गतिशील घर्षण कम होता है, इसलिए यह ओवरशूट करता है, इसलिए यह मोटर को पीछे की ओर ले जाता है, जिससे इसे फिर से रुकना पड़ता है, फिर इसे स्थैतिक घर्षण को दूर करना पड़ता है, यह फिर से आगे बढ़ता है , आदि।
वाणिज्यिक नियंत्रक इस समस्या को कैसे दूर करते हैं?
मेरी पृष्ठभूमि :
मैं इलेक्ट्रिकल इंजीनियरिंग के अपने तीसरे स्नातक वर्ष में हूं, मैंने नियंत्रण सिद्धांत, डिजिटल सिग्नल प्रोसेसिंग, एलक्यूआर नियंत्रण आदि पर पाठ्यक्रमों का पालन किया है, इसलिए मेरे पास कुछ सैद्धांतिक पृष्ठभूमि है, लेकिन मुझे उन सभी सिद्धांतों को लागू करने में परेशानी हो रही है यह वास्तविक दुनिया प्रणाली है।
संपादित करें :
मैंने ओपन-लूप सेंसर मापों का परीक्षण किया है, जैसा कि लैपटॉप 2 डी की सिफारिश की गई है, और मैं परिणामों से काफी हैरान हूं: उच्च पीडब्लूएम आवृत्तियों पर, रीडिंग में गंदा चोटियां हैं। 490 हर्ट्ज पर, कोई नहीं हैं।
और यह एक निरंतर कर्तव्य चक्र पर है, इसलिए मैं कल्पना नहीं कर सकता कि मोटर के बहुत तेजी से दिशा बदलने पर मुझे किस तरह का शोर आता है।
इसलिए मुझे फिर से नियंत्रक पर काम शुरू करने से पहले उस शोर को छानने का एक तरीका खोजना होगा।
संपादन 2 :
एक घातीय मूविंग एवरेज फिल्टर का उपयोग करना शोर को फ़िल्टर करने के लिए पर्याप्त नहीं था।
मैंने 0.25, 0.50 और 0.75 में डंडे के साथ कोशिश की है। छोटे डंडों का बहुत प्रभाव नहीं था, और बड़े डंडों ने बहुत अधिक विलंबता को जोड़ा, इसलिए मुझे इसे स्थिर रखने के लिए लाभ कम करना पड़ा, जिसके परिणामस्वरूप समग्र प्रदर्शन बदतर हो गया।
मैंने पोटेंशियोमीटर (वाइपर और ग्राउंड के बीच) में एक 0.1 capacF कैपेसिटर जोड़ा है, और यह साफ करने के लिए लगता है।
अभी के लिए, यह काफी अच्छी तरह से काम करता है। इस बीच, मैं टिम वेस्कॉट द्वारा पोस्ट किए गए पेपर के माध्यम से पढ़ रहा हूं ।
आपकी मदद के लिए आप सभी को शुक्रिया।
This device is suitable for use in switching applications at frequencies up to 5 kHz.
लेकिन पेज 3 पर इलेक्ट्रिकल कैरेक्टर्स पूरी तरह से अधिकतम 690kHz का सुझाव देते हैं यदि आप सभी देरी जोड़ते हैं। (नीचे की 4 पंक्तियाँ) व्यक्तिगत रूप से, मैं उससे बहुत धीमी गति से जाऊँगा, लेकिन मुझे लगता है कि 31kHz पर्याप्त होना चाहिए ... अगर यह पृष्ठ 1 पर नोट के लिए नहीं था