Arduino Timer avbryter (1 / 6 steg)
Steg 1: Prescalers och jämför Match registret
Den första parametern ska jag diskutera är den hastighet som timern Justerar räknaren. Arduino klockan körs på 16MHz, detta är den snabbaste hastigheten att timers kan öka deras räknare. På 16MHz varje tickande av disken representerar 1/16,000,000 av en sekund (~ 63ns), så en räknare tar 10/16,000,000 sekunder att nå ett värde av 9 (räknare är 0 indexeras), och 100/16,000,000 sekunder att nå värdet 99.
I många situationer hittar du att ändra counter läshastighet till 16MHz är för snabb. Timer0 och timer2 är 8-bitars timers, vilket innebär att de kan lagra maximalt counter värdet 255. Timer1 är en 16-bitars timer, vilket innebär att det kan lagra ett högsta värde av 65535. När en räknare når sitt maximum, kommer att det kryssa till noll (detta kallas overflow). Detta innebär på 16MHz, även om vi jämför match registret max räknarvärdet, avbrott inträffar var 256/16,000,000 sekund (~ 16us) för 8-bitars räknare och varje 65.536/16,000,000 (~ 4 ms) sekunder för en 16-bitars räknare. Detta är naturligtvis inte mycket användbart om du bara vill avbryta en gång per sekund.
Istället kan du kontrollera hastigheten på timer counter incrementation med hjälp av något som kallas en prescaler. En prescaler dikterar hastigheten på din timer enligt den följande ekvation:
(timer hastighet (Hz)) = (Arduino klockfrekvens (16MHz)) / prescaler
Så en 1 prescaler ökar värdet för räknaren på 16MHz, en 8 prescaler ökar värdet för det på 2MHz, en 64 prescaler = 250kHz, och så vidare. Som framgår av tabellerna ovan, kan prescaler lika 1, 8, 64, 256 och 1024. (Jag ska förklara menande av CS12, CS11 och CS10 i nästa steg.)
Nu kan du beräkna avbrott frekvensen med följande ekvation:
avbryta frekvens (Hz) = (Arduino klockfrekvens 16.000, 000Hz) / (prescaler * (jämför match register + 1))
den + 1 är i det eftersom jämför matchar register är noll indexeras
ordna om ekvationen ovan, kan du lösa för värdet jämför match register som ger din önskat avbrott frekvens:
Jämför match register = [16.000, 000Hz / (prescaler * önskat avbrott frekvens)] - 1
kom ihåg att när du använder timers 0 och 2 detta nummer måste vara mindre än 256 och mindre än 65536 för timer1
så om du ville ha ett avbrott per sekund (1Hz frekvens):
Jämför match register = [16,000,000 / (prescaler * 1)] -1
med en prescaler 1024 får du:
Jämför match register = [16,000,000 / (1024 * 1)] -1
= 15,624
sedan 256 15,624 < < 65.536, måste du använda timer1 för detta avbrott.