Pengaturan frekuensi PWM pada arduino (fungsi analogWrite(pin, value) tetap seperti biasa)

Perintah analogWrite(pin, onTime) pada arduino berfungsi membangkitkan sinyal PWM pada pin dimaksud. biasanya frekuensi yang dibangkitkan adalah :

  1. 976.5625Hz untuk arduino Uno pin 5 dan 6 (clock 16MHz)
  2. 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:

  1. Ketahui Timer yang digunakan (contoh pin 5 terintegrasi pada Timer 0).
  2. Catat nilai nomor urut pembagi sesuai dengan frekuensi yang diinginkan
  3. 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;
  }
}

16 thoughts on “Pengaturan frekuensi PWM pada arduino (fungsi analogWrite(pin, value) tetap seperti biasa)

  1. 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?

  2. 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 */;
    // }

    }

  3. 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…

Leave a Reply

Your email address will not be published. Required fields are marked *