이 프로젝트에서는 ATmega32A의 기능 중 하나를 사용하여 1W LED의 밝기 를 조정합니다. LED의 속도를 조정하는 방법은 PWM (Pulse Width Modulation)입니다. 이 AVR 마이크로 컨트롤러 PWM 자습서 에서는 PWM 개념과 PWM 생성에 대해 자세히 설명합니다 (이 간단한 PWM 생성 회로도 확인할 수 있음). 그림과 같이 간단한 회로를 고려하십시오.
이제 위 그림의 스위치가 일정 시간 동안 계속 닫히면 해당 시간 동안 전구가 계속 켜집니다. 스위치가 8ms 동안 닫히고 10ms주기 동안 2ms 동안 열리면 전구는 8ms 시간에만 켜집니다. 이제 10ms에 걸친 평균 단자 = Turn ON 시간 / (Turn ON 시간 + Turn OFF 시간), 이것을 듀티 사이클이라고하며 80 % (8 / (8 + 2))이므로 평균 출력 전압은 배터리 전압의 80 %입니다.
두 번째 경우 스위치는 5ms 동안 닫히고 10ms 동안 5ms 동안 열리므로 출력의 평균 단자 전압은 배터리 전압의 50 %가됩니다. 배터리 전압이 5V이고 듀티 사이클이 50 %이므로 평균 단자 전압은 2.5V가됩니다.
세 번째 경우 듀티 사이클은 20 %이고 평균 단자 전압은 배터리 전압의 20 %입니다.
ATMEGA32A에는 4 개의 PWM 채널, 즉 OC0, OC1A, OC1B 및 OC2가 있습니다. 여기서는 OC0 PWM 채널 을 사용 하여 LED의 밝기 를 변경합니다.
필요한 구성 요소
하드웨어:
ATmega32 마이크로 컨트롤러
전원 공급 장치 (5v)
AVR-ISP 프로그래머
100uF 커패시터, 1 와트 LED
TIP127 트랜지스터
버튼 (2 개)
100nF (104) 커패시터 (2 개), 100Ω 및 1kΩ 저항기 (2 개).
소프트웨어:
Atmel 스튜디오 6.1
Progisp 또는 플래시 매직
회로도 및 작동 설명
위 그림은 AVR 마이크로 컨트롤러가있는 LED 조광기의 회로도를 보여줍니다 (이 간단한 LED 조광기 회로도 확인할 수 있습니다).
ATmega에서는 4 개의 PWM 채널에 대해 4 개의 핀을 지정했습니다. 이 핀에서만 PWM 출력을 얻을 수 있습니다. PWM0을 사용하고 있으므로 OC0 핀 (PORTB 3 번째 PIN) 에서 PWM 신호를 가져와야 합니다. 그림과 같이 트랜지스터베이스를 OC0 핀에 연결하여 전원 LED를 구동합니다. 여기서 또 다른 것은 4 개의 PWM 채널에 대한 것이며 2 개는 8 비트 PWM 채널입니다. 여기서는 8 비트 PWM 채널을 사용하겠습니다.
바운싱을 방지하기 위해 각 버튼에 커패시터가 연결되어 있습니다. 버튼을 누를 때마다 핀에서 약간의 소음이 발생합니다. 이 소음은 밀리 초 단위로 안정화됩니다. 컨트롤러의 경우 안정화 전의 급격한 피크가 트리거 역할을합니다. 이 효과는 소프트웨어 나 하드웨어에 의해 제거되어 프로그램이 간단 해집니다. 디 바운싱 커패시터를 추가하여 하드웨어 방식을 사용하고 있습니다.
커패시터는 버튼이 튀는 효과를 무효화합니다.
ATMEGA에는 PWM 을 생성 하는 몇 가지 방법 이 있습니다.
1. 위상 보정 PWM
2. 빠른 PWM
여기서 우리는 모든 것을 단순하게 유지할 것이므로 FAST PWM 방법 을 사용하여 PWM 신호를 생성 할 것입니다.
먼저 PWM의 주파수를 선택합니다. 이것은 일반적으로 LED의 경우 50Hz보다 큰 주파수가 할 수있는 애플리케이션에 따라 다릅니다. 이러한 이유로 우리는 카운터 클럭 1MHZ를 선택하고 있습니다. 그래서 우리는 프리 스칼라를 선택하지 않습니다. 프리 스칼라는 더 적은 카운터 클럭을 얻기 위해 선택된 숫자입니다. 예를 들어 발진기 클럭이 8Mhz 인 경우 '8'의 프리 스칼라를 선택하여 카운터 용 1MHz 클럭을 얻을 수 있습니다. 프리 스칼라는 주파수에 따라 선택됩니다. 더 많은 시간주기 펄스를 원하면 더 높은 프리 스칼라를 선택해야합니다.
이제 ATMEGA에서 50Hz 클록의 FAST PWM을 얻으려면 " TCCR0 "레지스터 에서 적절한 비트를 활성화해야합니다. 이것은 8 비트 FAST PWM을 얻기 위해 우리가 귀찮게해야 할 유일한 레지스터입니다.
여기, 1. CS00, CS01, CS02 (YELLOW) — 카운터 클럭을 선택하기 위해 프리 스칼라를 선택합니다. 적절한 프리 스칼라에 대한 표는 아래 표에 나와 있습니다. 따라서 하나의 프리 스케일링 (오실레이터 클럭 = 카운터 클럭).
따라서 CS00 = 1, 다른 두 비트는 0입니다.
2. WGM01 및 WGM00은 빠른 PWM을 위해 아래 표에 따라 파형 생성 모드를 선택하도록 변경됩니다. WGM00 = 1 및 WGM01 = 1이 있습니다.
3. 이제 PWM이 듀티 비가 다르거 나 턴온 턴 오프 시간이 다른 신호임을 알 수 있습니다. 지금까지 우리는 PWM의 주파수와 유형을 선택했습니다. 이 프로젝트의 주요 주제는이 섹션에 있습니다. 다른 듀티 비를 얻기 위해 0에서 255 사이의 값을 선택합니다 (8 비트이므로 2 ^ 8). 카운터가 0부터 계산을 시작하고 값 180에 도달하면 값 180을 선택하면 출력 응답이 트리거 될 수 있습니다. 이 트리거는 반전 또는 비반 전일 수 있습니다. 즉, 출력이 카운트에 도달하면 풀업하도록 지시하거나 카운트에 도달하면 풀다운하도록 지시 할 수 있습니다.
이 풀업 또는 풀다운 선택은 CM00 및 CM01 비트에 의해 선택됩니다.
표에서 볼 수 있듯이 비교시 출력이 높아지고 출력은 최대 값까지 높게 유지됩니다 (아래 그림 참조). 그렇게하려면 반전 모드를 선택해야하므로 COM00 = 1; COM01 = 1.
아래 그림과 같이 OCR0 (출력 비교 레지스터 0)은 사용자가 선택한 값을 저장하는 바이트입니다. 따라서 OCR0 = 180을 변경하면 카운터가 0에서 180에 도달하면 컨트롤러가 변경 (높음)을 트리거합니다.
이제 LED의 밝기 를 변경하려면 PWM 신호의 DUTY RATIO를 변경해야합니다. 듀티 비를 변경하려면 OCR0 값을 변경해야합니다. 이 OCR0 값을 변경하면 카운터가 OCR0에 도달하는 데 다른 시간이 걸립니다. 따라서 컨트롤러는 다른 시간에 출력을 높입니다.
따라서 듀티 사이클이 다른 PWM의 경우 OCR0 값을 변경해야합니다.
회로에는 두 개의 버튼이 있습니다. 하나의 버튼은 OCR0 값을 증가시키기위한 것이므로 PWM 신호의 DUTY RATIO, 다른 하나는 OCR0 값을 감소시키는 것이므로 PWM 신호의 DUTY RATIO입니다.