क्या मैं पल्स चौड़ाई मॉड्यूलेशन (PWM) के लिए GPIO का उपयोग कर सकता हूं?


97

क्या मैं GPIO का उपयोग पल्स-चौड़ाई मॉड्यूलेशन आउटपुट के रूप में कर सकता हूं ?

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


आपको संभवतः यह निर्दिष्ट करने की आवश्यकता है कि आप किस मॉडल का उपयोग कर रहे हैं। वे सभी थोड़े अलग हैं।
Not2qubit

2
@ user1147688 यह सवाल तब पूछा गया जब केवल एक मॉडल था!
berry120

जवाबों:


76

जैसा कि एलेक्स चेम्बरलेन ने सुझाव दिया था , WiringPi लाइब्रेरी मॉडल के आधार पर एक या दो GPIO पिन पर हार्डवेयर PWM आउटपुट और अन्य GPIO पिन में से किसी पर सॉफ्टवेयर PWM दोनों का समर्थन करती है । इस बीच RPIO.PWM लाइब्रेरी किसी GPIO पिन पर DMA द्वारा PWM करती है । प्रभावी रूप से यह हार्डवेयर और सॉफ्टवेयर पीडब्लूएम के बीच का एक आधा घर है, जो कि वायरिंगपाइ के सॉफ्टवेयर पीडब्लूएम [1] के साथ 100 half की तुलना में 1 compared का समय संकल्प प्रदान करता है ।

इनमें से कौन सा आपके अनुप्रयोगों के लिए उपयुक्त है यह इस बात पर निर्भर करता है कि आपको कितने PWM आउटपुट की आवश्यकता है और आप उन आउटपुटों में से कौन सा प्रदर्शन चाहते हैं।

यदि आपका आवेदन कम-समय के समाधान और उच्च घबराहट के लिए सहनशील है तो आप एक सॉफ्टवेयर या डीएमए असिस्टेड टाइमिंग लूप का उपयोग कर सकते हैं। यदि आप उच्च परिशुद्धता / कम घबराना PWM चाहते हैं तो आपको हार्डवेयर सहायता की आवश्यकता हो सकती है।

सॉफ्टवेयर PWM कब उपयुक्त हो सकता है?

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

हार्डवेयर पीडब्लूएम कब उपयुक्त हो सकता है?

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

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

क्या होगा यदि मुझे अधिक हार्डवेयर पीडब्लूएम आउटपुट की आवश्यकता है?

यदि आपको हार्डवेयर पीडब्लूएम आउटपुट की तुलना में अधिक सर्वो लूप चलाने की आवश्यकता है, तो आपको शायद हार्ड-रीयल-टाइम प्रदर्शन सुनिश्चित करने के लिए उन्हें किसी अन्य डिवाइस पर लोड करने की आवश्यकता है, जो आपके रास्पबेरी पाई को सॉफ्ट रीयल-टाइम सुपरवाइज़र होने के लिए आरोपित करता है

एक विकल्प, Adafruit 16-Channel 12-bit PWM / सर्वो चालक - I²C इंटरफ़ेस - PCA9685 जैसा कुछ होगा जो आपको I²IN बस के लिए GPIO के कुछ पिनों के साथ 16 PWM आउटपुट को नियंत्रित करने की अनुमति देगा। इसके उपयोग के एक उदाहरण के लिए, रास्पबेरी पाई मंचों पर I exampleC 16 चैनल PWM / सर्वो ब्रेकआउट - वर्किंग पोस्ट देखें।

1. सुझाव के लिए dm76 के लिए धन्यवाद , हालांकि हीदर का कहना है कि RPIO.PWM अब नए पीआई मॉडल के लिए काम नहीं कर सकता है।


क्या मैं डीसी मोटर चलाने के लिए सॉफ्टवेयर पीडब्लूएम दृष्टिकोण का उपयोग कर सकता हूं?
गिदोन

@ गिदोन - हां, मैंने जिस मोटर पावर एम्पलीफायरों का इस्तेमाल किया है, उन्होंने सभी को उनके इनपुट के रूप में पीडब्लूएम लिया है।
मार्क बूथ

2
FYI करें, RPI लाइब्रेरी ( pythonhosted.org/RPIO/pwm_py.html ) 100us रिज़ॉल्यूशन के साथ WiringPi की तुलना में बहुत बेहतर रिज़ॉल्यूशन (1us) है
dm76

@ मर्कबुट - नो प्रोब्स। लाइब्रेरी वास्तव में अच्छी तरह से लिखी गई है और इसे RPi.GPIO के लिए ड्रॉप-इन रिप्लेसमेंट के रूप में इस्तेमाल किया जा सकता है जो कि बहुत आसान है अगर आपने बाद में प्रोजेक्ट शुरू किया और बाद में एहसास हुआ कि पीडब्लूएम सिग्नल की जरूरत थी ...
dm76

RPIO.PWM अब नए पीआई मॉडल के लिए काम नहीं कर सकता है, मुझे लगता है।
हीथ

39

हार्डवेयर PWM

हां, रास्पबेरी पाई पर एक हार्डवेयर पीडब्लूएम आउटपुट है, जो P1-12 (GPIO18) से जुड़ा है। इसके अलावा, PWM आउटपुट को I PWC या SPI इंटरफ़ेस का उपयोग करके जोड़ा जा सकता है; कुछ लोगों को इसमें ( फोरम पोस्ट ) सफलता मिली है ।

उदाहरण कोड

आप PWM पिन को नियंत्रित करने के लिए WiringPi लाइब्रेरी का उपयोग कर सकते हैं ; आप पूरे पुस्तकालय को शामिल करने से बचने के लिए कोड को देख सकते हैं।

सॉफ्टवेयर PWM

रास्पबेरी पाई किसी भी गंभीर सॉफ्टवेयर पीडब्लूएम के लिए उपयुक्त नहीं है क्योंकि लिनक्स एक वास्तविक समय ऑपरेटिंग सिस्टम नहीं है।


1
प्रश्न, गंभीर सॉफ्टवेयर PWM की परिभाषा या उदाहरण क्या है? और "वास्तविक समय ऑपरेटिंग सिस्टम" क्या हैं और क्या कभी किसी के पी
एंथनीब्लके

@AnthonyBlake खैर, आप शायद सॉफ्टवेयर PWM का उपयोग करके एक प्रकाश की चमक को नियंत्रित कर सकते हैं, लेकिन मुझे संदेह है कि एक मोटर स्टाल होगा। हालांकि सॉफ्टवेयर PWM करने की कोई आवश्यकता नहीं है, हार्डवेयर सरल और अधिक प्रभावी है। Google द्वारा रीयल टाइम ऑपरेटिंग सिस्टम को बेहतर ढंग से समझाया जाएगा; वे ग्वारेंटी के बारे में कुछ खास बातें बताते हैं कि सॉफ्टवेयर कितने समय तक चलता है।
एलेक्स चैम्बरलेन

2
@AnthonyBlake ए "रियल-टाइम ओएस" (आरटीओएस) एक ऑपरेटिंग सिस्टम है जो आपको निष्पादन की ऊपरी समय सीमा की गारंटी देता है। कार्यक्रम को कहने के लिए "हाँ, आपके पास 33ms में कुछ निष्पादन समय होगा (फ्लिप करने के लिए 2ms सहिष्णुता दें या लें) कि जीपीआईओ अपने कदम मोटर को सटीक समय विंडो में संकेत देने के लिए थोड़ा सा पिन करता है जब उसे इसकी आवश्यकता होती है और आप भरोसा कर सकते हैं। उस पर!" वहाँ एक RT लिनक्स है। पता नहीं कि यह आरपीआई (अभी तक) में रखी गई है या नहीं।
२०

क्षमा करें, एलेक्स, मैंने जानबूझकर आपके उत्तर का दूसरा हिस्सा नहीं चुराया है, लेकिन मैंने सिर्फ यह देखा है कि हम अलग-अलग मार्गों से एक ही फोरम पोस्ट पर आए।
मार्क बूथ

2
40 पिन वाले नए मॉडल में एक दूसरा हार्डवेयर PWM GPIO19 (पिन 35) से जुड़ा होता है।
केविन

12

हाल के पीएस में दो हार्डवेयर पीडब्लूएम चैनल हैं। इसके अलावा हार्डवेयर पीडब्लूएम दालों को 40 पिन विस्तार हेडर से जुड़े सभी GPIO पर स्वतंत्र रूप से उत्पन्न किया जा सकता है।

व्यवहार में इसका मतलब है कि दो बेहद सटीक PWM चैनल हैं और अन्य सभी GPIO में Arduino style PWM (800 Hz, 0 off - 255 पूरी तरह से) हो सकते हैं।

जैसे इमोबलास्टर और मेरी पिगियो , आदि।


अच्छा जवाब! मैं उन दो HW PWM का उपयोग कैसे कर सकता हूं? मुझे 2 सर्वोस को नियंत्रित करने की आवश्यकता है, मुझे पता है कि आप कहते हैं कि सर्विसबस्टर और पिगियो इसके लिए ठीक हैं, लेकिन मुझे एचडब्ल्यू पीडब्लूएम के बारे में सिर्फ आश्चर्य है, क्योंकि मैं उनके बारे में कुछ नहीं पा सकता ... क्या इसके लिए कुछ डॉक्स हैं? मेरे पास परीक्षण के लिए आरपीआई 2 वी 1.1 है।
कोजुक


2
भारी सीपीयू लोड से फर्क नहीं पड़ना चाहिए। भारी नेटवर्क लोड विशेष रूप से gpioServo के लिए एक अंतर बना सकता है, खासकर अगर डिफ़ॉल्ट 200kHz के बजाय 1MHz पर नमूना। आवृत्ति 50 (हर्ट्ज) है, कर्तव्य चक्र की सीमा 0 - 1000000 होगी (0 - 5000000 के वास्तविक अंतर्निहित मूल्य के लिए मैप की गई)। 1 एमएस 20 एमएस में 1 एमएस है, इसलिए 5% का डीकाइसायकल 50000, 1.5ms-> 7.5% -> 75000, 2ms-> 10% -> 100000।
जौन

1
बीसीएम 2835 एआरएम पेरिफेरल्स के पृष्ठ 102 में विभिन्न तरीके दिखाए गए हैं जिन्हें जीपीआईओ सौंपा जा सकता है। ऑन-लाइन देखो जिसके लिए GPIO विभिन्न Pi मॉडल विस्तार हेडर के लिए नेतृत्व किया गया है।
जोआन

1
@ user1147688 PLLD (500MHz) का उपयोग कोर PWM घड़ी के रूप में किया जाता है। जिस तरह से "यह" काम करता है PWM कोर आवृत्ति 250 मेगाहर्ट्ज है। स्विच ऑन और ऑफ (पीडब्लूएम के लिए बहुत आवश्यक) अधिकतम 125 मेगाहर्ट्ज में सक्षम होने के लिए। आप PLLC (1000 MHz) का उपयोग करके आंकड़े को दोगुना कर सकते हैं लेकिन यह कि PLL कोर क्लॉक स्पीड के साथ बदलता रहता है।
जोआन

2

काफी वास्तविक समय में ओएस नहीं है, लेकिन रास्पबेरी पाई के लिए आरआईएससी ओएस सहकारी मल्टीटास्किंग है, इसलिए आप आसानी से एक एप्लिकेशन चला सकते हैं जिसमें 100% सीपीयू है ताकि आप अपने समय का बेहतर प्रबंधन कर सकें। बस कुछ और करने की उम्मीद न करें लेकिन आपका अपना कोड।


मैंने कहीं पढ़ा है कि आउटपुट पिन की स्विचिंग आवृत्ति के रूप में एक हार्डवेयर सीमा है। मुझे लगता है कि यह लगभग 20 मेगाहर्ट्ज था। इसलिए 100% CPU उपयोग के साथ भी 300 मेगाहर्ट्ज PWM या उस तरह की किसी भी चीज़ को खींचने में सक्षम होने की उम्मीद न करें।
पोंगडूडल

@Wallacoloo: क्या अनुप्रयोगों के लिए 300 मेगाहर्ट्ज पीडब्लूएम की आवश्यकता होती है?
पीटर मोर्टेंसन

2
@PeterMortensen: वैसे मैं नहीं जानता कि कैसे रेडियो ट्रांसमीटर और इस तरह उनके सिग्नल उत्पन्न होते हैं, लेकिन कुछ इसे PWM के साथ कर सकते हैं। PiFM 100 मेगाहर्ट्ज पर ऐसा करता है। ऐसा लगता है कि मेरी टिप्पणी के विपरीत है, इसलिए मुझे आश्चर्य है कि हो सकता है कि पिन को अब भी उस आवृत्ति पर कमांड किया जा सकता है, लेकिन यह सिर्फ इतना है कि पिन कैपेसिटेंस ऐसे संकेतों को दर्शाता है, ताकि 100 मेगाहर्ट्ज वर्ग-लहर वास्तव में उदाहरण के लिए दोलन कर सके (1.0 V , पूर्ण (0 V, 3.3 V) श्रेणी के बजाय, 2.3 V)।
पोंकडूडल

2

मुझे यह लाइब्रेरी ( पी-ब्लास्टर ) मिली है, जो दावा करती है कि "बेहद कुशल है: सीपीयू का उपयोग नहीं करता है और बहुत स्थिर परिणाम देता है।"

मैंने अभी तक इसका परीक्षण नहीं किया है, लेकिन जैसे ही मैं (शायद आज) अपडेट करूंगा


मैं यह कोशिश कर रहा हूं, लेकिन अभी तक कोई किस्मत नहीं। अब तक मैं बता सकता हूं कि यह वास्तव में हार्डवेयर स्विच नहीं करता है?
MrMowgli

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