PWM (Pulse Width Modulation)은 주파수를 일정하게 유지하여 펄스의 폭을 변경하는 강력한 기술입니다. 이 기술은 오늘날 많은 제어 시스템에서 사용됩니다. PWM의 적용은 제한이 없으며 모터 속도 제어, 측정, 전력 제어, 통신 등 광범위한 응용 분야에서 사용됩니다. PWM 기법에서는 디지털 신호를 이용하여 아날로그 출력 신호를 쉽게 생성 할 수 있습니다. 이 튜토리얼은 PWM, 용어 및 마이크로 컨트롤러를 사용하여 구현하는 방법을 이해하는 데 도움이됩니다. 이 튜토리얼에서는 LED의 강도를 변경하여 AVR Atmega16 마이크로 컨트롤러 로 PWM을 시연 합니다.
PWM의 기본 사항을 자세히 이해하려면 다양한 마이크로 컨트롤러를 사용하는 PWM에 대한 이전 자습서로 이동하십시오.
- ARM7-LPC2148 PWM 튜토리얼: LED 밝기 제어
- MSP430G2를 사용한 펄스 폭 변조 (PWM): LED 밝기 제어
- MPLAB 및 XC8과 함께 PIC 마이크로 컨트롤러를 사용하여 PWM 생성
- STM32F103C8의 펄스 폭 변조 (PWM): DC 팬 속도 제어
- PIC 마이크로 컨트롤러의 GPIO 핀에서 PWM 신호 생성
- Raspberry Pi PWM 튜토리얼
AVR 마이크로 컨트롤러 Atmega16의 PWM 핀
Atmega16에는 4 개의 전용 PWM 핀이 있습니다. 이 핀은 PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2)입니다.
또한 Atmega16에는 2 개의 8 비트 타이머와 1 개의 16 비트 타이머가 있습니다. Timer0 및 Timer2는 8 비트 타이머이고 Timer1은 16 비트 타이머 입니다. PWM을 생성하려면 타이머가 PWM을 생성하는 데 사용되므로 타이머에 대한 개요가 있어야합니다. 주파수는 타이머가 실행되는 초당 사이클 수라는 것을 알고 있습니다. 따라서 주파수가 높을수록 타이머가 더 빨라집니다. PWM을 생성 할 때 더 빠른 PWM 주파수는 새로운 PWM 듀티 사이클에 더 빨리 응답 할 수 있기 때문에 출력을 더 세밀하게 제어 할 수 있습니다.
이 Atmega16 PWM 자습서 에서는 Timer2를 사용합니다. 듀티 사이클을 선택할 수 있습니다. PWM에서 듀티 사이클 이 무엇인지 모르는 경우 간략하게 논의하겠습니다.
PWM 신호 란 무엇입니까?
펄스 폭 변조 (PWM)는 제어 회로에서 가장 일반적으로 사용되는 디지털 신호입니다. 신호가 높게 유지되는 시간을 "on time"이라고하고 신호가 낮게 유지되는 시간을 "off time"이라고합니다. PWM에는 아래에서 설명하는 두 가지 중요한 매개 변수가 있습니다.
PWM의 듀티 사이클
PWM 신호가 HIGH (on time)로 유지되는 시간의 비율을 듀티 사이클이라고합니다.
100ms 펄스 신호와 마찬가지로 신호가 50ms 동안 HIGH이고 50ms 동안 LOW이면 펄스가 절반은 HIGH이고 절반은 LOW임을 의미합니다. 따라서 듀티 사이클이 50 %라고 말할 수 있습니다. 마찬가지로 펄스가 100ms 중 25ms HIGH 상태이고 75ms LOW 상태 인 경우 듀티 사이클은 25 %가됩니다. HIGH 상태의 기간 만 계산합니다. 시각적 이해를 위해 아래 사진을 참조하십시오. 듀티 사이클 공식은 다음과 같습니다.
듀티 사이클 (%) = 켜짐 시간 / (켜짐 시간 + 꺼짐 시간)
따라서 듀티 사이클을 변경하여 PWM의 폭을 변경하여 LED 밝기를 변경할 수 있습니다. 우리는 LED의 밝기를 제어 할 때 다른 듀티 사이클을 사용하는 데모를 할 것입니다. 이 튜토리얼의 끝에 있는 데모 비디오 를 확인하십시오.
듀티 사이클을 선택한 후 다음 단계는 PWM 모드를 선택하는 것입니다. PWM 모드는 PWM의 작동 방식을 지정합니다. 주로 3 가지 유형의 PWM 모드가 있습니다. 다음과 같습니다.
- 빠른 PWM
- 위상 보정 PWM
- 위상 및 주파수 보정 PWM
빠른 PWM 은 위상 변화가 중요하지 않은 곳에 사용됩니다. Fast PWM을 사용하면 PWM 값을 빠르게 출력 할 수 있습니다. 고속 PWM은 위상 변화가 모터 제어와 같은 작동에 영향을 미치는 경우 사용할 수 없으므로 이러한 애플리케이션에서는 다른 PWM 모드가 사용됩니다. 위상 변화에 큰 영향을주지 않는 LED의 밝기를 제어 하므로 Fast PWM 모드를 사용합니다.
이제 PWM을 생성하기 위해 내부 타이머를 제어하여 카운트 업 한 다음 특정 카운트에서 다시 0으로 설정하므로 타이머가 카운트 업 된 다음 다시 0으로 설정됩니다. 이것은 기간을 설정합니다. 이제 펄스를 제어하고 타이머가 올라가는 동안 특정 카운트에서 펄스를 켜는 옵션이 있습니다. 카운터가 0으로 돌아 가면 펄스를 끕니다. 항상 타이머 카운트에 액세스하고 단일 타이머로 다른 펄스를 제공 할 수 있기 때문에 유연성이 많습니다. 한 번에 여러 개의 LED를 제어하고 싶을 때 유용합니다. 이제 PWM 용 Atmega16과 하나의 LED 인터페이스를 시작하겠습니다.
여기에서 모든 PWM 관련 프로젝트를 확인하십시오.
필요한 구성 요소
- Atmega16 AVR 마이크로 컨트롤러 IC
- 16Mhz 수정 발진기
- 2 개의 100nF 커패시터
- 2 개의 22pF 커패시터
- 누름 단추
- 점퍼 와이어
- 브레드 보드
- USBASP v2.0
- 2 주도 (모든 색상)
회로도
PWM에 OC2, 즉 Pin21 (PD7)을 사용하고 있습니다. 따라서 Atmega16의 PD7 핀에 하나의 LED를 연결하십시오.
PWM 용 Atmega16 프로그래밍
전체 프로그램은 다음과 같습니다. JTAG 및 Atmel studio를 사용하여 Atmega16에서 프로그램을 레코딩하고 LED에서 PWM 효과를 확인합니다. PWM의 듀티 사이클이 다양하기 때문에 밝기가 천천히 증가하고 감소합니다. 마지막에 주어진 비디오를 확인하십시오.
Timer2 레지스터를 설정하여 Atmega16 프로그래밍을 시작하십시오. Timer2 레지스터 비트는 다음과 같으며 그에 따라 비트를 설정하거나 재설정 할 수 있습니다.
이제 우리는 작성된 프로그램을 사용하여 원하는 PWM을 얻을 수 있도록 Timer2의 모든 비트에 대해 논의 할 것입니다.
Timer2 레지스터에는 주로 네 부분이 있습니다.
FOC2 (타이머 2에 대한 강제 출력 비교): WGM 비트가 비 PWM 모드를 지정할 때 FOC2 비트가 설정됩니다.
WGM2 (Wave Generation Mode for Timer2): 이 비트는 카운터의 계수 순서, 최대 (TOP) 카운터 값의 소스 및 사용할 파형 생성 유형을 제어합니다.
COM2 (타이머 2의 출력 모드 비교): 이 비트는 출력 동작을 제어합니다. 전체 비트 설명은 아래에 설명되어 있습니다.
TCCR2-= (1 <
PWM 고속 모드를 활성화하려면 WGM20 및 WGM21 비트를 HIGH로 설정하십시오. WGM은 파형 생성 모드를 나타냅니다. 선택 비트는 다음과 같습니다.
WGM00 |
WGM01 |
Timer2 모드 작동 |
0 |
0 |
일반 모드 |
0 |
1 |
CTC (비교시 타이머 지우기) |
1 |
0 |
PWM, 위상 보정 |
1 |
1 |
빠른 PWM 모드 |
파형 생성 모드에 대한 자세한 내용은 Atmega16의 공식 데이터 시트를 참조하십시오.
TCCR2-= (1 <
또한 사전 스케일링을 사용하지 않았으므로 클럭 소스 레지스터를 '001'로 설정했습니다.
클럭 선택 비트는 다음과 같습니다.
CS22 |
CS21 |
CS20 |
기술 |
0 |
0 |
0 |
클럭 소스 없음 (타이머 / 카운터 중지) |
0 |
0 |
1 |
clk T2S / (프리 스케일링 없음) |
0 |
1 |
0 |
Clk T2S / 8 (프리스케일러에서) |
0 |
1 |
1 |
Clk T2S / 32 (프리스케일러에서) |
1 |
0 |
0 |
Clk T2S / 64 (프리스케일러에서) |
1 |
0 |
1 |
Clk T2S / 128 (프리스케일러에서) |
1 |
1 |
0 |
Clk T2S / 256 (프리스케일러에서) |
1 |
1 |
1 |
Clk T2S / 1024 (프리스케일러에서) |
또한 COM21 비트를 '1'로 설정하고 COM20을 '0'으로 설정하면 비교 일치시 OC2가 해제됩니다.
고속 PWM 모드에 대한 비교 출력 모드 (COM) 선택 옵션은 다음과 같습니다.
COM21 |
COM21 |
기술 |
0 |
0 |
정상 포트 작동, OC2 연결 해제. |
0 |
1 |
예약석 |
1 |
0 |
비교 경기에서 OC2를 지우고 OC2를 TOP에 설정 |
1 |
1 |
비교 매치에서 OC2를 설정하고 TOP에서 OC2를 지 웁니다. |
시간이 지남에 따라 밝기가 증가하도록 듀티 사이클을 0 %에서 100 %로 늘리십시오. 0-255에서 값을 가져와 OCR2 핀으로 보냅니다.
for (duty = 0; duty <255; duty ++) // 0 ~ 최대 듀티 사이클 { OCR2 = duty; // LED 밝기를 천천히 증가 _delay_ms (10); }
마찬가지로 듀티 사이클을 100 %에서 0 %로 줄여 LED의 밝기를 점차적으로 낮추십시오.
for (duty = 0; duty> 255; duty--) // 최대 0 ~ 0 듀티 사이클 { OCR2 = duty; // LED 밝기를 천천히 줄입니다. _delay_ms (10); }
이것 으로 Atmega16 / 32에서 PWM 사용에 대한 자습서를 마칩니다.