fungsi analogWrite() dengan variabel duty cycle dan frekuensi (aplikasi PWM)

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:

  1. pin, hanya pin 9 dan 10
  2. dutyCyclePersen, nilai 0..100 adalah lebar pulsa on dalam persen
  3. frekuensi, nilai 0.24 hingga 8000000 (8Mhz)

berikut sketch/program fungsi analogWrite serbaguna

#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");
  Serial.println("https://www.project.semesin.com");
}

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);
  }
}

2 thoughts on “fungsi analogWrite() dengan variabel duty cycle dan frekuensi (aplikasi PWM)

  1. apakah fungsi lain seperti delay milisecond dan lainya berpengaruh atau tidak, saya minta ijin codingnya untuk membuat sycronous buck converter mppt solar charger

Leave a Reply

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