본문 바로가기
대한상공회의소 스마트팩토리 교육/IoT 디바이스 개발

[IoT 디바이스 개발] AVR(ATmega128A)«수업-15» : PWM(펄스폭 변조, Pulse Width Modulation)

by 나는영하 2022. 2. 18.

※ 주의사항 

본 블로그는 수업 내용을 바탕으로 제가 이해한 부분을 정리한 블로그입니다.
본 내용을 참고로만 보시고, 틀린 부분이 있다면 지적 부탁드립니다!

감사합니다😁

 

안녕하세요!!

오늘은 아래와 같은 내용을 확인해보겠습니다.

 

PWM

고속 PWM 모드

위상 PWM 모드


 

1. PWM(Pulese Width Modulation)

1-1. PWM이란?

일반 구형파와 PWM 신호 파형의 차이

- 구형파에서 HIGH인 부분과 LOW인 부분의 비율을 조절하여 아날로그 신호와 유사한 효과를 얻을 수 있는 디지털 신호이다.

- ATmega128A의 타이머/카운터를 통해 하드웨어적으로 생성한다.

- 위의 사진처럼 PWM 신호의 1개 Pulse에서 HIGH값이 가지는 비율을 듀티 사이클(Duty Cycle)이라 한다.

- PWM신호의 듀티사이클은 LED의 밝기를 조절하거나 MOTOR를 동작할때 세기를 조절한다.

- 즉, 듀티사이클이 100%라면 LED는 최대의 밝기를 보여주며 PWM신호의 한주기동안 HIGH와 LOW의 비율이 반반이라면 LED의 밝기는 50%가 될 것이다.

 

1-2. ATmega128A에서 PWM 신호를 만드는 과정

PWM 신호를 만드는 과정

- PWM 신호는 ATmega128A의 내부 클록을 256개를 받아서 PWM 신호의 1PULSE를 만들어낸다.

- 비교 일치 인터럽트에서 배운 목표값을 저장하는 레지스터(OCRn)의 값에 따라 PWM 신호 1PULSE의 HIGH와 LOW의 비율이 정해진다(Duty Ratio)

- 즉, OCRn의 값이 100이라면 내부 클록신호의 256개의 PULSE중에 100번째 PULSE에서 비교 일치가 발생하고 해당 PWM 출력핀의 신호가 바뀐다 (※ 고속PWM 비반전 모드일경우 LOW로 신호가 바뀌게 된다.)

- DUTY RATIO = (OCRn 값 / 256) * 100 [%] (※ 고속 PWM 비반전 모드일 경우)

 

1-3. PWM 모드 종류(16비트 파형 생성 모드 종류)

1) 16비트 파형 생성 모드 종류 (PWM 모드 종류)

- 지난 시간에 16비트 타이머/카운트를 배울때 TCCR1A, TCCR1B 레지스터의 WGM1n 비트 값에 따라 파형생성모드를 변경할수 있음을 배웠다.

- 파형생성모드의 16가지 중에 12가지는 PWM과 관련된 모드에 해당된다.

 

(1) 노말 모드

- 일반적인 비교일치 인터럽트 모드 (TCNT0 값을 초기화 해주어야 한다.) 

(2) CTC 모드

- 비교일치 인터럽트 모드 (TCNT0값이 자동으로 초기화 된다)

(3) 고속 PWM 모드 : 

- 상승 카운터에서만 적용이 된다.

- OCRn 값이 크면 Duty Cycle도 커진다.

- TCTN1 레지스터의 값이 0x0000에서 0x00FF까지(8비트 고속PWM 기준) 올랐다가 다시 0x0000으로 초기화 된다. (즉 , 다운 카운터는 안된다.)

- PWM의 HIGH 구간의 길이 = 16[Mhz] / ((OCRn까지의 펄스 개수 / 256) * 분주율)

(4) 위상 PWM 모드 : 

- 반전모드와 비반전 모드에 따라 DutyCycle이 달라진다.

- 업카운터와 다운카운터가 반복된다

- 비반전 모드의 경우 업카운터에서는 비교 일치가 됐을때 LOW가 되었다가 다운카운터에서 비교일치가 되면 HIGH로 바뀐다.

- OCRn이 업데이트 되는 시점이 TOP에서 반영 된다.

(5) 위상 및 주파수 PWM 모드 :

- OCRn이 업데이트 되는 시점이 BOTTOM에서 반영 된다.

 

2) 관련 용어 정리

(1) BOTTOM : 카운터 값(TCNTn)이 최저(0x00, 0x0000)일때

(2) MAX : 카운터 값이 최대(0xFF, 0xFFFF)일떄

(3) TOP :  카운터 값이 가질 수 있는 최댓값

- 오버클록일땐 0xFF, 0xFFFF

- 비교 일치 인터럽트일때는 사용자가 설정한 값(OCRn)이 TOP에 해당된다.

 


 

2. 고속 PWM 모드

(※ 고속PWM모드는 8비트 타이머인 0번을 사용해서 실습을 하였습니다. 16비트 고속 PWM모드도 레지스터와 비트의 이름만 바뀔뿐 대동소이하니 참고하셔서 보시면 될 것 같습니다!!)

 

2-1. 고속 PWM 모드 설정(8비트)

1) TCCR0 레지스터

TCCR0 레지스터 구조

1) WGM00, WGM01비트 (3번, 6번 비트)

- 파형 생성 모드를 결정하는 비트

WGM00, WGM01 비트값에 따른 파형 생성 모드

- 01 : 위상 PWM 모드

- 11 : 고속 PWM 모드

 

2) COM00, COM01비트 (4번, 5번 비트)

- 파형 출력 모드를 결정하는 비트

고속PWM에서 COM00, COM01 비트값에 따른 파형 출력 모드

- 10 : 비교 일치 발생시 OCn 핀의 출력은 LOW 값으로 바뀌고 BOTTOM에서 HIGH값으로 바뀐다(비반전)

- 11 : 비교 일치 발생시 OCn 핀의 출력은 HIGH 값으로 바뀌고 BOTTOM에서 LOW값으로 바뀐다(반전)

 

2-2. 고속 PWM 모드 관련 예제

1) 동작 설명 

위의 코드에 대한 대략적인 PWM 펄스 파형

 

- B포트 4번핀(OC0)으로 PWM파형이 출력 된다.

- 0번 8비트 타이머/카운터를 사용하고, 고속 PWM모드로 설정한다.

- 비반전 모드로 설정하여서 비교 일치 발생시 OC0핀에 LOW를 출력한다.

- 분주비는 1024로 설정한다. 

- while문 : PWM 신호의 듀티 사이클을 변화시키는 간격을 20ms로 설정한다.

(즉, 20ms 마다 LED의 밝기가 점차 밝아지고 어두워진다)

 

2) 특이 사항 

- B포트의 4번 핀에서 하드웨어적으로 주기적으로 PWM파형을 출력하기 때문에 별도로 PORTB 레지스터 명령어를 사용해서 LED에 출력명령어를 주지 않아도 된다.

- PWM 신호의 주파수는??

PWM주파수 = 타이머에 공급되는 주파수 / (N[분주] * (TOP + 1)) = 16,000,000 / (1,024 * 256) = 약 61Hz

- _delay_ms(10)을 주는 의미는??

해당 딜레이 기간동안 OCRn = dim 값을 가지는 duty cycle을 내보낸다. 10ms 이후에는 dim 값이 바뀌고 duty Cycle이 변화된다. 즉, 10ms 동안은 일정한 duty ratio를 가지는 펄스가 출력된다. (일정한 밝기를 10ms간 유지한다)

 


 

3. 위상 PWM 모드

※ 위상 PWM모드와 관련된 레지스터의 설명은 지난 수업내용인 8비트 타이머/카운터 혹은 16비트 타이머/카운터의 레지스터 관련 설명을 참고하면 됩니다. 아래의 예제는 1번 16비트 타이머/카운터를 가지고 프로그래밍을 하였으니 참고하시길 바랍니다.😁

 

3-1. 위상 PWM 모드 관련 예제

1) 실습 사진 및 오실로스코프 파형 측정

- 2개의 LED가 2개의 비교 일치 출력핀을 통해 발생하는 PWM의 신호를 받아서 각각 발광한다.

- 오실로스코프를 통해 OC1A, OC1B의 핀을 파형을 측정하였다.

(한쪽이 LOW가 되면 한쪽이 HIGH가 되는 것을 확인할 수 있다.)

 

 

2) 코드

- 8비트 위상 PWM 모드로 설정하였으며, 2개의 출력핀(OC1A, OC1B)를 통해 PWM신호를 받기 때문에 2개의 해당되는 핀을 출력으로 설정하였다.

- A핀은 비반전, B핀은 반전으로하여서 2개의 신호가 각각 반전되는 출력을 내보낸다.

- Duty Cycle이 변화하는 간격은 10ms로 시간지연 함수를 사용하여 적용하였다.

(while문에 있는 delay는 PWM 신호의 생성에는 전혀 영향을 미치지 않는다.) 

댓글