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