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; } }
masih belum begitu faham…adakah referensi buku atau aritekel atau video lain?
dasar perhitungan-nya adalah datasheet ATmega2560 dan ATmega328
Selamat siang, mohon info apakah program-program tersebut bisa disimulasikan dengan progran UnoArduSim ? Terimakasih
Seharusnya bisa.
Selamat siang, Kang Asep
Kalau pakai stm32duino / STM32f103 /bluefille dengan kristal 72Mhz, katanya maksimum frekuensi pwm cuma 1,1Khz. Setelah saya coba dengan duty default 50% saya ukur cuma 549 Hz saja.
Adakah cara meningkatkan frekuesi PWM nya?
pada file Arduino15\packages\STM32\hardware\stm32\1.8.0\cores\arduino\pins_arduino.h sesuaikan bagian ini
#define PWM_FREQUENCY 1000
Sudah coba dilihat baris tersebut. Jika luang akan dilakukan testing kembali.
Terimakasih atas bantuannya.
Om Asep salam kenal mantep tutorialnya
Sory saya orang Awam pengen belajar Arduino
saya punya mainan lampu LED HPL dan sudah dirakit seri paralel untuk Aquarium
rencana mau menyalakan lampu Led menggunakan progogram terjadwal.
dan sudah dapet perogram waktu digabung dengan PWM, tapi masih ada kendala di seting waktu..
kalau boleh minta tolong untuk coding waktu jam dengan PWM seperti apa ya..
ini CODING yang sudah jalan buat test satu menit rencana mau buat per JAM dari jam 6 s/d jam 21
Terima kasih sebelumnya salam MUCHTAR
#include //mengincludekan library DS3231
#include
#include
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
DS3231 rtc(SDA, SCL); // inisialisasi penggunaan i2c
Time t;
#define buz 11
int Hor;
int Min;
int Sec;
int sensorPin = A0; // select the input pin for ldr
int sensorValue = 0; // variable to store the value coming from the sensor
int led_pin_1 = 2;
int led_pin_2= 3;
int led_pin_3 = 4;
int pot_pin = A0;
int output;
int led_value;
void setup()
{
Serial.begin(115200); //set komunikasi baut serial monitor pada 115200
rtc.begin();
TCCR1A = _BV(COM1A1) | _BV(COM1B1);
TCCR1B = _BV(WGM13) | _BV(CS10);
ICR1 = 22 ; // 10 bit resolution
OCR1A = 0; // vary this value between 0 and 400 for 10-bit precision
OCR1B = 328; // vary this value between 0 and 400 for 10-bit precision
pinMode (9, OUTPUT);
//pinMode (10, OUTPUT);
// pinMode (6, OUTPUT);
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
//setting pertama download program
//rtc.setDate(29, 02, 2020); //mensetting tanggal 07 april 2018
//rtc.setTime(10, 20, 00); //menset jam 22:00:00
// rtc.setDOW(2); //menset hari “Sabtu”
//setelah didownload awal selesai, download kedua dengan memberi tanda komen “//”
}
void loop()
{
t = rtc.getTime();
Hor = t.hour;
Min = t.min;
Sec = t.sec;
Serial.print(rtc.getDOWStr()); //prosedur pembacaan hari
Serial.print(” “);
Serial.print(rtc.getDateStr()); //prosedur pembacaan tanggal
Serial.print(” — “);
Serial.println(rtc.getTimeStr()); //prosedur pembacaan waktu
lcd.setCursor(0,0);
lcd.print(“Tgl: “);
lcd.setCursor(5,0);
lcd.print(rtc.getDateStr());
lcd.setCursor(0,1);
lcd.print(“Jam: “);
lcd.setCursor(5,1);
lcd.print(rtc.getTimeStr());
delay (1000); //waktu tunda 1 detik per cycle
if(Sec > 04 && Sec 10 && Sec = 14 && Sec = 18 && Sec 21 && Sec 25 && Sec = 29 && Sec = 33 && Sec = 37 && Sec = 41 && Sec 22){
// OCR1A/*pin 9*/ = 0/* speed 0 to 400 */;
// OCR1B/*pin 10*/ = 0/* speed 0 to 400 */;
// }
}
pwm aktif jam 6.00 hingga 20.59.
Luar Biasa …..Mantap Sodakoh Ilmu
terima kasih …
selamat siang kang asep, saya memprogram arduino mega pake simulink matlab, kemudian untuk frequnsi yang dijelaskan ditas bisa berjalan semestinya,, namun saya ada masalah untuk program pwm di simulink untuk membuat gate drive half bridge…
ya, silahkan …
Bang mau tanya, maksudnya noner urut pembagi trus pembgi itu apa
Kmudian nilai N pada persamaan mncari frekuensi, N itu nilai apa
‘nomor urut pembagi’ adalah index dari register timer yang nilainya adalah ‘pembagi’
‘N’ = ‘pembagi’
Saya bingung
perhitungannya lebih ke bahasa mesin, tetapi bisa lebih presisi,
cara lainnya bisa menggunakan library misalnya TimerOne