कुछ पिनों में एक अलग PWM आवृत्ति क्यों होती है?


20

के लिए Arduino संदर्भ केanalogWrite() अनुसार , अधिकांश पिन पर PWM आवृत्ति ~ 490 हर्ट्ज है। हालाँकि, यह Uno पर पिन 5 और 6 के लिए ~ 980 हर्ट्ज और लियोनार्डो पर पिंस 3 और 11 के लिए है।

ये अलग क्यों हैं? क्या यह एक जानबूझकर डिजाइन की विशेषता है, या यह किसी तरह हार्डवेयर द्वारा तय किया गया है?

जवाबों:


23

पीडब्लूएम संकेतों के लिए वे केवल फ्रीक्वेंसी उपलब्ध नहीं हैं। हालाँकि, वे आवृत्तियों को निर्धारित प्रीस्कूलर द्वारा निर्धारित किया जाता है (जिसे आप नीचे विस्तृत रूप से आसानी से बदल सकते हैं)।

PWM पिन के 3 जोड़े में से प्रत्येक एक टाइमर से बंधा हुआ है, जिनमें से प्रत्येक की अपनी आधार आवृत्ति है, निम्नानुसार है:

  • पिन 5 और 6 को टाइमर 0 पर रखा गया है, जिसका आधार आवृत्ति 62500Hz है
  • पिंस 9 और 10 को टाइमर 1 पर रखा गया है, जिसका आधार आवृत्ति 31250Hz है
  • पिन 3 और 11 को टाइमर 2 पर रखा गया है, जिसमें 31250 हर्ट्ज की बेस फ्रीक्वेंसी है

फिर पिन के प्रत्येक सेट में कई प्रीस्कूलर मान होते हैं जिन्हें चुना जा सकता है, जो पिन की उस जोड़ी की आधार आवृत्ति को विभाजित करेगा। उपलब्ध prescaler मान हैं:

  • पिंस 5 और 6 में 1, 8, 64, 256 और 1024 के प्रीस्कूलर मान हैं
  • पिंस 9 और 10 में 1, 8, 64, 256 और 1024 के प्रीस्कूलर मान हैं
  • पिंस 3 और 11 में 1, 8, 32, 64, 128, 256 और 1024 के प्रीस्कूलर मान हैं

विभिन्न संयोजन दिए गए PWM पिन में अलग-अलग आवृत्तियों का उत्पादन करते हैं। ध्यान दें कि टाइमर 2 (पिन 3 और 11 से बंधा हुआ) में अधिक प्रीस्कूलर मान उपलब्ध हैं, जिसके परिणामस्वरूप अधिक आवृत्तियों उपलब्ध हैं।

अब, टाइमर 2 अलग क्यों है, यह एक अलग सवाल है।

संपादित करें: यहां प्रति पिन ( इस लेख से ) संभावित PWM आवृत्तियों की एक सूची दी गई है :

पिन 6 और 5 (OC0A और OC0B) के लिए:

  • यदि TCCR0B = xxxxx001, आवृत्ति 64kHz है
  • यदि TCCR0B = xxxxx010, आवृत्ति 8 kHz है
  • यदि TCCR0B = xxxxx011, आवृत्ति 1kHz है (यह डिकिमिला बूट लोडर से डिफ़ॉल्ट है)
  • यदि TCCR0B = xxxxx100, आवृत्ति 250Hz है
  • यदि TCCR0B = xxxxx101, आवृत्ति 62.5 हर्ट्ज है

पिन 9, 10, 11 और 3 (OC1A, OC1B, OC2A, OC2B) के लिए:

  • यदि TCCRnB = xxxxx001, आवृत्ति 32kHz है
  • यदि TCCRnB = xxxxx010, आवृत्ति 4 kHz है
  • यदि TCCRnB = xxxxx011, आवृत्ति 500 ​​हर्ट्ज है (यह डिकिमिला बूटलोडर से डिफ़ॉल्ट है)
  • यदि TCCRnB = xxxxx100, आवृत्ति 125Hz है
  • यदि TCCRnB = xxxxx101, आवृत्ति 31.25 हर्ट्ज है

TCCRnBवह जगह है जहां आप टाइमर के लिए प्रीस्कूलर बिट्स सेट करते हैं n, n0, 1 या 2 की जगह, उस टाइमर के आधार पर जिसे आप सेट करना चाहते हैं। यदि आप अभी भी बिटवाइज़ ऑपरेशन के बारे में अनिश्चित हैं, तो इस बिट गणित ट्यूटोरियल को पढ़ें ।

मेरे स्रोत:

ध्यान दें कि उन स्रोतों में विचलन प्रतीत होता है कि क्या पिन 9 और 10 में 5 और 6 या 3 और 11 के समान व्यवहार है, लेकिन आपको वैसे भी विचार मिलता है। मैं कोशिश कर रहा हूं और यह पता लगाने के लिए डेटशीट पढ़ रहा हूं कि कौन सही है, या क्या यह बोर्डों के बीच अंतर है।


1
ATmega इस उत्तर को क्या दर्शाता है? मैंने जांच नहीं की, लेकिन मैं शर्त लगाता हूं कि यह प्रति नियंत्रक से थोड़ा अलग है।
जिप्पी

@ जिप्पी अच्छी बात! स्रोत ATmega168 और 328 का उल्लेख करते हैं।
रिकार्डो

@jippie बस स्पष्ट करने के लिए, मेरे जवाब में, पिन नंबर यह बताता है कि वे कैसे यूनो बोर्ड पर पिनर हैं (पिन 1 का अर्थ है डिजिटल पिन 1, या D1, उदाहरण के लिए), न कि IC (ATmega328 pin 1) रीसेट है।
रिकार्डो

1
मेरा मानना है कि उन विवरणों के साथ बोर्ड, ऊनो, Duemilanove, मेगा, ... भी बदल
jippie

@ जिप्पी निश्चित रूप से, हाँ।
रिकार्डो

8

मुझे डिज़ाइन के बारे में जानकारी नहीं है, लेकिन यदि आप अपने Arduino पर माइक्रोकंट्रोलर के लिए डेटाशीट की जांच करते हैं, तो आप देखेंगे कि PWM पिन एक साथ और प्रति समूह एक टाइमर से जुड़े हैं। जिस गति से इस टाइमर को बढ़ाया जाता है वह कॉन्फ़िगर किए गए प्रीस्कूलर द्वारा भिन्न होता है। यदि आप एक निश्चित टाइमर के लिए प्रीस्कूलर को बदलते हैं, तो आप संबंधित PWM पिन के लिए PWM आवृत्ति को बदलते हैं। मेरा मानना ​​है कि कुछ टाइमर millis();फ़ंक्शन जैसे अन्य उद्देश्यों के लिए डबल हैं । यदि आप उस टाइमर के लिए प्रीस्कूलर बदलते हैं, तो लौटाए गए मान millis()उसी कारक से बंद हो जाएंगे।

आप निम्नानुसार प्रिस्क्रिप्शन के लिए सेटिंग की गणना कर सकते हैं:

$$ \ text {prescaler} = \ dfrac {f_ {CPU}} {PWMresolution × f_ {PWM}} = \ dfrac {16 \ text {MHz}} {256 × 490} \ स्वीकृत 128 $ $

prescaler = f [CPU] / (PWMresolution × f [PWM]) = 16000000 / (256 × 490) = लगभग 128।

डेटाशीट की जाँच करें और आप पाएंगे कि 128 वास्तव में प्रीस्कूलर मूल्यों में से एक है जिसे आप चुन सकते हैं।


2
लड़का, क्या हमें MathJax याद है या क्या? मुझे उम्मीद है कि हम बीटा के बाद इसे सक्षम कर लेंगे।
रिकार्डो

1
@ रिचार्डो मेरे ब्राउज़र में एक MathJax बटन है; ओ) meta.arduino.stackexchange.com/questions/13/…
jippie
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.