Perintah analogWrite() dengan variabel duty cycle dan frekuensi pada pin 9 atau 10 ini berguna untuk membangkitkan sinyal PWM (PWM Generator) yang sangat variatif dari 0.24 Hz hingga 160kHz duty cycle 0.0 ~ 100.0%,sedangkan frekuensi 160kHz hingga 8MHz dengan duty cycle terbatas.
Modifikasi analogWrite ini menggunakan timer1 sebagai penanda waktunya, sehinggga hanya akan mempengaruhi pin 9 dan 10 saja, dan tidak bisa dikombinasikan dengan fungsi PWM arduino biasa.
Parameter PWM yang digunakan:
- pin, hanya pin 9 dan 10
- dutyCyclePersen, nilai 0..100 adalah lebar pulsa on dalam persen
- frekuensi, nilai 0.24 hingga 8000000 (8Mhz)
berikut sketch/program fungsi analogWrite serbaguna
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | #define PWM_1 9 #define PWM_2 10 void setup() { Serial.begin(9600); Serial.println( "fungsi analogWrite() dengan variabel duty cycle dan frekuensi pada pin 9 atau 10" ); Serial.println( "Pada penggunaan kombinasi pin 9 dan 10," ); Serial.println( "maka frekuensi yang di set terakhir yang akan digunakan" ); } void loop() { //analogWrite(pin, dutyCyclePersen, frekuensi) analogWrite(PWM_1, 50, 1000); while (1); } void analogWrite(byte pin, double dutyCyclePersen, double frekuensi) { if (frekuensi > 244.0) { TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); ICR1 = (16000000L/(frekuensi)) - 1; } else if (frekuensi > 30.0) { TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS11); ICR1 = (16000000L/(frekuensi * 8)) - 1; } else if (frekuensi > 3.0) { TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS11) | _BV(CS10); ICR1 = (16000000L/(frekuensi * 64)) - 1; } else if (frekuensi > 0.95) { TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS12); ICR1 = (16000000L/(frekuensi * 256)) - 1; } else if (frekuensi > 0.23) { TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS12) | _BV(CS10); ICR1 = (16000000L/(frekuensi * 1024)) - 1; } TCCR1A &= ~_BV(WGM10); TCCR1A |= _BV(WGM11); if (pin == 9) { pinMode(9, OUTPUT); TCCR1A |= _BV(COM1A1); OCR1A = (dutyCyclePersen/100) * (ICR1 + 1); } if (pin == 10) { pinMode(10, OUTPUT); TCCR1A |= _BV(COM1B1); OCR1B = (dutyCyclePersen/100) * (ICR1 + 1); } } |