मोटर फैडर पीआईडी ​​नियंत्रण


15

मैं एक 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फ़ंक्शन की उम्मीद है): PWM गति

मैंने क्या कोशिश की है :
मैंने पीआईडी ​​नियंत्रक के व्युत्पन्न घटक को इनपुट सिग्नल को कंट्रोल सिग्नल पर एक ईएमए फिल्टर जोड़ने की कोशिश की है, लेकिन कोई फायदा नहीं हुआ। मैंने एनालॉग इनपुट के रिज़ॉल्यूशन को कम करने की भी कोशिश की, हिस्टैरिसीस का उपयोग करते हुए इसे दो मूल्यों के बीच स्थिर होने से रोकने के लिए। यह कुछ भी प्रभावित नहीं करता है। समय कदम बढ़ाकर 10 एमएस करने से भी मदद नहीं लगती है।

मैंने MATLAB में एक सिस्टम आइडेंटिफिकेशन करने की भी कोशिश की है, और इसे Simulink (इस वीडियो सीरीज़ के बाद ) में ट्यूनिंग करने की कोशिश की है । मुझे 91% फिट के साथ एक मॉडल मिला, लेकिन मुझे नहीं पता था कि MATLAB मॉडल के इनपुट और आउटपुट गैर-रैखिकताओं से कैसे निपटना है, वे पीआईडी ​​ट्यूनिंग को कैसे प्रभावित करते हैं, और इसे Arduino पर कैसे लागू किया जाए।

अंतिम चीज़ जो मैंने कोशिश की है, वह दो अलग-अलग नियंत्रक बना रही है: एक संदर्भ स्थिति में बड़ी छलांग के लिए, और एक रैंप पर नज़र रखने के दौरान छोटी त्रुटियों के लिए। यह थोड़ा मदद करने लगता है, क्योंकि तब मैं ट्रैकिंग के दौरान अभिन्न गुणांक को बढ़ा सकता हूं, जब कूदते हुए ओवरशूट को बढ़ाए बिना।
हालांकि, अभिन्न (और आनुपातिक) लाभ में वृद्धि करके, मोटर अब हमेशा कुछ कर रही है, तब भी जब यह स्थिर होना चाहिए और संदर्भ नहीं बदलता है। (यह वास्तव में स्थानांतरित नहीं होता है, लेकिन आप इसे कंपन महसूस कर सकते हैं।)
मेरे पास वस्तुतः कोई व्युत्पन्न लाभ नहीं है, क्योंकि 1e-4 से अधिक होने से यह और भी अजीब लगता है, और मुझे वास्तव में 0 और के बीच कोई अंतर नहीं दिखता है। 1e-4।

मेरा अनुमान है कि स्थैतिक घर्षण को दूर करने के लिए इसे अधिक शक्ति की आवश्यकता होती है, फिर गतिशील घर्षण कम होता है, इसलिए यह ओवरशूट करता है, इसलिए यह मोटर को पीछे की ओर ले जाता है, जिससे इसे फिर से रुकना पड़ता है, फिर इसे स्थैतिक घर्षण को दूर करना पड़ता है, यह फिर से आगे बढ़ता है , आदि।

वाणिज्यिक नियंत्रक इस समस्या को कैसे दूर करते हैं?

मेरी पृष्ठभूमि :
मैं इलेक्ट्रिकल इंजीनियरिंग के अपने तीसरे स्नातक वर्ष में हूं, मैंने नियंत्रण सिद्धांत, डिजिटल सिग्नल प्रोसेसिंग, एलक्यूआर नियंत्रण आदि पर पाठ्यक्रमों का पालन किया है, इसलिए मेरे पास कुछ सैद्धांतिक पृष्ठभूमि है, लेकिन मुझे उन सभी सिद्धांतों को लागू करने में परेशानी हो रही है यह वास्तविक दुनिया प्रणाली है।


संपादित करें :
मैंने ओपन-लूप सेंसर मापों का परीक्षण किया है, जैसा कि लैपटॉप 2 डी की सिफारिश की गई है, और मैं परिणामों से काफी हैरान हूं: उच्च पीडब्लूएम आवृत्तियों पर, रीडिंग में गंदा चोटियां हैं। 490 हर्ट्ज पर, कोई नहीं हैं।
और यह एक निरंतर कर्तव्य चक्र पर है, इसलिए मैं कल्पना नहीं कर सकता कि मोटर के बहुत तेजी से दिशा बदलने पर मुझे किस तरह का शोर आता है।

यहाँ छवि विवरण दर्ज करें

इसलिए मुझे फिर से नियंत्रक पर काम शुरू करने से पहले उस शोर को छानने का एक तरीका खोजना होगा।

संपादन 2 :
एक घातीय मूविंग एवरेज फिल्टर का उपयोग करना शोर को फ़िल्टर करने के लिए पर्याप्त नहीं था।

ईएमए

मैंने 0.25, 0.50 और 0.75 में डंडे के साथ कोशिश की है। छोटे डंडों का बहुत प्रभाव नहीं था, और बड़े डंडों ने बहुत अधिक विलंबता को जोड़ा, इसलिए मुझे इसे स्थिर रखने के लिए लाभ कम करना पड़ा, जिसके परिणामस्वरूप समग्र प्रदर्शन बदतर हो गया।

मैंने पोटेंशियोमीटर (वाइपर और ग्राउंड के बीच) में एक 0.1 capacF कैपेसिटर जोड़ा है, और यह साफ करने के लिए लगता है।

अभी के लिए, यह काफी अच्छी तरह से काम करता है। इस बीच, मैं टिम वेस्कॉट द्वारा पोस्ट किए गए पेपर के माध्यम से पढ़ रहा हूं ।
आपकी मदद के लिए आप सभी को शुक्रिया।


क्या आप 31KHz pwm को सही तरीके से नियंत्रित कर सकते हैं?
हसन अलतार 14

@ हसनलत्तार: नहीं, मेरे द्वारा उपयोग की जाने वाली आवृत्तियाँ दूसरे ग्राफ (1, 8, 64, 256, 1024 के प्रीस्कूलर) पर हैं। 4 kHz और 500 हर्ट्ज श्रव्य हैं, इसलिए वे एक कष्टप्रद बीपिंग ध्वनि उत्पन्न करते हैं, जिससे मैं बचना चाहूंगा। जिसमें 31 kHz, 120 Hz और 30 Hz निकलता है। और बाद के दो बहुत धीमे हैं, मुझे लगता है। PWM रिज़ॉल्यूशन 8 बिट्स है, लेकिन मैं कम उपयोग कर रहा हूं, क्योंकि मेरा नियंत्रण संकेत केवल 7 बिट्स है, और मैं केवल PWM मान 96 से अधिक का उपयोग करता हूं।
tttapa

1
H-Bridge जिसे आपने लिंक किया है, डेटाशीट के फ्रंट पेज पर है: This device is suitable for use in switching applications at frequencies up to 5 kHz. लेकिन पेज 3 पर इलेक्ट्रिकल कैरेक्टर्स पूरी तरह से अधिकतम 690kHz का सुझाव देते हैं यदि आप सभी देरी जोड़ते हैं। (नीचे की 4 पंक्तियाँ) व्यक्तिगत रूप से, मैं उससे बहुत धीमी गति से जाऊँगा, लेकिन मुझे लगता है कि 31kHz पर्याप्त होना चाहिए ... अगर यह पृष्ठ 1 पर नोट के लिए नहीं था
21

हालाँकि, यह एक निश्चित कर्तव्य चक्र मानता है। (या एक करने के लिए "बस यह wiggle" निरपेक्ष अधिकतम आवृत्ति के लिए "परवाह नहीं है" कर्तव्य चक्र - आप इसे विषम है पर ध्यान देंगे) उच्च और निम्न कर्तव्य चक्र कुछ बहुत ही संकीर्ण दालों का उत्पादन कर सकते हैं, तो कैसे विस्तृत कर रहे हैं उन की तुलना में पेज 3 के नीचे?
एरोनड

1
निश्चित नहीं है कि यह आपकी समस्या है, लेकिन अगर टाइमस्टैम्प अलग-अलग हो सकती है, तो मुझे लगता है कि आपको त्रुटि * Ts को अभिन्न से जोड़ना चाहिए, न कि केवल त्रुटि, और अभिन्न को Ts से गुणा न करें। (यदि टीएस हमेशा एक स्थिर होता है तो इससे कोई फर्क नहीं पड़ता)
user253751

जवाबों:


9

एक कंट्रोल सिस्टम केवल उतना ही अच्छा है जितना कि सेंसर, सेंसर ओपन लूप चलाएं और कंट्रोल इनपुट को हटा दें। सेंसर के लिए अपना खुद का इनपुट बनाएं और इसे धीरे से स्लाइड करें (या स्थिति को धीरे-धीरे मज़बूती से स्लाइड करने का तरीका ढूंढें) यह सुनिश्चित करने के लिए स्थिति डेटा लेते समय कि यह सेंसर नहीं है। यदि सेंसर शोर है, तो एक नया सेंसर प्राप्त करके या इसे पार्सल करके या सेंसर के आउटपुट को फ़िल्टर करके सेंसर के प्रदर्शन में सुधार करें । आपको उच्च रिज़ॉल्यूशन वाले सेंसर की आवश्यकता हो सकती है।

यदि सेंसर शोर नहीं करता है, तो आपको एक अलग नियंत्रण लूप प्राप्त करने की आवश्यकता होगी। PID पहले ऑर्डर सिस्टम हैं और वास्तव में दर नियंत्रण में महान नहीं हैं।


धन्यवाद, वास्तव में उच्च PWM आवृत्तियों के साथ बहुत अधिक शोर है, इसलिए मुझे इसे सुधारने का एक तरीका खोजना होगा। क्या आपके पास ऐसा करने के लिए कोई संकेत है?
तृतीया

एक फिल्टर, मैकेनिकल या डिजिटल का उपयोग करें। यदि आप ऐसा नहीं कर सकते हैं कि वे शायद सेंसर को समानता दें तो अच्छा होगा। meta.stackexchange.com/questions/126180/…
वोल्टेज स्पाइक

6

आप सही हैं कि समस्या घर्षण से है, या संभवतः घर्षण और प्रतिक्रिया का एक संयोजन है। विभिन्न पल्स चौड़ाई के लिए औसत गति बनाम कर्तव्य चक्र की आपकी साजिश घर्षण के साथ एक प्रणाली की विशेषता है। यह पेपर बताता है कि आप क्या देख रहे हैं, और इसमें समस्याओं से निपटने के लिए हमेशा से उपयोग किए जाने वाले समाधानों का एक संग्रह है। आपने उन्हें अपने इंजीनियरिंग पाठ्यक्रम में नहीं देखा होगा क्योंकि उनका विश्लेषण करना कठिन है; आपको मूल रूप से उनके साथ काम करने के लिए केस-बाय-केस आधार पर उनके साथ फिडेल करना है।

मुझे नहीं पता कि वाणिज्यिक नियंत्रक क्या करते हैं, हालांकि मुझे संदेह है कि वहाँ कई तरह के समाधान हैं। मैंने इस तरह की चीजों के साथ अतीत में क्या किया है जब मेरे पीआईडी ​​नियंत्रक से मोटर ड्राइव सिग्नल कुछ सीमा से कम हो जाता है (शायद आपके मामले में 60 से 70 मायने रखता है) मैं एक कर्तव्य के साथ थ्रेसहोल्ड पर मोटर ड्राइव को स्पंदित करना शुरू करता हूं वह चक्र जो पीआईडी ​​आउटपुट के बराबर औसत ड्राइव बनाता है। मैं आमतौर पर इसके लिए एक सिग्मा-डेल्टा-ईश मॉड्यूलेटर का उपयोग करता हूं क्योंकि इसे बहुत कम लाइनों में लागू किया जा सकता है, लेकिन आप जो भी काम करते हैं उसके साथ जा सकते हैं।


4

ऐसा लगता है कि ज्यादातर शोर PWM ड्राइव सिग्नल से आ रहा है।

क्या आपने ADM कैप्चर को PWM चक्र में सिंक्रनाइज़ करने की कोशिश की है? अधिकांश माइक्रोकंट्रोलर के पास टाइमर पर एडीसी कैप्चर को ट्रिगर करने का एक तरीका है, इसलिए आप हमेशा चक्र के एक ही बिंदु पर ट्रिगर कर सकते हैं।

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


3

इसलिए मुझे फिर से नियंत्रक पर काम शुरू करने से पहले उस शोर को छानने का एक तरीका खोजना होगा।

आप सेंसर शोर (या किसी अन्य शोर माप / चर) को कुछ इस तरह से कोड कर सकते हैं (निम्न पास फ़िल्टरिंग):

एसछाना हुआ[]=αएसछाना हुआ[-1]+(1-α)एसकच्चा[]

कहाँ पे 0<<α1। 1 के करीब, चिकना दिखने वाला है, लेकिन यह अधिक अंतराल भी जोड़ता है, उदाहरण के लिए 0.9 के मूल्य से शुरू करें और देखें कि यह कैसे व्यवहार करता है।


मैंने कोशिश की है, लेकिन यह चोटियों से छुटकारा पाने के लिए पर्याप्त नहीं है, और यह बहुत अधिक अंतराल जोड़ता है।
tttapa

@tttapa मैं देखता हूं। अल्फा के लिए आपने किस मूल्य की कोशिश की? (0.8,0.9) यह कुछ ट्यूनिंग लेने वाला है, जो आपने पहले ही सोच लिया होगा।
बिग

मैंने अपने द्वारा पोस्ट किए गए EMA फ़िल्टर के एक प्लॉट को जोड़ने के लिए अपने मूल पोस्ट को अपडेट किया। मैंने 0.9 की कोशिश की है, और यह 0.75 से भी बदतर है, देरी के कारण लाभ बहुत कम होना चाहिए। मुझे लगता है कि मैं एडीसी शोर को साफ करने के लिए एक सीमित ईएमए का उपयोग करने जा रहा हूं, लेकिन अब संधारित्र पर्याप्त है।
tttapa
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.