Arduino Timer: mainkan dengan pengaturan waktu di proyek Anda

Timer Arduino UNO

Beberapa waktu lalu kami menerbitkan lebih banyak informasi tentang milis() fungsi de ArduinoSekarang kita akan mempelajari lebih dalam tentang Arduino Timer, untuk memulai fitur ini untuk fitur tersebut, pahami cara board ini mengelola waktu dengan MCU, serta fungsi lain di luar milis().

Apa itu Timer Arduino?

pengatur waktu arduino

El Pengatur waktu Arduino, atau pengatur waktu, adalah fungsi yang diimplementasikan oleh perangkat keras (dalam mikrokontroler, dengan bantuan kristal kuarsa yang menghasilkan pulsa jam dan yang mengatur "ritme", tanpa memerlukan perangkat keras eksternal atau IC 555) yang memungkinkan pengontrolan peristiwa sementara berkat jam intern. Misalnya, membuat tugas terjadi pada interval, membuat pengukuran waktu yang tepat, dll., terlepas dari kode sketsa.

Como Arduino UNO Ini memiliki chip MCU yang bekerja pada 16 Mhz, 16.000.000 dapat dieksekusi setiap detik. Instruksi membutuhkan siklus X untuk dieksekusi, tidak semuanya dieksekusi dalam siklus clock yang sama, misalnya, yang 16-bit membutuhkan lebih banyak siklus dalam arsitektur AVR ini.

Bayangkan Anda menggunakan penundaan () fungsi, ini akan memblokir eksekusi pada Arduino MCU hingga waktu yang ditentukan berlalu dan kemudian melanjutkan program, tetapi timer tidak akan memblokir. Ini akan menjadi waktu karena MCU terus mengeksekusi instruksi lain secara bersamaan. Itulah keuntungan besar.

Pengatur waktu terkait dengan gangguan Arduino, karena mereka akan dieksekusi melalui mereka untuk menghadiri beberapa tugas tertentu. Dengan kata lain, Arduino Timer adalah fungsi yang dipicu pada waktu tertentu, menjalankan fungsi interupsi. Itulah mengapa penting juga untuk mengetahui gangguan ini.

Mode

Arduino Timer memiliki 2 mode operasi, dapat menggunakannya di:

  • sinyal PWM: Anda dapat mengontrol Pin Arduino (~).
  • CTC (Hapus pengatur waktu pada pertandingan bandingkan): menghitung waktu di dalam penghitung dan ketika mencapai nilai yang ditentukan dalam register penghitung waktu, interupsi dijalankan.

Ada berapa timer nya? Jenis Timer

Arduino UNO fungsi milis

di sana 3 pengatur waktu di piring Arduino UNO, meskipun mungkin ada lebih banyak di piring atas lainnya:

  • pengatur waktu 0: 8-bit, dapat menghitung dari 0 hingga 255 (256 kemungkinan nilai). Digunakan oleh fungsi seperti delay(), millis(), dan micros(). Modifikasinya tidak disarankan agar tidak mengubah program.
  • pengatur waktu 1: sama dengan Timer 0. Digunakan oleh perpustakaan Servo di UNO (Timer 5 untuk MEGA).
  • pengatur waktu 2: 16-bit, dan dapat berkisar dari 0 hingga 65.525 (65.536 kemungkinan nilai). Digunakan untuk fungsi tone(), jika tidak digunakan, dapat digunakan secara bebas untuk aplikasi Anda.
  • Timer 3, 4, 5 (hanya di Arduino MEGA): semua 16-bit.

Bagaimana cara kerja Arduino Timer?

pengatur waktu, pengatur waktu

Untuk bisa bekerja dengan Timer Arduino, sangat penting untuk mengetahui bagaimana semua ini bekerja secara elektronik di MCU papan pengembangan ini:

  • Frekuensi jam: adalah jumlah siklus per detik yang mampu dikembangkannya, dalam kasus Arduino itu adalah 16 Mhz, atau yang sama, sinyal jam berosilasi 16.000.000 kali dalam satu detik (siklus).
  • Periode: diwakili oleh T, dan diukur dalam detik, dan merupakan kebalikan dari siklus. Misalnya, T=1/C, yang akan menghasilkan 1/16000000 = 0.0000000625, waktu yang diperlukan untuk menyelesaikan setiap siklus. Dan frekuensi adalah kebalikan dari periode, jadi f = 1/T.
  • Siklus: adalah setiap pengulangan sinyal yang terjadi per satuan waktu. Di Arduino itu akan menjadi 16M dalam satu detik. Atau apa sama, dalam hal ini, ketika 16 juta siklus telah berlalu, satu detik telah berlalu. Oleh karena itu, satu siklus dapat dikatakan membutuhkan waktu 625 ns.
  • tepi sinyal: Sinyal jam berbentuk persegi, dan ujungnya bisa naik atau turun. Tepi adalah garis lurus sinyal ketika berubah dari:
    • 0 (rendah) hingga 1 (tinggi): tepi naik.
    • 1 (tinggi) hingga 0 (rendah): tepi jatuh.

Tepi penting karena pengatur waktu Arduino mengukur siklus dari tepi sinyal. A) Ya sang kontador itu bertambah dengan setiap siklus dan ketika mencapai nilai register, interupsi dieksekusi.

Oleh karena itu, setelah Anda mengetahui hal ini, jika Anda memiliki 16Mhz di Arduino MCU, dan Timer 8-bit digunakan, dapat dikatakan bahwa interupsi akan terjadi setiap 16 s (256/16000000) atau 4 ms untuk 16-bit (65536/16000000). Oleh karena itu, jika Anda mengatur register penghitung 16-bit ke maksimum, dengan nilai 65535, maka interupsi akan terjadi pada 4 ms untuk menjalankan tugas apa pun itu.

Ketika penghitung mencapai nilai maksimum yang mungkin, itu akan kembali ke 0 lagi. Artinya, terjadi overflow dan akan menghitung mundur dari awal.

Untuk mengontrol laju peningkatan penghitung waktu, Anda juga dapat menggunakan seorang penskala, yang mengambil nilai 1, 8, 64, 256 dan 1024 dan mengubah waktunya seperti ini:

Kecepatan Timer (Hz) = Frekuensi Jam Arduino / Prescaler

Jika 1 prescaler controller akan meningkat menjadi 16 Mhz, jika 8 menjadi 2 Mhz, jika 64 menjadi 250 kHz, dan seterusnya. Ingatlah bahwa akan ada komparator status penghitung waktu untuk membandingkan nilai penghitung dan pra-skaler sampai mereka sama dan kemudian melakukan tindakan. Jadi, frekuensi interupsi diberikan oleh rumus:

+1 adalah karena register penghitung diindeks pada 0, yaitu tidak mulai menghitung pada 1, tetapi pada 0.

Kecepatan Interupsi (Hz) = Frekuensi Jam Arduino / Prescaler (nilai register komparator + 1)

Untungnya, kita tidak boleh mengubah catatan dari Timer Arduino, karena akan diurus oleh perpustakaan yang kita gunakan dalam kode. Tetapi jika tidak digunakan, mereka harus dikonfigurasi.

Contoh di Arduino IDE

Arduino IDE, tipe data, pemrograman

Untuk memahami semua ini sedikit lebih baik, di sini saya menunjukkan dua kode sketsa untuk Arduino IDE yang dapat Anda gunakan untuk mengalami penggunaan timer. Yang pertama adalah kode yang akan mengedipkan LED yang terhubung ke pin 8 Arduino setiap detik:

#define ledPin 8
void setup()
{
  pinMode(ledPin, OUTPUT);
  // Configurar Timer1
  TCCR1A = 0;                        //Registro control A a 0, pines OC1A y OC1B deshabilitados
  TCCR1B = 0;                        //Limpia el registrador
  TCCR1B |= (1<<CS10)|(1 << CS12);   //Configura prescaler a 1024: CS12 = 1 y CS10 = 1
  TCNT1 = 0xC2F8;                    //Iniciar timer para desbordamiento a 1 segundo
                                     //65536-(16MHz/1024/1Hz - 1) = 49912 = 0xC2F8 en hexadecimal
  
  TIMSK1 |= (1 << TOIE1);           //Habilitar interrupción para Timer1
}
void loop()
{
}
ISR(TIMER1_OVF_vect)                              //Interrupción del TIMER1 
{
  TCNT1 = 0xC2F7;                                 // Reniciar Timer1
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1); //Invierte el estado del LED
}

Program kedipan atau kedipan LED, seperti pada kasus sebelumnya setiap detik, tetapi kali ini menggunakan CTC yaitu perbandingan:

#define ledPin 8
void setup()
{
  pinMode(ledPin, OUTPUT);
  
  // Configuración Timer1
  TCCR1A = 0;                //Registro de control A a 0
  TCCR1B = 0;                //Limpiar registro
  TCNT1  = 0;                //Inicializar el temporizador
  OCR1A = 0x3D08;            //Carga el valor del registro de comparación: 16MHz/1024/1Hz -1 = 15624 = 0X3D08
  TCCR1B |= (1 << WGM12)|(1<<CS10)|(1 << CS12);   //Modo CTC, prescaler de 1024: CS12 = 1 y CS10 = 1  
  TIMSK1 |= (1 << OCIE1A);  //Habilita interrupción por igualdad de comparación
}
void loop()
{
}
ISR(TIMER1_COMPA_vect)          //Interrupción por igualdad de comparación en TIMER1
{
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1);   //Invierte el estado del LED
}

Lebih lanjut tentang pemrograman Arduino

beli piring Arduino UNO Wahyu3

Jadilah yang pertama mengomentari

tinggalkan Komentar Anda

Alamat email Anda tidak akan dipublikasikan. Bidang yang harus diisi ditandai dengan *

*

*

  1. Penanggung jawab data: Miguel Ángel Gatón
  2. Tujuan data: Mengontrol SPAM, manajemen komentar.
  3. Legitimasi: Persetujuan Anda
  4. Komunikasi data: Data tidak akan dikomunikasikan kepada pihak ketiga kecuali dengan kewajiban hukum.
  5. Penyimpanan data: Basis data dihosting oleh Occentus Networks (UE)
  6. Hak: Anda dapat membatasi, memulihkan, dan menghapus informasi Anda kapan saja.