PWM सिग्नल AVR चिप्स पर टाइमर द्वारा उत्पन्न होता है। प्रत्येक टाइमर दो या तीन अलग-अलग पिनों पर एक PWM सिग्नल उत्पन्न कर सकता है। प्रत्येक पिन का अपना कर्तव्य चक्र हो सकता है, लेकिन वे PWM आवृत्ति साझा करते हैं। आप टाइमर के लिए घड़ी के स्रोत को बदलकर पीडब्लूएम की आवृत्ति को बदल सकते हैं। डिफ़ॉल्ट रूप से वे 64 द्वारा विभाजित सीपीयू घड़ी का उपयोग करते हैं, अर्थात। वे Arduino आरंभीकरण कोड द्वारा 64 के लिए अपने प्रीस्कूलर सेट है। चीजों को और अधिक भ्रमित करने के लिए दो अलग-अलग PWM मोड हैं: तेज PWM और चरण सही PWM। तेज PWM में टाइमर 255 तक गिना जाता है, फिर ओवरफ्लो होता है और 0 (256 विभिन्न राज्यों) से शुरू होता है। चरण सही PWM में टाइमर 255 तक गिना जाता है, फिर दिशा बदलता है और नीचे की ओर शून्य में बदल जाता है, दिशा बदलता है और इतने पर (510 मिलियन राज्य)।
Arduino मेगा में 5 टाइमर, टाइमर0 - टाइमर 4 हैं। क्योंकि टाइमर0 का उपयोग मिलिस और माइक्रो फ़ंक्शंस के लिए भी किया जाता है क्योंकि यह तेज़ पीडब्लूएम का उपयोग करता है, जबकि अन्य टाइमर चरण सही पीडब्लूएम के लिए कॉन्फ़िगर किए गए हैं। इसके परिणामस्वरूप विभिन्न पिनों पर अलग-अलग फ्रीक्वेंसी होती हैं:
पिन 4 और 13,
टाइमर 0 द्वारा नियंत्रित: 16 मेगाहर्ट्ज / 64/256 = 976.56 हर्ट्ज
अन्य PWM पिन, टाइमर 1-4 द्वारा नियंत्रित:
16 मेगाहर्ट्ज / 64/510 = 490.20 हर्ट्ज
गणना है: राज्यों की घड़ी / प्रीस्कूलर / पीडब्लूएम मोड संख्या
स्थिति अन्य सभी Arduino बोर्डों के लिए समान है, जिन्हें मैं जानता हूं, सिवाय इसके कि उनके पास कम टाइमर हैं जो विभिन्न पिनों से जुड़ते हैं।
आप टाइमर प्रीस्कूलर को बदलकर PWM फ्रीक्वेंसी बदल सकते हैं। इस पृष्ठ को देखें: http://playground.arduino.cc/Main/TimerPWMCheatsheet
255 से भिन्न मानों की गणना करना भी संभव है। 8 बिट टाइमर पर आप आउटपुट पिन को ढीला कर देंगे, लेकिन 16 बिट टाइमर पर आप टॉप वैल्यू को परिभाषित करने के लिए इनपुट कैप्चर रजिस्टर का उपयोग कर सकते हैं। इनपुट कैप्चर कार्यक्षमता Arduino समुदाय में शायद ही कभी उपयोग की जाने वाली एक विशेषता है, इसलिए आपको इसकी याद नहीं होगी।
Arduino लाइब्रेरी केवल 8 बिट रिज़ॉल्यूशन का उपयोग करने की अनुमति देती है, यहां तक कि 16 बिट टाइमर पर भी। यदि आप उच्च रिज़ॉल्यूशन चाहते हैं, तो आपको अपना स्वयं का एनालॉग लिखना होगा, या उद्देश्य के लिए बनाई गई लाइब्रेरी का उपयोग करना होगा। Arduino मेगा पर टाइमर 0 और टाइमर 2 8 बिट हैं, जबकि बाकी 16 बिट हैं।
पूर्ण संकल्प का उपयोग करने के लिए 16 बिट टाइमर के मोड को बदलकर, प्रीस्कूलर और शीर्ष मूल्य को बदलने के संयोजन में, आप PWM आवृत्तियों की एक बहुत विस्तृत श्रृंखला प्राप्त कर सकते हैं।
अधिकतम आवृत्ति जो आप प्राप्त कर सकते हैं वह घड़ी / 4 है, प्रीस्कूलर को फास्ट पीडब्लूएम मोड में 1 और टीओपी 3 पर सेट करके - कम मूल्य की अनुमति नहीं है। यह आपको 2 बिट रिज़ॉल्यूशन के साथ 4 मेगाहर्ट्ज पीडब्लूएम देगा। यह 0%, 25%, 50% या 75% समय पर हो सकता है। एक उच्च शीर्ष मूल्य आपको कम आवृत्ति पर उच्च रिज़ॉल्यूशन देगा।
एक लंबे समय तक स्पष्टीकरण के लिए यह पढ़ लेख या का उल्लेख डेटापत्रक ।
प्रीस्कूलर को बदलने, PWM मोड, या टाइमर के लिए TOP मान के साथ गड़बड़ हो जाएगा millis()
और micros()
।