आप चरण 1 को 25 किलोहर्ट्ज़ पर चरण सही PWM मोड में कॉन्फ़िगर कर सकते हैं, और इसे पिन 9 और 10 पर दो आउटपुट का उपयोग कर सकते हैं जैसे:
// PWM output @ 25 kHz, only on pins 9 and 10.
// Output value should be between 0 and 320, inclusive.
void analogWrite25k(int pin, int value)
{
switch (pin) {
case 9:
OCR1A = value;
break;
case 10:
OCR1B = value;
break;
default:
// no other pin will work
break;
}
}
void setup()
{
// Configure Timer 1 for PWM @ 25 kHz.
TCCR1A = 0; // undo the configuration done by...
TCCR1B = 0; // ...the Arduino core library
TCNT1 = 0; // reset timer
TCCR1A = _BV(COM1A1) // non-inverted PWM on ch. A
| _BV(COM1B1) // same on ch; B
| _BV(WGM11); // mode 10: ph. correct PWM, TOP = ICR1
TCCR1B = _BV(WGM13) // ditto
| _BV(CS10); // prescaler = 1
ICR1 = 320; // TOP = 320
// Set the PWM pins as output.
pinMode( 9, OUTPUT);
pinMode(10, OUTPUT);
}
void loop()
{
// Just an example:
analogWrite25k( 9, 110);
analogWrite25k(10, 210);
for (;;) ; // infinite loop
}
0 के मान को लिखने का analogWrite25k()
मतलब है कि पिन हमेशा कम रहेगा, जबकि 320 का मतलब हमेशा हाई होता है। नियमित analogWrite()
को लगभग काम करना चाहिए , लेकिन यह 320 (यानी हमेशा उच्च) के रूप में 255 की व्याख्या करेगा।
यह कोड Arduino Uno या समान बोर्ड (ATmega168 या 328 @ 16 MHz) को मानता है। यहां इस्तेमाल की जाने वाली विधि में 16-बिट टाइमर की आवश्यकता होती है, और इस प्रकार यह टाइमर 1 का उपयोग करता है क्योंकि यह केवल यूनो पर उपलब्ध है; इसलिए केवल दो आउटपुट उपलब्ध हैं। विधि 16-बिट टाइमर के साथ अन्य AVR- आधारित बोर्डों के लिए अनुकूलित किया जा सकता है। जैसा कि गेरबेन ने कहा, उस टाइमर में एक समान ICRx रजिस्टर होना चाहिए। Arduino Mega पर 4 ऐसे टाइमर हैं, जिनमें से प्रत्येक में 3 आउटपुट हैं।