Perintah analogWrite(pin, onTime) pada arduino berfungsi membangkitkan sinyal PWM pada pin dimaksud. biasanya frekuensi yang dibangkitkan adalah :
- 976.5625Hz untuk arduino Uno pin 5 dan 6 (clock 16MHz)
- 488.28125Hz untuk arduino Uno pin 3, 9,10 dan 11 (clock 16MHz)
adakalanya kita membutuhkan frekuensi berbeda dari standar ini. Dengan mengatur register TCCRnB kita bisa mengatur frekuensi PWM arduino sehingga diperoleh frekuensi maksimum 62500Hz pada pin 5 dan 6 Arduino Uno, dan minimum 30.517578125Hz pada pin 3,9,10 dan 11 Arduino Uno. Formula/rumus yang dapat dipergunakan adalah :
A. Timer 0 Arduino Uno
frekuensi = io_clock/(N * TOP)
B. Timer 1 dan 2 Arduino Uno
frekuensi = io_clock/(2 * N * TOP)
dengan io_clock = 16Mhz dan TOP = 256
dengan merubah nilai N kita bisa mendapatkan harga frekuensi yang berbeda:
Penggunaan perintah analogWrite(pin, value) tetap seperi biasa (nilai value berkisar antara 0 ~ 255).
catatan : merubah register Timer 0 akan berdampak langsung terhadap fungsi delay(), millis() dan micros()
A. Arduino UNO
Nomor urut pembagi | Pembagi | frekuensi (Hz) |
Timer 0, pin 5 dan 6 | ||
1 | 1 | 62500 |
2 | 8 | 7812.5 |
3* | 64 | 976.5625 |
4 | 256 | 244.140625 |
5 | 1024 | 61.03515625 |
Timer 1, pin 9 dan 10 | ||
1 | 1 | 31250 |
2 | 8 | 3906.25 |
3* | 64 | 488.28125 |
4 | 256 | 122.0703125 |
5 | 1024 | 30.517578125 |
Timer 2, pin 3 dan 11 | ||
1 | 1 | 31250 |
2 | 8 | 3906.25 |
3 | 32 | 976.5625 |
4* | 64 | 488.28124 |
5 | 128 | 244.140625 |
6 | 256 | 122.0703125 |
7 | 1024 | 30.517578125 |
tanda * adalah nilai default
B. Arduino Mega
—Menyusul
cara penggunaannya:
- Ketahui Timer yang digunakan (contoh pin 5 terintegrasi pada Timer 0).
- Catat nilai nomor urut pembagi sesuai dengan frekuensi yang diinginkan
- masukkan kedalam baris sketch
TCCR0B = TCCR0B & B11111000 | Nomor-urut-pembagi; (TCCR0B = Timer 0, TCCR1B = Timer 1, TCCR2B = Timer 2)
contoh: TCCR0B = TCCR0B & B11111000 | 1;
contoh dalam sketch/program:
int pinPWM = 5; void setup() { pinMode(pinPWM,OUTPUT); } void loop() { analogWrite(pinPWM,128); TCCR0B = (TCCR0B & 0b11111000) | 1; while(1); }
atau menggunakan fungsi yang fleksibel berikut:
void setPwmFrequency(int pin, int divisor) { byte mode; if(pin == 5 || pin == 6 || pin == 9 || pin == 10) { switch(divisor) { case 1: mode = 0x01; break; case 8: mode = 0x02; break; case 64: mode = 0x03; break; case 256: mode = 0x04; break; case 1024: mode = 0x05; break; default: return; } if(pin == 5 || pin == 6) { TCCR0B = TCCR0B & 0b11111000 | mode; } else { TCCR1B = TCCR1B & 0b11111000 | mode; } } else if(pin == 3 || pin == 11) { switch(divisor) { case 1: mode = 0x01; break; case 8: mode = 0x02; break; case 32: mode = 0x03; break; case 64: mode = 0x04; break; case 128: mode = 0x05; break; case 256: mode = 0x06; break; case 1024: mode = 0x07; break; default: return; } TCCR2B = TCCR2B & 0b11111000 | mode; } }