일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Recursion
- vivado
- DHT11
- LED
- Pspice
- test bench
- ATMEGA128A
- stop watch
- KEYPAD
- soc 설계
- java
- pwm
- uart 통신
- hc-sr04
- Linked List
- BASYS3
- half adder
- FND
- verilog
- Edge Detector
- ring counter
- structural modeling
- Algorithm
- gpio
- i2c 통신
- behavioral modeling
- prescaling
- atmega 128a
- dataflow modeling
- D Flip Flop
- Today
- Total
거북이처럼 천천히
다양한 파형 생성 실험 (8bit Timer/Counter) 본문
다양한 파형 생성 실험 (8bit Timer/Counter)
유로 청년 2024. 6. 9. 16:21서론
해당 게시물은 CTC Mode와 Normal Mode, Fast PWM Mode를 공부하면 궁금해 했던 점에 대해서 실험(?)하는 게시물이다. 따라서 CTC Mode와 Normal Mode, Fast PWM Mode에 대해서 궁금하다면 각 게시글을 참고하기 바란다.
본론 (CTC Mode)
1. 8bit Timer/Counter 2, 256분주, OCRn (=Output Compare Register n) = 224 → OC2 = 138.8888889Hz
1) Output Compare Match Interrupt가 발생하면 OC2 signal을 Toggle 한다.
2) 초기 전압은 0V이지만, Output Compare Match Interrupt가 발생하면 5V로 Set된다.
3) 초기 전압은 5V이지만, Output Compare Match Interrupt가 발생하면 0V로 Clear된다
본론 (Normal Mode)
1. 8bit Timer/Counter 2, 64분주, TCNT2 = 256-50 = 206 → OC2 = 2500Hz
1) Output Compare Match Interrupt가 발생하면 OC2 signal을 Toggle 한다.
2) 초기 전압은 0V이지만, Output Compare Match Interrupt가 발생하면 5V로 Set된다.
3) 초기 전압은 5V이지만, Output Compare Match Interrupt가 발생하면 0V로 Clear된다.
본론 (Fast PWM Mode)
1. 8bit Timer/Counter 2, 256분주, Duty ration = 25% → OC2 = 244.140625Hz
2. Inverting Mode, TCNT Register값이 OCR2 값과 match하면 Output Compare Match Interrupt가 발생하며, 이때 OC2 Signal이 0V에서 5V로 변하며, TCNT Register값이 Max 값과 match하면 Overflow Interrupt가 발생하며, 이때는 반대로 OC2 Signal이 5V에서 0V로 변한다.
주의) Inverting Mode에서는 Output compare match interrupt가 발생하면 set되기 때문에 duty ratio를 25% 맞추기 위해서는 OCR2 = 256 - (256/4) 으로 설정해야 한다.
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#define SIGNAL_DDR DDRB
#define SIGNAL_PORT PORTB
int main(void)
{
// PB7을 출력으로 설정.
SIGNAL_DDR |= (1<<DDB7);
// PB7의 출력 값을 0V으로 초기설정
SIGNAL_PORT &= ~(1<<PORTB7);
// TCCR2 (=Timer/Counter Control Register 2)
TCCR2 |= (1<<WGM21 | 1<<WGM20 | 1<<COM21 | 1<<COM20 | 1<<CS22);
// OCR2 값 초기 설정.
OCR2 = 256 - 64;
while (1)
{
}
}
3. Non-inverting Mode, TCNT Register 값이 OCR2 값과 만나면 Output compare match interrupt가 발생하며, 이때 OC2 Signal이 5V에서 0V로 변하며, TCNT Register 값이 Max 값과 만나 Overflow interrupt가 발생하면 이때는 반대로 OC2 Signal이 0V에서 5V로 변한다.
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#define SIGNAL_DDR DDRB
#define SIGNAL_PORT PORTB
int main(void)
{
// PB7을 출력으로 설정.
SIGNAL_DDR |= (1<<DDB7);
// PB7의 출력 값을 0V으로 초기설정
SIGNAL_PORT &= ~(1<<PORTB7);
// TCCR2 (=Timer/Counter Control Register 2)
TCCR2 |= (1<<WGM21 | 1<<WGM20 | 1<<COM21 | 1<<CS22);
// OCR2 값 초기 설정.
OCR2 = 64;
while (1)
{
}
}
결론
이번 실험을 통해 CTC, Normal, Fast PWM Mode에 대해서 재확인하였고, 이론을 통해 배운 다양한 TCCR(Timer/Counter Control Register) 을 통한 출력 신호 제어 및 8bit Timer/Counter 2에 대해서 실험을 통해 직접 확인할 수 있었다.
'Embedded Programming (AVR) > Atmega 128A (실습)' 카테고리의 다른 글
8bit Timer / counter - Phase Correct Fast PWM Mode (0) | 2024.06.19 |
---|---|
Structure (1) | 2024.06.11 |
8bit Timer / counter - Fast PWM Mode (1) | 2024.06.04 |
8bit Timer / counter - Normal Mode (1) | 2024.06.03 |
8bit Timer / counter - CTC Mode (1) | 2024.06.02 |