ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Atmega128 기초 - 8비트 타이머/카운터 Phase Correct PWM 모드
    Avr/Atmega128 강좌 2016. 6. 21. 17:14

    용어 정의

    BOTTOM - 카운터가 0이 되었을 때를 의미.


    MAX – 카운터가 0xFF(=255)에 도달했을 때를 의미


    TOP 

    TOP값은 0xFF(MAX) 또는 OCR0 레지스터에 저장된 값으로 지정할 수 있다.

    카운터가 TOP값과 똑같거나 더 커진 경우를 의미한다.



    Phase Correct PWM 모드

    Phase Correct Pulse Width Modulation(Phase Correct PWM) 모드는 TCCR0 레지스터의 WGM01비트는 0으로, WGM00비트는 1로 설정된 경우이다.



    카운터값(TCNT0)는 BOTTOM에서 MAX로 증가하다가 다시 MAX에서 BOTTOM으로 감소하는 것을 반복한다.  PWM 해상도는 8비트로 고정된다.


    noninverting Compare Output 모드에서는 TCNT0가 증가하다가 OCR0가 일치하면 output compare(OC0)는 0으로 클리어된다. 그리고 감소하다가 일치하면 1로 설정된다.


    inverting Output Compare 모드는 반대로 동작한다.




    Phase Correct PWM 모드는 dual-slope operation이라서 single slope operation인 Fast PWM보다 최대 Operation 주파수가 작다. 하지만 대칭적인 특징이 있어서 모터 제어 응용에서 많이 사용된다.



    카운터(TCNT0)가 BOTOOM에 도달할때마다 Timer/Counter Overflow Flag (TOV0)는 1로 설정된다. 인터럽트를 활성화시켜 놓으면 이 시점마다 인터럽트를 발생시킬 수 있다.


    TCCR0 레지스터의 COM01과 COM00을 설정하여 Invert mode인지 non-invert mode인지  결정한다.


    포트핀의 데이터 방향을 출력으로 설정해 놓았을 때에만 OC0에서 실제 파형이 출력된다.


    non-inverted 모드에서는 카운터가 증가할 때 OCR0와 TCNT0가 일치하면 OC0레지스터가 0으로 클리어 되어 파형이 출력되며, 카운터가 감소할 때 OCR0와 TCNT0가 일치하면 OC0 레지스터가 1로 설정되면서 파형이 출력된다. inverted 모드에서는 반대로 동작한다.


    아래처럼 회로를 구성하고 


    아래 코드를 업로드하면 LED가 천천히 켜졌다가 천천히 꺼지는 걸 볼 수 있다. 

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    /*
     * 8bit_timer_example4.c
     *
     * Created: 2016-06-21
     * Author : webnautes
     */ 
     
    #include <avr/io.h>
     
     
    #define F_CPU 16000000UL
     
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
     
     
     
    int main(void)
    {
        DDRB |= (1<<DDB4); //LED용
     
        //프리스케일러로 64를 선택
        TCCR0 |= (1<<CS02);
     
        // Phase Correct PWM 모드
        TCCR0 |= (1<<WGM00);
     
        //non-inverted mode
        TCCR0 |= (1<<COM01);
     
        //카운터 초기화
        TCNT0 = 0;
     
     
        /* Replace with your application code */
        while (1)
        {
            int i;
     
            for( i=0; i<255; i++)
            {
                OCR0 = i;
                _delay_ms(10);
            }
     
            for( i=255; i>=0; i--)
            {
                OCR0 = i;
                _delay_ms(10);
            }
     
        }
    }
     
    cs


    포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
    댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

    여러분의 응원으로 좋은 컨텐츠가 만들어집니다. 지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

    유튜브 구독하기


    댓글 0

Designed by Tistory.