Pengetahuan Dasar Menggunakan Timer ESP32 dgn Arduino IDE

Draft

ESP32 mempunyai 4 timer hardware, yang masing-masing merupakan  counter up/down 64-bit dengan prescaler 16-bit. Kecuali ESP32-C3 yang hanya mempunyai 2 timer yang masing-masing 54 bit saja. Timer ESP32 juga memiliki kemampuan memuat ulang otomatis (auto-reloading ) di akhir periode counting.

Setiap timer ESP32 menggunakan clock APB (APB_CLK biasanya dgn frekuensi 80 MHz) sebagai clock dasar. Clock ini kemudian diperkecil (dibagi) oleh prescaler 16-bit yang menghasilkan  time-base tick time . Kita bisa mengubah nilai prescaler untuk mengontrol waktu tick timer.

Prescaler 16-Bit dapat membagi APB_CLK dengan faktor dari 2 ~ 65536. Saat kita menetapkan nilai prescaler menjadi 1 atau 2, pembagi clocknya adalah 2. Ketika kita mengatur prescaler ke 0, pembagi clocknya adalah 65536. Untuk prescaler lainnya akan menyebabkan clock dibagi dengan nilai yang sama dengan nilai precaler yang kita tulis ke register prescaler.

ESP32 timers dapat mentriger Event/kejadian alarm yang menyebabkab timer reload atau terjadi interrupt tergantung konfigurasi yg kita buat. Alarm event ditrigger ketika nilai di alarm register yg kita set sama dengan nilai timer saat ini. kondisi ini digunakan untuk interupsi periodik di dalam projek kita.

Rumus durasi interupsi periodik Timer ESP32

Untuk menghasilkan event periodik , kita akan menggunakan pembangkitan event alarm serta prescaler untuk mencapai periodik interupsi yang diinginkan. Ada 3 kasus khusus untuk persamaan Timer di bawah ini, yaitu Ketika Prescaler=1 atau 2, maka rumusnya  OUT = TimerTicks x (2/APB_CLK)  . Ketika Prescaler=0, maka rumusnya  OUT = TimerTicks x (65536/APB_CLK) . selain itu ( nilai presclaer bukan 0,1 dan 2) gunakan rumus di bawah.

ESP32 Timer Equation - Arduino Example

Contoh-1

Kita akan membuat LED kedip setiap 1 ms  Untuk ini, kita akan menggunakan persamaan di atas, APB_CLK default adalah 80MHz atau 80.000.000Hz. OUT yang diinginkan untuk periode interupsi di mana kita akan mengaktifkan LED adalah 1ms, Jadi OUT = 1ms atau 0.001s . Hanya dua yang tidak diketahui sekarang adalah nilai Prescaler dan jumlah TimerTicks yang akan kita set di event alarmnya.

Kita dapat mengatur Prescaler ke nilai apa pun yang kita inginkan tetapi untuk menyederhanakan perhitungan, kita set Prescaler =80 . sekarang tinggal nilai  TimerTicks  yg akan kita cari dengan rumus persamaan untuk TimerTicks:

Contoh Pengatur Waktu ESP32 Arduino

dengan rumus diatas kita memperoleh nilai TimerTicks = 1000 .

Code programnya :

#define LED 2    // pin LED tergantung type ESP32 boardnya
 
hw_timer_t *Timer_LED = NULL;
 
void IRAM_ATTR Timer0_ISR()
{
    digitalWrite(LED, !digitalRead(LED));
}
void setup()
{
    pinMode(LED, OUTPUT);

    Timer_LED = timerBegin(0, 80, true);  //(timer0, prescalar=80, true=countUp)

    timerAttachInterrupt(Timer_LED, &Timer0_ISR, true);//aktifkan interupsi 

    timerAlarmWrite(Timer_LED, 1000, true); // (ISR,  timerTick=1000, reload =true)

    timerAlarmEnable(Timer_LED);//aktifkan timer berjalan terus menerus
}
void loop()
{
    
}
Contoh 2 :
Kita akan membuat led berkedip tiap 1 detik

#define LED 2

hw_timer_t *My_timer = NULL;

void IRAM_ATTR onTimer()
{
digitalWrite(LED, !digitalRead(LED));
}


void setup() 
{
pinMode(LED, OUTPUT);
My_timer = timerBegin(1, 80, true);
timerAttachInterrupt(My_timer, &onTimer, true);
timerAlarmWrite(My_timer, 1000000, true);  //interupsi tiap 1 detik 
timerAlarmEnable(My_timer); 
}

void loop() 
{
}

============================================

Contoh-3

const byte LED_GPIO = 2;
volatile int interruptCounter;  
volatile int blinkCounter = 0;
hw_timer_t * timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;

void IRAM_ATTR onTimer() 
{
  portENTER_CRITICAL_ISR(&timerMux);
  interruptCounter++;
  blinkCounter++;
  portEXIT_CRITICAL_ISR(&timerMux);
}

void setup() {
  Serial.begin(9600);
  pinMode(LED_GPIO, OUTPUT);
  timer = timerBegin(0, 80, true);
  timerAttachInterrupt(timer, &onTimer, true);
  timerAlarmWrite(timer, 1000000, true);
  // Start the timer
  timerAlarmEnable(timer);
}

void loop() {
  if (interruptCounter > 0) 
{
    Serial.print(blinkCounter);
    Serial.print("  ");
    portENTER_CRITICAL(&timerMux);
    interruptCounter--;
    //    timerAlarmDisable(timer);
    if (blinkCounter % 2 == 0)
    {
      timerAlarmWrite(timer, 5000000, true);
    }
    else
    {
      timerAlarmWrite(timer, 500000, true);
    }
    //    timerAlarmEnable(timer);
    portEXIT_CRITICAL(&timerMux);
    toggleLED();     
  }
}

void toggleLED() 
{
  digitalWrite(LED_GPIO, HIGH);   
  delay(50);                    
  digitalWrite(LED_GPIO, LOW);  
}

Berikut ini daftar lengkap fungsi yang dapat kita gunakan dalam memprogram timer ESP32 :


void timerEnd(hw_timer_t * timer);
void timerStart(hw_timer_t * timer);
void timerStop(hw_timer_t * timer);
void timerRestart(hw_timer_t * timer);
void timerWrite(hw_timer_t * timer, uint64_t val);

uint64_t timerRead(hw_timer_t * timer);
uint64_t timerReadMicros(hw_timer_t * timer);
uint64_t timerReadMilis(hw_timer_t * timer);
double timerReadSeconds(hw_timer_t * timer);
uint32_t timerGetFrequency(hw_timer_t * timer);

void timerAttachInterrupt(hw_timer_t * timer, void (*userFunc)(void));
void timerAttachInterruptArg(hw_timer_t * timer, void (*userFunc)(void*), void * arg);
void timerDetachInterrupt(hw_timer_t * timer);

void timerAlarm(hw_timer_t * timer, uint64_t alarm_value, bool autoreload, uint64_t reload_count);1

referensi

About pccontrol

Berisi Tutorial Menggunakan PC untuk mengontrol Peralatan dengan cara mudah & praktis untuk pemula.

Posted on 13/04/2024, in Arduino. Bookmark the permalink. Comments Off on Pengetahuan Dasar Menggunakan Timer ESP32 dgn Arduino IDE.

Comments are closed.