안된는 영어 실력이지만 번역해 보았습니다. 아두이노 타이머 인터럽트 이해에 도움이 될듯합니다.
문제가 된다면 삭제하도록하겠습니다.
원문 : http://www.instructables.com/id/Arduino-Timer-Interrupts/step1/Prescalers-and-the-Compare-Match-Register/
영어 실력이 좋지 못한 관계로 의역 및 오역이 있을수 있습니다.
The Uno has three timers called timer0, timer1, and timer2. Each of the timers has a counter that is incremented on each tick of the timer's clock. CTC timer interrupts are triggered when the counter reaches a specified value, stored in the compare match register. Once a timer counter reaches this value it will clear (reset to zero) on the next tick of the timer's clock, then it will continue to count up to the compare match value again. By choosing the compare match value and setting the speed at which the timer increments the counter, you can control the frequency of timer interrupts.
우노는 timer0, timer1, timer2라 불려지는 3개의 타이머를 가지고 있다. 각각의 타이머는 타이머 클럭틱마다 증가하는 카운터를 가지고 있다. CTC타이머 인터럽트는 카운터가 비교 매치 레지스터에 저장된 값에 도달할때 트리거된다. 일단 타이머 카운터가 이값에 도달하면, 타이머의 다음 클럭틱 때에 클리어(0으로 초기화)되고 , 카운트 매치값 비교가 다시 진행될 것이다.
비교매치값과 각 타이머가 카운터를 증가 시키는 속도를 선택하는 것으로, 당신은 타이머 인터럽트의 빈도를 제어할 수 있다.
The first parameter I'll discuss is the speed at which the timer increments the counter. The Arduino clock runs at 16MHz, this is the fastest speed that the timers can increment their counters. At 16MHz each tick of the counter represents 1/16,000,000 of a second (~63ns), so a counter will take 10/16,000,000 seconds to reach a value of 9 (counters are 0 indexed), and 100/16,000,000 seconds to reach a value of 99.
첫번째로 논의될 파라메터는 타이머가 카운터를 증가시키는 속도이다. 아두이노는 16Mhz 클럭으로 실행되고, 이것은 타이머가 그것의 카운터를 증가 시킬 수 있는 가장 빠른속도이다. 16MHz에서 카운터의 각 틱은 1/16,000,000초(약 63나노초)로 표현된다, 그러므로 카운터는 10/16,000,000초에 9의 값에 도달(카운터는 0에서 시작함)하고, 100/16,000,000초에는 99에 도달할 것이다.
In many situations, you will find that setting the counter speed to 16MHz is too fast. Timer0 and timer2 are 8 bit timers, meaning they can store a maximum counter value of 255. Timer1 is a 16 bit timer, meaning it can store a maximum counter value of 65535. Once a counter reaches its maximum, it will tick back to zero (this is called overflow). This means at 16MHz, even if we set the compare match register to the max counter value, interrupts will occur every 256/16,000,000 seconds (~16us) for the 8 bit counters, and every 65,536/16,000,000 (~4 ms) seconds for the 16 bit counter. Clearly, this is not very useful if you only want to interrupt once a second.
많은 부분에서, 당신은 카운터를 16MHz 속도로 설정하는것은 너무 빠르다는것을 알 수있을 것이다. Timer0와 Timer2는 8비트 타이머이다, 이것은 카운터들이 최대 255의 값을 저장할 수 있다는것을 의미한다. Timer1은 16비트 타이머이다. 이것은 카운터가 최대 65535의 값을 저장할 수 있다는 의미다. 일단 카운터가 최대값에 도달하면, 다시 0으로 돌아갈 것이다(오버플로우라 불린다). 이것은 16MHz에서, 우리가 비교매치 레지스터에 최대 카운터 값을 기록할경우, 인터럽트는 8비트 타이머에서는 매 256/16,000,000 초(약 16마이크로초) 마다 발생하고 16비트 타이머에서는 매 65,536/16,000,000(약 4밀리초)초마다 발생한다는 의미다. 확실히, 이부분은 당신이 매초마다 한번 인터럽트를 원하는 경우에 전혀 유용하지 않다.
Instead you can control the speed of the timer counter incrementation by using something called a prescaler. A prescaler dictates the speed of your timer according the the following equation:
대신에 프리스케일러(prescaler)라 불려지는 어떠한 것을 통해서 타이머 카운터의 증가 속도를 제어할 수 있다.프리스케일러는 다음의 방정식에 따라서 타이머의 속도를 지정한다.
(timer speed (Hz)) = (Arduino clock speed (16MHz)) / prescaler
(타이머속도(헤르츠)) = (아두이노 클럭속도(16메가헤르츠)) / 프리스케일러
So a 1 prescaler will increment the counter at 16MHz, an 8 prescaler will increment it at 2MHz, a 64 prescaler = 250kHz, and so on. As indicated in the tables above, the prescaler can equal 1, 8, 64, 256, and 1024. (I'll explain the meaning of CS12, CS11, and CS10 in the next step.)
그러므로 1프리스케일러에서 카운터는 16MHz씩 증가하고, 8프리스케일러에서 2MHz, 64프리스케일러에서 = 250KHz, 와 같은 식으로 증가할 것이다. 위의 테이블에서 나타낸것처럼, 프리스케일러는 1, 8, 64, 256, 1024의 값이 될 수 있다.(다음스텝에서 CS12, CS11, CS10에 대해서 설명할 것이다)
Now you can calculate the interrupt frequency with the following equation:
다음의 방정식으로 당신은 인터럽트의 주기를 계산할 수있다.
interrupt frequency (Hz) = (Arduino clock speed 16,000,000Hz) / (prescaler * (compare match register + 1))
인터럽트주기(Hz) = (아두이노클럭(16MHz) / (프리스케일러 * (compare match 레지스터 값 + 1))
the +1 is in there because the compare match register is zero indexed
+1을 하는 이유는 비교 매치 레지스터가 0부터 시작하기 때문이다.
rearranging the equation above, you can solve for the compare match register value that will give your desired interrupt frequency:
위의 방정식을 다시 정리하면, 당신이 요구하는 인터럽트의 주기를 결정하는 비교 매치 레지스터의 값을 알 수있다.
compare match register = [ 16,000,000Hz/ (prescaler * desired interrupt frequency) ] - 1
비교 매치레지스터 값 = [16Mhz / (프리스케일러 * 요구하는 주파수)] - 1
remember that when you use timers 0 and 2 this number must be less than 256, and less than 65536 for timer1
타이머0과 타이머2에서 이값은(비교매치값) 256보다 작아야하며, 타이머1에서는 65536보다 작아야한다는것을 기억하라.
so if you wanted an interrupt every second (frequency of 1Hz):
compare match register = [16,000,000 / (prescaler * 1) ] -1
with a prescaler of 1024 you get:
compare match register = [16,000,000 / (1024 * 1) ] -1
= 15,624
since 256 < 15,624 < 65,536, you must use timer1 for this interrupt.
그렇기 때문에 매초마다 인터럽트를 원한다면(1Hz주파수) :
비교매치값 = (16MHz / (프리스케일러 * 1)) - 1 에서 프리스케일러가 1024라면
비교매치값 = (16MHz / (1024 * 1)) - 1 = 15,624
256 < 15,624 < 65,536 이므로, 당신은 반드시 타이머1의 인터럽트를 사용해야한다.