Schritt 1: Prescalers und das Compare Match Register
Der erste Parameter, die, den ich erläutern werde, ist die Geschwindigkeit, mit der der Timer den Zähler erhöht. Die Arduino-Uhr läuft mit 16MHz, dies ist die schnellste Geschwindigkeit, dass der Timer können ihre Zähler inkrementieren. Bei 16MHz stellt jeder Teilstrich des Zählers 1/16.000.000 einer Sekunde (~ 63ns), so dass ein Zähler 10/16.000.000 Sekunden dauert auf einen Wert von 9 zu erreichen (Zähler sind 0 indiziert), und 100/16.000.000 Sekunden auf einen Wert von 99 erreichen.
In vielen Situationen finden Sie, dass die Zähler-Geschwindigkeit auf 16MHz zu schnell ist. Timer0 und timer2 sind 8-Bit Timer, was bedeutet, dass sie einen maximalen Gegenwert der 255 speichern können. TIMER1 ist ein 16-Bit-Timer, was bedeutet, dass es einen maximalen Gegenwert von 65535 speichern kann. Sobald ein Zähler sein Maximum erreicht, wird es wieder auf Null tick (Dies nennt man Überlauf). Dies bedeutet bei 16MHz, auch wenn wir das Compare Match Register auf der max Zählerwert eingestellt Interrupts treten alle 256/16.000.000 Sekunden (~ 16us) für die 8-Bit-Zähler und jeder 65.536/16.000.000 (~ 4 ms) Sekunden für den 16-Bit-Zähler. Das ist natürlich nicht sehr nützlich, wenn Sie nur einmal pro Sekunde unterbrechen wollen.
Stattdessen können Sie die Geschwindigkeit der Timer Zähler addressierte mithilfe von so genannten einen Vorteiler steuern. Ein Vorteiler bestimmt die Geschwindigkeit von Ihren Timer entsprechend die folgende Gleichung:
(Timer Geschwindigkeit (Hz)) = (Arduino-Taktfrequenz (16MHz)) / prescaler
Also eine 1 Vorteiler den Zähler bei 16 MHz erhöht wird, eine 8 Vorteiler erhöhe ihn bei 2MHz, 64 Vorteiler = 250kHz, und so weiter. Wie in den obigen Tabellen angegeben, kann der Vorteiler 1, 8, 64, 256 und 1024 gleich. (Ich erkläre die Bedeutung von CS12 CS11 und CS10 im nächsten Schritt.)
Jetzt können Sie die Interrupt-Frequenz mit der folgenden Gleichung berechnen:
Frequenz (Hz) zu unterbrechen (Arduino Taktfrequenz 16.000, 000Hz) = / (Vorteiler * (Compare match Register + 1))
weil die Compare match Register gibt es Null indiziert ist + 1
Neuanordnen der obigen Gleichung, lösen Sie für Compare Match Registerwert, die Ihre gewünschten Interrupt-Frequenz geben wird:
Vergleichen Sie Match Register = [16.000, 000Hz / (Vorteiler * gewünscht Interrupt-Frequenz)] - 1
Denken Sie daran, dass bei Verwendung von Timer 0 und 2 diese Zahl kleiner als 256 und weniger als 65536 für timer1 sein muss
Also, wenn Sie einen Interrupt pro Sekunde (Frequenz von 1 Hz wollte):
Vergleichen Sie Match Register = [16.000.000 / (Vorteiler * 1)]-1
mit einem Vorteiler von 1024 erhalten Sie:
Vergleichen Sie Match Register = [16.000.000 / (1024 * 1)]-1
= 15.624
Seit 256 15.624 < < 65.536, Sie müssen timer1 für dieses Interrupt verwenden.