2014년 5월 30일 금요일

9. AVR(atmega)와 Preteus VSM의 만남 - 숨쉬는 LED를 위한 PWM 제어 (3부)

자... 그럼 이번에는 숨쉬는 LED의 소스 코드를 좀 분석해 봅시다.

지난번 소스코드 한번 들여다 보셨나요? 이미 좀 알고 계신 분이라면 금방 이해하셨을테지만, 모르는 분들을 위해 설명한다 생각하고 글을 써 보겠습니다.

우선, Atmega MCU에서 PWM발생을 위해 이해해야 할 그림이 있어요.
아래 그림 한번 보세요. 이 그림을 보고 지지난 글에서 얘기한 Compare Match Interrupt 이해 가시나요?

[Timer2 Compare Match Output Interrupt]

위 그림은, Timer2로 표현한 그림이지만, Timer0도 마찬가지 입니다.(물론, 콘트롤 레지스터는 조금 다릅니다.)

TCNT2(Timer Counter Register)의 값이 하나씩 증가하죠. 쭉 증가해서 255까지 도달하면 다시 0부터 시작하죠. 이렇게 무한히 반복하는 겁니다. 증가한다는 의미로 0부터 255까지를 우상향 화살표로 표시했어요.(물론, 아날로그 회로에서는 실제 전압이 증가할 수도 있지만..마이크로 프로세서에서는 디지털 시스템이므로 레지스터의 값이 증가합니다.) 
근데, 주목해야 할 것이 중간에 OCR2(Output Compare Register)가 있고 수평으로 조그만 막대가 있죠. 이것은 OCR2에 들어 있는 값을 의미하는 것입니다.(여기서는 OCR2=100으로 가정)

 그럼, 인간의 시간 개념으로 타이머를 돌려 봅시다.

1. TCNT2 증가 시작: 0, 1, 2, 3, ......
2. 비교일치 조건 도달 ( 즉, TCNT2 == 100일때 OCR2의 설정값과 일치)
3. 비교일치 인터럽트 발생 --> ISR(TIMER2_Comp_vect) 실행됨.
4. TCNT2 계속 증가: 101, 102, ..... 254, 255
5. TCNT2가 255 --> 0으로 바뀌는 순간
  • 오버플로우 인터럽트 발생 : ISR(TIMER2_OVF_vect) 실행됨
6. 다시 1번부터 시작됨. 무한반복

그리고, OC2 Pin 출력을 보면 이것이 바로 PWM 출력입니다. 지난번 글에서 아래 내용 기억나시나요? Non-inverting mode!!
위의 OC2 Pin 출력을 보면 BOTTOM(= 0)에서 High(5V)출력이고, 비교일치(Compare Match)되는 순간(TCNT2 == OCR2 )일때 Clear(Low = 0V)로 내려갑니다. 그리고, 다시 TCNT2가 BOTTOM(=0)으로 가면 다시 High(5V). 그리고 비교일치되면 Low(0V). 이런식으로 무한히 반복되죠. 그럼, 아래 내용이 뭔 의미인지 이해됩니다!!

(원문)
"Clear OC0A on compare match, set OC0A at BOTTOM, (non-inverting mode)"

(해석)
"OC0A 핀(12번 핀: PD6 )을 클리어(논리적으로는 0, 전압으로는 0V)하고, TCNT0 = BOTTOM(0 즉 zero)일 때, 셋(set)한다.(논리적으로 1, 전압으로는 5V)"

그렇다면, Duty Rate를 바꾸려면 어찌해야 할까요?
쉽습니다. 위 그림에서 직관적으로 알 수 있다시피 OCR2의 값을 내부적으로 적당한 때에 바꿔주면 됩니다. 만약, OCR2 == 50이면 위 그림보다 Duty Rate가 절반으로 줄어들 것이며, OCR2 == 200이면 Duty Rate가 위 그림의 두 배가 될 것입니다. 이런 식으로 Duty Rate를 조절하면 LED밝기를 변화시킬 수 있으며, OCR2의 값을 0부터 하나 씩 증가시켜 255까지 가면 자연스럽게 밝아지는 LED가 되죠. 즉, 숨쉬는 LED가 된 것입니다.

잠시 바쁜 관계로,, 오늘은 여기까지.

이만, 총총.

댓글 없음:

댓글 쓰기