ABOUT ME

-

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


    용어 정의

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


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


    TOP 

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

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



    Fast PWM 모드

    fast Pulse Width Modulation(fast PWM) 모드는 TCCR0 레지스터의 WGM01과 WGM00비트가 1로 설정된 경우이다.



    카운터값(TCNT0)는 BOTTOM으로부터 MAX까지 값이 증가하고 MAX에 도달하면 다시 BOTTOM부터 증가를 시작한다.


    non-inverting Compare Output 모드에서는 TCNT0와 OCR0가 일치하는 경우 output compare (OC0)가 0으로 클리어되고 TCNT0가 BOTTOM인 경우 1로 설정된다.


    inverting Compare Output 모드에서는 TCNT0와 OCR0가 일치하는 경우 output compare (OC0)가 1로 설정되고 TCNT0가 BOTTOM인 경우 0으로 클리어 된다. 

    fast PWM 모드에서 카운터값(TCNT0)가 MAX값과 일치할 때까지 카운터는 증가한다. MAX값에 도달하면 TCNT0는 0으로 클리어된다.



    TCNT0 대각선상의 작은 수평선은 OCR0와 TCNT0가 일치하는 경우를 의미한다.

    카운터가 MAX에 도달할때마다 타이머/카운터 오버플로우 플래그(TOV0)는 1로 설정된다. 인터럽트가 활성화 되어있다면 오버플로우 인터럽트 핸들러 루틴을 OCR0값을 업데이트하는 용도로 사용할 수 있다. 


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


    포트 핀의 데이터 방향이 출력일 경우에만 OC0의 값이 실제로 출력된다.


    inverting mode에서는 OCR0와 TCNT0 사이의 값이 일치하는 경우 OC0 레지스터는 1로 설정됨으로써 PWM 파형이 출력되고 TCNT값이 MAX에서 BOTTOM으로 변하는 경우에 OC0 레지스터는 0으로 클리어되어 파형 출력이 중단된다.



    아래 처럼 회로를 구성하고 



    아래 코드를 동작시키면.. 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
    56
    57
    58
    59
    60
    61
    /*
     * 8bit_timer_example3.c
     *
     * Created: 2016-06-18 
     * 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);
     
        //FAST PWM 모드
        TCCR0 |= (1<<WGM01);
        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



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

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

    유튜브 구독하기


    댓글 5

    • 구힝 2018.08.02 14:14


      안녕하세요 글 잘 보고있습니다.

      위에서 while 문 안에 PORTB 에 대한 설정이 없는데 LED 가 어떻게 켜질지 궁금합니다~

    • 구힝 2018.08.02 14:20


      아~ 제가 잘 못 이해 했군요 OC0 핀에 LED 가 연결되있네요 ㅎㅎ.

    • 2019.05.16 18:58












      C:\Users\msi\Desktop\새 폴더\line22\line22.ino:8:0: warning: "F_CPU" redefined

      <command-line>:0:0: note: this is the location of the previous definition

      In file included from C:\Users\msi\Desktop\새 폴더\line22\line22.ino:12:0:

      C:\Users\msi\Desktop\�а�\arduino-1.8.9-windows\arduino-1.8.9\libraries\AVR/delay.h:36:2: warning: #warning "This file has been moved to <util/delay.h>." [-Wcpp]

      #warning "This file has been moved to <util/delay.h>."

      ^

      C:\Users\msi\Desktop\새 폴더\line22\line22.ino: In function 'int main()':

      line22:21:5: error: 'TCCR0' was not declared in this scope

      line22:28:18: error: 'COM01' was not declared in this scope

      line22:41:13: error: 'OCR0' was not declared in this scope

      line22:47:13: error: 'OCR0' was not declared in this scope

      exit status 1
      'TCCR0' was not declared in this scope

      이런 문제가뜹니다;

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.16 19:18 신고


        본 포스트에 있는 코드는 아두이노 IDE에서는 컴파일이 안됩니다.

        Atmel Studio를 사용해야 합니다.

        AVRISP mkii를 Avr Studio 7.0에서 사용하기 및 AVR studio 7.0 사용법
        https://webnautes.tistory.com/851

Designed by Tistory.