이것은 MPLAB 및 XC8을 사용하는 PIC 마이크로 컨트롤러 학습에 대한 10 번째 튜토리얼입니다. 지금까지 PIC를 사용한 LED 깜박임, PIC의 타이머, LCD 인터페이스, 7 세그먼트 인터페이스, PIC를 사용하는 ADC 등과 같은 많은 기본 자습서를 다루었습니다. 완전 초보자 인 경우 여기에서 PIC 자습서의 전체 목록을 방문하십시오. 배우기 시작하십시오.
이 튜토리얼에서는 PIC PIC16F877A를 사용하여 PWM 신호를 생성 하는 방법을 배웁니다. PIC MCU에는 PWM 신호를 생성하는 데 사용할 수있는 비교 캡처 모듈 (CCP) 이라는 특수 모듈 이 있습니다. 여기서는 0 %에서 100 %까지 가변 듀티 사이클로 5kHz의 PWM을 생성합니다. 듀티 사이클을 변경하려면 전위차계를 사용하고 있으므로 PWM으로 시작하기 전에 ADC 자습서를 배우는 것이 좋습니다. PWM 모듈은 또한 타이머를 사용하여 주파수를 설정하므로 여기에서 미리 타이머를 사용하는 방법을 배웁니다. 또한이 튜토리얼에서는 RC 회로와 LED를 사용하여 PWM 값을 아날로그 전압으로 변환하고 LED 조명을 어둡게하는 데 사용합니다.
PWM 신호 란 무엇입니까?
펄스 폭 변조 (PWM)는 제어 회로에서 가장 일반적으로 사용되는 디지털 신호입니다. 이 신호는 미리 정의 된 시간과 속도로 높음 (5v) 및 낮음 (0v)으로 설정됩니다. 신호가 높게 유지되는 시간을 "on time"이라고하고 신호가 낮게 유지되는 시간을 "off time"이라고합니다. PWM에는 아래에서 설명하는 두 가지 중요한 매개 변수가 있습니다.
PWM의 듀티 사이클:
PWM 신호가 HIGH (on time)로 유지되는 시간의 비율을 듀티 사이클이라고합니다. 신호가 항상 ON이면 100 % 듀티 사이클이고 항상 꺼져 있으면 0 % 듀티 사이클입니다.
듀티 사이클 = Turn ON 시간 / (Turn ON 시간 + Turn OFF 시간)
PWM의 주파수:
PWM 신호의 주파수는 PWM이 한주기를 완료하는 속도를 결정합니다. 1주기는 위의 그림과 같이 PWM 신호의 ON 및 OFF가 완료됩니다. 튜토리얼에서는 주파수를 5KHz로 설정합니다.
PIC16F877A를 사용하는 PWM:
PWM 신호는 CCP (Compare Capture PWM) 모듈 을 사용하여 PIC 마이크로 컨트롤러에서 생성 할 수 있습니다. PWM 신호의 분해능은 10 비트입니다. 즉, 값이 0이면 듀티 사이클이 0 %이고 값이 1024 (2 ^ 10)이면 듀티 사이클이 100 %입니다. PIC MCU (CCP1 및 CCP2)에는 두 개의 CCP 모듈이 있습니다. 즉, 두 개의 서로 다른 핀 (핀 17 및 16)에서 동시에 두 개의 PWM 신호를 생성 할 수 있습니다.이 자습서에서는 CCP1을 사용하여 핀 17에서 PWM 신호를 생성합니다.
다음 레지스터는 PIC MCU를 사용하여 PWM 신호를 생성하는 데 사용됩니다.
- CCP1CON (CCP1 제어 레지스터)
- T2CON (타이머 2 제어 레지스터)
- PR2 (타이머 2 모듈 기간 레지스터)
- CCPR1L (CCP 레지스터 1 낮음)
PWM 신호를 생성하도록 PIC 프로그래밍:
우리 프로그램에서는 전위차계에서 0-5v의 아날로그 전압을 읽고 ADC 모듈을 사용하여 0-1024에 매핑합니다. 그런 다음 주파수가 5000Hz 인 PWM 신호를 생성하고 입력 아날로그 전압에 따라 듀티 사이클을 변경합니다. 즉, 0-1024는 0 % -100 % 듀티 사이클로 변환됩니다. 이 튜토리얼에서는 PIC에서 ADC를 사용하는 방법을 이미 배웠다고 가정합니다. 그렇지 않은 경우 여기에서 읽으십시오.이 튜토리얼에서는 이에 대한 세부 사항을 건너 뛸 것입니다.
따라서 구성 비트가 설정되고 아날로그 값을 읽는 프로그램이 작성되면 PWM을 진행할 수 있습니다.
PWM 작동을 위해 CCP 모듈을 구성 할 때 다음 단계를 수행해야합니다.
- PR2 레지스터에 기록하여 PWM주기를 설정합니다.
- CCPR1L 레지스터 및 CCP1CON <5: 4> 비트에 기록하여 PWM 듀티 사이클을 설정합니다.
- TRISC <2> 비트를 지워 CCP1 핀을 출력으로 만듭니다.
- TMR2 프리 스케일 값을 설정하고 T2CON에 기록하여 Timer2를 활성화합니다.
- PWM 작동을 위해 CCP1 모듈을 구성합니다.
이 프로그램에는 PWM 신호를 생성하는 두 가지 중요한 기능이 있습니다. 하나는 인 PWM_Initialize () PWM 모듈 설정에 필요한 레지스터를 초기화한다 기능하고 PWM이 동작해야하는 주파수를 설정 한 다른 함수이다 PWM_Duty () 에서 PWM 신호의 듀티 사이클을 설정한다 함수 필요한 레지스터.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE))-1; // 데이터 시트를 사용하여 PR2 공식 설정 // PWM이 5KHZ에서 작동하도록합니다. CCP1M3 = 1; CCP1M2 = 1; // CCP1 모듈 구성 T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // 타이머 모듈 구성 TRISC2 = 0; // C의 포트 핀을 출력으로 만듭니다.}
위의 기능은 PWM 초기화 기능입니다.이 기능에서 CCP1 모듈은 비트 CCP1M3 및 CCP1M2를 하이로 만들어 PWM을 사용하도록 설정됩니다.
타이머 모듈의 프리스케일러는 T2CKPS0 비트를 하이로 설정하고 T2CKPS1 비트를 로우로 설정하여 TMR2ON 비트가 타이머를 시작하도록 설정합니다.
이제 PWM 신호의 주파수 를 설정 해야합니다. 주파수 값은 PR2 레지스터에 기록되어야합니다. 원하는 주파수는 아래 공식을 사용하여 설정할 수 있습니다.
PWM 기간 = * 4 * TOSC * (TMR2 프리 스케일 값)
PR2를 얻기 위해이 공식을 재정렬하면
PR2 = (기간 / (4 * Tosc * TMR2 Prescale))-1
기간 = (1 / PWM_freq) 및 Tosc = (1 / _XTAL_FREQ)임을 알고 있습니다. 따라서…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) – 1;
주파수가 설정되면 주파수를 다시 변경해야 할 때까지이 함수를 다시 호출 할 필요가 없습니다. 이 튜토리얼에서는 PWM_freq = 5000 을 할당 했습니다. PWM 신호에 대해 5KHz 작동 주파수를 얻을 수 있습니다.
이제 아래 기능을 사용하여 PWM의 듀티 사이클을 설정 하겠습니다.
PWM_Duty (unsigned int duty) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // 감소시 // duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = 의무 & 1; // 첫 번째 비트 저장 CCP1Y = duty & 2; // 0 번째 비트 저장 CCPR1L = duty >> 2; // 리 마이닝 8 비트 저장}}
PWM 신호의 분해능은 10 비트이므로 PIC에 8 비트 데이터 라인 만 있기 때문에이 값을 단일 레지스터에 저장할 수 없습니다. 따라서 CCP1CON <5: 4>의 다른 두 비트 (CCP1X 및 CCP1Y)를 사용하여 마지막 두 LSB를 저장 한 다음 나머지 8 비트를 CCPR1L 레지스터에 저장합니다.
PWM 듀티 사이클 시간은 아래 공식을 사용하여 계산할 수 있습니다.
PWM 듀티 사이클 = (CCPRIL: CCP1CON <5: 4>) * Tosc * (TMR2 프리 스케일 값)
CCPR1L 및 CCP1CON의 값을 얻기 위해 이러한 공식을 재정렬하면 다음이 제공됩니다.
CCPRIL: CCP1Con <5: 4> = PWM 듀티 사이클 / (Tosc * TMR2 프리 스케일 값)
ADC의 값은 0-1024가되며 0 % -100 %가되어야하므로 PWM Duty Cycle = duty / 1023이됩니다. 이 듀티 사이클을 시간 주기로 변환하려면주기 (1 / PWM_freq)와 곱해야합니다.
또한 Tosc = (1 / PWM_freq)이므로..
Duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
위의 방정식을 해결하면 다음과 같은 결과를 얻을 수 있습니다.
Duty = ((float) duty / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
자세한 비디오 와 함께 아래 코드 섹션에서 전체 프로그램 을 확인할 수 있습니다.
회로도 및 테스트:
평소처럼 Proteus 시뮬레이션을 사용하여 출력을 확인하겠습니다. 회로 다이어그램은 다음과 같습니다.
7 전위차계 연결 제 0-5의 전압 피드 핀. CCP1 모듈에는 핀 17 (RC2)이 있으며 여기에서 PWM이 생성되며 디지털 오실로스코프를 사용하여 확인할 수 있습니다. 또한이를 가변 전압으로 변환 하기 위해 RC 필터와 LED를 사용하여 스코프없이 출력을 확인했습니다.
RC-Filter 란 무엇입니까?
RC 필터 또는 로우 패스 필터, 즉 두 개의 수동 소자는 저항 및 커패시터를 갖는 간단한 회로이다. 이 두 구성 요소는 PWM 신호의 주파수를 필터링하고 가변 DC 전압으로 만드는 데 사용됩니다.
회로를 살펴보면 R의 입력에 가변 전압이 가해지면 커패시터 C가 충전되기 시작합니다. 이제 커패시터의 값에 따라 커패시터가 완전히 충전되는 데 약간의 시간이 걸리며 일단 충전되면 DC 전류를 차단하므로 (커패시터는 DC를 차단하지만 AC는 허용 함) 입력 DC 전압이 출력에 나타납니다. 고주파 PWM (AC 신호)은 커패시터를 통해 접지됩니다. 따라서 커패시터를 통해 순수한 DC가 얻어집니다. 1000Ohm 및 1uf 값이이 프로젝트에 적합한 것으로 확인되었습니다. R과 C의 값을 계산하려면 전달 함수를 사용한 회로 분석이 포함되며, 이는이 튜토리얼의 범위를 벗어납니다.
프로그램 의 출력은 아래와 같이 디지털 오실로스코프 를 사용하여 확인할 수 있으며 전위차계를 변경하고 PWM의 듀티 사이클을 변경해야합니다. 전압계를 사용하여 RC 회로의 출력 전압을 확인할 수도 있습니다. 모든 것이 예상대로 작동하면 하드웨어로 진행할 수 있습니다. 전체 프로세스는 마지막에 비디오를 확인하십시오.
하드웨어 작업:
프로젝트의 하드웨어 설정은 매우 간단합니다. 아래 표시된 PIC Perf 보드를 재사용 할 것입니다.
또한 아날로그 전압을 공급하기 위해 전위차계가 필요합니다. PIC Perf 보드에 직접 연결할 수 있도록 일부 암 끝 와이어를 냄비에 연결했습니다 (아래 참조).
마지막으로 출력을 확인하기 위해 PWM 신호가 어떻게 작동 하는지 확인하기 위해 RC 회로와 LED가 필요합니다. 아래 그림과 같이 작은 성능 기판을 사용하고 RC 회로와 LED (밝기를 제어하기 위해)를 납땜했습니다.
간단한 암-암 연결 와이어를 사용하고 위에 표시된 회로도에 따라 연결할 수 있습니다. 연결이 완료되면 pickit3을 사용하여 프로그램을 PIC에 업로드하면 전위차계의 입력에 따라 가변 전압을 얻을 수 있습니다. 가변 출력은 여기서 LED의 밝기를 제어하는 데 사용됩니다.
멀티 미터를 사용하여 가변 출력을 측정했습니다. 또한 다양한 전압 레벨에 따라 LED 밝기가 변경되는 것을 확인할 수 있습니다.
이것이 POT에서 아날로그 전압을 읽고 PWM 신호로 변환하도록 프로그래밍 한 것입니다.이 신호는 RC 필터를 사용하여 가변 전압으로 변환되고 결과는 하드웨어를 사용하여 확인됩니다. 의심스러운 점이 있거나 어딘가에 갇혀 있다면 아래 댓글 섹션을 사용하여 기꺼이 도와 드리겠습니다. 전체 작업은 비디오에 노력하고 있습니다.
다른 마이크로 컨트롤러에 대한 다른 PWM 자습서도 확인하십시오.
- Raspberry Pi PWM 튜토리얼
- Arduino Due를 사용한 PWM
- PWM을 사용하는 Arduino 기반 LED 조광기
- ATmega32 마이크로 컨트롤러를 사용하는 전원 LED 조광기