- PWM सिग्नल क्या है?
- GPIO पिन पर PWM उत्पन्न करने के लिए प्रोग्रामिंग PIC
- सर्किट आरेख
- सिमुलेशन
- PIC Microcontroller का उपयोग कर सर्वो मोटर को नियंत्रित करने के लिए हार्डवेयर सेटअप
PWM सिग्नल जेनरेशन हर एम्बेडेड इंजीनियर शस्त्रागार में एक महत्वपूर्ण उपकरण है, वे बहुत सारे अनुप्रयोगों के लिए काम में आते हैं जैसे सर्वो मोटर की स्थिति को नियंत्रित करना, कुछ बिजली के इलेक्ट्रॉनिक आईसी को कन्वर्टर्स / इनवर्टर और यहां तक कि एक साधारण एलईडी चमक नियंत्रण के लिए स्विच करना। PIC में माइक्रोकंट्रोलर्स PWM सिग्नल आवश्यक रजिस्टरों को सेट करके तुलना, कैप्चर और PWM (CCP) मॉड्यूल का उपयोग करके उत्पन्न किया जा सकता है, हम पहले ही सीख चुके हैं कि PIC PWM ट्यूटोरियल में कैसे करें। लेकिन उस विधि के साथ एक काफी कमी है।
PIC16F877A, केवल पिंस RC1 और RC2 पर PWM संकेत पैदा करता है, तो हम सीसीपी मॉड्यूल का उपयोग कर सकते हैं। लेकिन हम स्थितियों का सामना कर सकते हैं, जहां हमें पीडब्लूएम कार्यक्षमता के लिए अधिक पिन की आवश्यकता होती है। उदाहरण के लिए, मैं अपने रोबोट आर्म प्रोजेक्ट के लिए 6 RC सर्वो मोटर्स को नियंत्रित करना चाहता हूं, जिसके लिए CCP मॉड्यूल निराशाजनक है। इन परिदृश्यों में हम टाइमर मॉड्यूल का उपयोग करके PWM संकेतों का उत्पादन करने के लिए GPIO पिन को प्रोग्राम कर सकते हैं । इस तरह हम किसी भी आवश्यक पिन के साथ कई पीडब्लूएम सिग्नल उत्पन्न कर सकते हैं। मल्टीप्लेक्स आईसी का उपयोग करने की तरह अन्य हार्डवेयर हैक भी हैं, लेकिन जब प्रोग्रामिंग की जा सकती है तो हार्डवेयर पर निवेश क्यों करें। तो इस ट्यूटोरियल में हम सीखेंगे कि PIC GPIO पिन को PWM पिन में कैसे बदला जाए और इसका परीक्षण करने के लिए हम इसे डिजिटल आस्टसीलस्कप के साथ प्रोटीस पर अनुकरण करेंगे।पीडब्लूएम सिग्नल का उपयोग करके सर्वो मोटर की स्थिति को नियंत्रित करें और एक पोटेंशियोमीटर को अलग करके अपने कर्तव्य चक्र को अलग करें।
PWM सिग्नल क्या है?
इससे पहले कि हम विवरण में आएं, पीडब्लूएम सिग्नल क्या हैं, इस पर थोड़ा ब्रश करते हैं। पल्स चौड़ाई मॉड्यूलेशन (पीडब्लूएम) एक डिजिटल सिग्नल है जो नियंत्रण सर्किटरी में सबसे अधिक उपयोग किया जाता है। यह संकेत पूर्वनिर्धारित समय और गति में उच्च (5v) और निम्न (0v) सेट है। जिस समय के दौरान सिग्नल अधिक रहता है उसे "समय पर" कहा जाता है और जिस समय सिग्नल कम रहता है उसे "समय" कहा जाता है । नीचे दिए गए चर्चा के अनुसार PWM के लिए दो महत्वपूर्ण पैरामीटर हैं:
PWM का कर्तव्य चक्र
समय का प्रतिशत जिसमें PWM सिग्नल उच्च रहता है (समय पर) को कर्तव्य चक्र कहा जाता है। यदि सिग्नल हमेशा चालू रहता है तो यह 100% शुल्क चक्र में होता है और यदि यह हमेशा बंद रहता है तो यह 0% शुल्क चक्र है।
ड्यूटी साइकिल = समय चालू करें / (समय चालू करें + बंद समय चालू करें)
चर का नाम |
को संदर्भित करता है |
PWM_Frequency |
पीडब्लूएम सिग्नल की आवृत्ति |
T_TOTAL |
PWM के एक पूर्ण चक्र के लिए लिया गया कुल समय |
T_ON |
पीडब्लूएम सिग्नल के समय पर |
T_OFF |
PWM सिग्नल के बंद होने का समय |
साइकिल शुल्क |
PWM सिग्नल का कर्तव्य चक्र |
तो अब, चलो गणित करते हैं।
यह मानक सूत्र हैं जहां आवृत्ति बस समय का पारस्परिक है । आवृत्ति का मूल्य उपयोगकर्ता को उसके आवेदन की आवश्यकता के आधार पर तय और निर्धारित करना होता है।
T_TOTAL = (1 / PWM_Frequency)
जब उपयोगकर्ता ड्यूटी चक्र मान को बदलता है, तो हमारे कार्यक्रम को स्वचालित रूप से उस समय के अनुसार T_ON समय और T_OFF समय समायोजित करना चाहिए। तो उपर्युक्त सूत्र ड्यूटी_ चक्र और T_TOTAL के मूल्य के आधार पर T_ON की गणना करने के लिए उपयोग किए जा सकते हैं ।
T_ON = (ड्यूटी_ साइकिल * T_TOTAL) / 100
चूंकि एक पूर्ण चक्र के लिए पीडब्लूएम सिग्नल का कुल समय समय और ऑफ टाइम का योग होगा। जैसा कि ऊपर दिखाया गया है हम ऑफ टाइम T_OFF की गणना कर सकते हैं।
T_OFF = T_TOTAL - T_ON
इन सूत्रों को ध्यान में रखते हुए हम PIC माइक्रोकंट्रोलर की प्रोग्रामिंग शुरू कर सकते हैं। कार्यक्रम में ADC मान प्रपत्र POT के अनुसार अलग-अलग ड्यूटी चक्र के साथ PWM सिग्नल बनाने के लिए PIC टाइमर मॉड्यूल और PIC ADC मॉड्यूल शामिल हैं। यदि आप इन मॉड्यूल का उपयोग करने के लिए नए हैं, तो हाइपरलिंक पर क्लिक करके उपयुक्त ट्यूटोरियल को पढ़ने के लिए दृढ़ता से अनुशंसा की जाती है।
GPIO पिन पर PWM उत्पन्न करने के लिए प्रोग्रामिंग PIC
इस ट्यूटोरियल का पूरा कार्यक्रम हमेशा की तरह वेबसाइट के निचले भाग में पाया जा सकता है। इस खंड में आइए समझते हैं कि कार्यक्रम वास्तव में कैसे लिखा जाता है। सभी कार्यक्रमों की तरह, हम कॉन्फ़िगरेशन बिट्स सेट करके शुरू करते हैं। मैंने इसे मेरे लिए सेट करने के लिए मेमोरी व्यू विकल्प का उपयोग किया है।
// CONFIG #pragma config FOSC = HS // Oscillator Selection बिट्स (HS oscillator) #pragma config WDTE = OFF // वॉचडॉग टाइमर सक्षम करें बिट (WDT अक्षम) #pragma config PWR3 = OFF // पावर-अप टाइमर सक्षम करें बिट (PWRT) अक्षम) #pragma config BOREN = ON // ब्राउन-आउट रीसेट सक्षम करें (BOR सक्षम) #pragma config LVP = OFF // कम-वोल्टेज (एकल-आपूर्ति) इन-सर्किट सीरियल प्रोग्रामिंग सक्षम करें बिट (RB3) डिजिटल I / O है, एचसीएल पर MCLR प्रोग्रामिंग के लिए इस्तेमाल किया जाना चाहिए) #pragma config CPD = OFF // डेटा EEPROM मेमोरी कोड प्रोटेक्शन बिट (डेटा EEPROM कोड प्रोटेक्शन ऑफ) #pragma config WRT = OFF // फ्लैश प्रोग्राम मेमोरी राइट बिट्स (राइट प्रोटेक्शन ऑफ); सभी कार्यक्रम मेमोरी को EECON नियंत्रण द्वारा लिखा जा सकता है) #pragma config CP = OFF // फ्लैश प्रोग्राम मेमोरी कोड प्रोटेक्शन बिट (कोड प्रोटेक्शन ऑफ) // #pragma config स्टेटमेंट्स में प्रोजेक्ट फाइल शामिल होना चाहिए। // ON और OFF के लिए #define के बजाय प्रोजेक्ट एनम का उपयोग करें। #शामिल
फिर हम हार्डवेयर में उपयोग की जाने वाली घड़ी की आवृत्ति का उल्लेख करते हैं, यहां मेरा हार्डवेयर 20MHz क्रिस्टल का उपयोग करता है, आप अपने हार्डवेयर में आधारित मूल्य दर्ज कर सकते हैं। इसके बाद PWM सिग्नल का फ्रिक्वेंसी वैल्यू है। चूंकि मेरा उद्देश्य यहां एक हॉबी आरसी सर्वो मोटर को नियंत्रित करना है जिसके लिए 50 हर्ट्ज की पीडब्लूएम आवृत्ति की आवश्यकता होती है, जिसे मैंने 0.05KHz सेट किया है, क्योंकि आवृत्ति मान आप इसे अपने एप्लिकेशन आवश्यकताओं के आधार पर बदल भी सकते हैं।
KHz में (# 50Hz) #define _XTAL_FREQ 20000000 #define PWM_Frequency 0.05 //
अब, हमारे पास फ़्रिक्वेंसी का मूल्य है जो हम ऊपर चर्चा किए गए फ़ार्मुलों का उपयोग करके T_TOTAL की गणना कर सकते हैं। मिली सेकंड में समय का मान प्राप्त करने के लिए परिणाम को 10 से घटाया जाता है। मेरे मामले में T_TOTAL का मूल्य 2 मिली सेकंड होगा।
int T_TOTAL = (1 / PWM_Frequency) / 10; // आवृत्ति से कुल समय की गणना (मिली सेकेंड में) // 2msec
इसके बाद, हम ADC मॉड्यूल की स्थिति को पढ़ने के लिए Potentiometer की स्थिति को पढ़ने के लिए अपने ADC PIC ट्यूटोरियल में चर्चा करते हैं। आगे हमारे पास इंटरप्ट सर्विस रूटीन है जिसे हर बार कॉल किया जाएगा, टाइमर ओवरफ्लो होगा जो हमें बाद में वापस मिल जाएगा, अब हम मुख्य फ़ंक्शन की जांच करते हैं।
मुख्य फ़ंक्शन के अंदर हम टाइमर मॉड्यूल को कॉन्फ़िगर करते हैं । यहां मैंने हर 0.1ms के लिए ओवरफ्लो करने के लिए टाइमर मॉड्यूल को कॉन्फ़िगर किया है। समय के मूल्य की गणना नीचे दिए गए सूत्रों का उपयोग करके की जा सकती है
RegValue = 256 - में सेकंड और Fosc में ((विलंब * Fosc) / (prescalar * 4)) देरी हर्ट्ज
मेरे मामले में ०.४०१ सेकंड (०.० मिलीमीटर) की देरी के साथ ६४ और २० मेगाहर्ट्ज के प्रीस्कूलर के साथ मेरे रजिस्टर का मूल्य (टीएमआर ०) २४. होना चाहिए। इसलिए कॉन्फ़िगरेशन इस तरह दिखता है
टाइमर के लिए / ***** पोर्ट कॉन्फ़िगरेशन ****** / OPTION_REG = 0b00000101; // Timer0 बाहरी फ्रीक के साथ और 64 प्रीस्कूलर के रूप में // इसके अलावा पूर्ण UPM TMR0 = 248 सक्षम करता है ; // 0.0001 के लिए समय मान लोड करें; delayValue 0-256 केवल TMR0IE = 1 के बीच हो सकता है ; // PIE1 रजिस्टर GIE = 1 में टाइमर इंटरप्ट बिट सक्षम करें ; // वैश्विक रुकावट PEIE = 1 सक्षम करें ; // पेरिफेरल इंटरप्ट को सक्षम करें / *********** ______ *********** /
फिर हमें इनपुट और आउटपुट कॉन्फ़िगरेशन सेट करना होगा । यहां हम पीडब्ल्यूएम संकेतों को आउटपुट करने के लिए एडीसी मान और पोर्ट पिन को पढ़ने के लिए एएन 0 पिन का उपयोग कर रहे हैं। इसलिए उन्हें आउटपुट पिन के रूप में आरंभ करें और कोड की निचली पंक्तियों का उपयोग करके उन्हें कम करें।
आई / ओ ****** / टीआरआईएसडी = 0x00 के लिए / ***** पोर्ट कॉन्फ़िगरेशन ; // MCU को निर्देश दें कि PORT D पर सभी पिन आउटपुट PORTD = 0x00 हैं; // 0 / *********** ______ *********** / के लिए सभी पिन प्रारंभ करें /
लूप करते समय अनंत के अंदर, हमें कर्तव्य चक्र से समय (T_ON) के मूल्य की गणना करना होगा । समय पर और कर्तव्य चक्र बर्तन की स्थिति, ताकि हम उसे बार-बार कर अंदर के आधार पर भिन्न है, जबकि लूप के रूप में नीचे दिखाया गया है। 0.0976 वह मान है जिसे 100 प्राप्त करने के लिए 1024 के साथ गुणा किया जाना है और T_ON की गणना करने के लिए हमने मिलि सेकंड में मान प्राप्त करने के लिए इसे 10 से गुणा किया है।
जबकि (1) { POT_val = (ADC_Read (0)); // ADC ड्यूटी_ साइकल = (POT_val * 0.0976) का उपयोग करते हुए पॉट का मूल्य पढ़ें ; // मानचित्र 0 से 1024 से 0 से 100 T_ON = ((ड्यूटी_ साइकिल * T_TOTAL) * 10/100); // मिली सेकंड में सूत्र इकाई का उपयोग करके समय पर गणना करें __delay_ms (100); }
चूंकि टाइमर को प्रत्येक 0.1ms के लिए ओवर फ्लो पर सेट किया गया है, टाइमर बाधा सेवा दिनचर्या ISR को प्रत्येक 0.1ms के लिए कहा जाएगा । सेवा की दिनचर्या के अंदर हम गिनती नामक एक चर का उपयोग करते हैं और इसे प्रत्येक 0.1ms के लिए बढ़ाते हैं। इस तरह हम ट्रैक एफ टाइम रख सकते हैं। PIC माइक्रोकंट्रोलर में इंटरप्ट के बारे में अधिक जानने के लिए, लिंक का अनुसरण करें
if (TMR0IF == 1) // टाइमर ओवरफ्लो के कारण टाइमर फ्लैग को ट्रिगर किया गया है -> प्रत्येक 0.1ms के लिए ओवरफ्लो करने के लिए सेट { TMR0 = 248; // टाइमर मान लोड करें TMR0IF = 0; // क्लियर टाइमर इंटरप्ट फ्लैग काउंट ++; // प्रत्येक 0.1ms के लिए गणना वृद्धि -> गणना / 10 एमएस में गणना का मूल्य देगा }
अंत में यह T_ON और T_OFF के मूल्य के आधार पर GPIO पिन को टॉगल करने का समय है । हमारे पास गणना चर है जो मिलि सेकंड में समय का ट्रैक रखता है। इसलिए हम अगर समय से भी कम है यह देखना होगा कि चर का उपयोग समय पर यदि हाँ तो हम GPIO पिन वरना हम इसे बंद चालू रखने के लिए, और रखने के लिए यह नया चक्र शुरू होता है जब तक बंद कर दिया। यह एक PWM चक्र के कुल समय से तुलना करके किया जा सकता है। ऐसा करने का कोड नीचे दिखाया गया है
if (गिनती <= (T_ON)) // यदि समय आरडी 1 = 1 से कम है ; // GPIO चालू बाकी RD1 = 0; // GPIO बंद कर दें यदि (गणना> = (T_TOTAL * 10)) // एक नया चक्र शुरू होने तक इसे बंद रखें = 0;
सर्किट आरेख
PIC माइक्रोकंट्रोलर के GPIO पिन के साथ PWM उत्पन्न करने के लिए सर्किट आरेख वास्तव में सरल है, बस थरथरानवाला के साथ PIC शक्ति और AN1 और सर्वो मोटर पिन करने के लिए Potentiometer कनेक्ट RD1 को पिन करने के लिए, हम PWM संकेत प्राप्त करने के लिए GPIO पिन का उपयोग कर सकते हैं, मैंने चुना है RD1 बस यादृच्छिक से बाहर। दोनों पोटेंशियोमीटर और सर्वो मोटर 5 वी द्वारा संचालित है जो 7805 से विनियमित है जैसा कि सर्किट आरेख में नीचे दिखाया गया है।
सिमुलेशन
परियोजना का अनुकरण करने के लिए मैंने अपने प्रोटीस सॉफ्टवेयर का उपयोग किया। नीचे दिखाए गए सर्किट का निर्माण करें और कोड को अपने सिमुलेशन से लिंक करें और इसे चलाएं। आपको हमारे कार्यक्रम के अनुसार RD1 GPIO पिन पर PWM सिग्नल मिलना चाहिए और PWM के कर्तव्य चक्र को पोटेंशियोमीटर की स्थिति के आधार पर नियंत्रित करना चाहिए। नीचे दिए गए GIF से पता चलता है कि पीडिओमीटर के माध्यम से पीडब्लूएम सिग्नल और सर्वो मोटर कैसे प्रतिक्रिया करते हैं, जब एडीसी मान बदल जाता है।
PIC Microcontroller का उपयोग कर सर्वो मोटर को नियंत्रित करने के लिए हार्डवेयर सेटअप
मेरा पूरा हार्डवेयर सेट-अप नीचे दिखाया गया है, जो लोग मेरे ट्यूटोरियल का अनुसरण कर रहे हैं उनके लिए यह बोर्ड परिचित होना चाहिए, यह वही बोर्ड है जिसे मैंने अब तक अपने सभी ट्यूटोरियल में इस्तेमाल किया है। यदि आप यह जानने में रुचि रखते हैं कि आप इसे कैसे बनाते हैं, तो आप ब्लिंकिंग एलईडी ट्यूटोरियल का उल्लेख कर सकते हैं। अन्यथा बस ऊपर सर्किट आरेख का पालन करें और सभी को ठीक काम करना चाहिए।
कार्यक्रम अपलोड करें और पोटेंशियोमीटर को अलग-अलग करें और आपको सर्वो को पोटेंशियोमीटर की स्थिति के आधार पर स्थिति को बदलते हुए देखना चाहिए। इस परियोजना के पूरा काम कर दिए गए वीडियो में दिखाया गया है इस पृष्ठ के अंत में। आशा है कि आप इस परियोजना को समझ गए थे और इमारत का आनंद लिया था, अगर आपके पास इच्छा है, तो उन्हें मंच पर पोस्ट करने के लिए स्वतंत्र महसूस करें और मैं उत्तर देने में अपना सर्वश्रेष्ठ प्रयास करूंगा।
मैं कई इमदादी मोटरों को नियंत्रित करने के लिए विकल्पों को जोड़कर इस परियोजना को आगे बढ़ाने की योजना बना रहा हूं और इस तरह से एक रोबोटिक शाखा का निर्माण कर रहा हूं, जो कि हमने पहले से ही बनाए गए Arduino Robotic Arm के समान है। तो तब तक के लिए देखिये !!