Stap 1: Prescalers en het Register van de Match vergelijken
De eerste parameter die ik zal bespreken is de snelheid waarmee de timer de teller verhoogt. De Arduino Klok draait op 16MHz, dit is de snelste snelheid dat de timers hun tellers kunnen verhogen. Bij 16MHz vertegenwoordigt elke tik van de teller 1/16,000,000 van een seconde (~ 63ns), dus een teller 10/16,000,000 seconden duurt tot een waarde van 9 (tellers zijn 0 geïndexeerd), en 100/16,000,000 seconden tot een waarde van 99.
In de meeste gevallen vindt u dat de teller snelheid instellen tot 16MHz te snel is. Timer0 en timer2 zijn 8 bits timers, wat betekent dat ze een maximale tegenwaarde van 255 kunnen opslaan. Timer1 is een 16-bits timer, wat betekent dat het een maximale waarde van 65535 kunt opslaan. Zodra een teller zijn maximum bereikt, zal het terug naar nul (dit heet overloop) Vink. Dit betekent bij 16MHz, zelfs als we het vergelijken wedstrijd register ingesteld op de waarde van max teller, interrupts zal optreden om 256/16,000,000 seconden (~ 16us) voor de 8 bit items, en elke 65.536/16,000,000 (~ 4 ms) seconden voor de teller van de 16-bits. Duidelijk, is dit niet erg handig als u alleen wilt onderbreken eenmaal een seconde.
In plaats daarvan kunt u de controle van de snelheid van de timer teller incrementele met behulp van iets genaamd een prescaler. Een prescaler bepaalt de snelheid van uw timer volgens de de volgende vergelijking:
(timer snelheid (Hz)) = (Arduino kloksnelheid (16MHz)) / prescaler
Dus een 1 prescaler zal het verhogen van de teller bij 16MHz, een prescaler van 8 zal het verhogen van 2MHz, een 64 prescaler = 250kHz, enzovoort. Zoals aangegeven in de tabellen hierboven, kan de prescaler gelijk zijn aan 1, 8, 64, 256 en 1024. (Ik zal het uitleggen van de betekenis van CS12, CS11 en CS10 in de volgende stap.)
Nu kunt u de interrupt-frequentie met de volgende vergelijking berekenen:
frequentie (Hz) onderbreken = (Arduino kloksnelheid 16.000, 000Hz) / (prescaler * (vergelijk match register + 1))
de + 1 is er omdat de vergelijk overeenkomen met register nul geïndexeerd
het herschikken van de bovenstaande vergelijking, kunt u oplossen voor het Vergelijk register matchpercentage dat zal uw gewenste interrupt-frequentie:
Vergelijk wedstrijd register = [16.000, 000Hz / (prescaler * gewenst interrupt-frequentie)] - 1
Onthoud dat als u timers 0 en 2 dit nummer minder dan 256, en minder dan 65536 voor timer1 moet
Dus als je een interrupt elke seconde (frequentie van 1Hz wilde):
Vergelijk wedstrijd register = [16,000,000 / (prescaler * 1)] -1
met een prescaler van 1024 krijg je:
Vergelijk wedstrijd register = [16,000,000 / (1024 * 1)] -1
= 15,624
Sinds 256 15,624 < < 65.536, moet u timer1 voor deze interrupt.