- PWM (펄스 폭 변조)
- ARM7-LPC2148의 PWM 핀
- ARM7-LPC2148의 PWM 레지스터
- 필요한 구성 요소
- 회로도 및 연결
- PWM 용 ARM7-LPC2148 프로그래밍
- PWM 및 ADC를위한 LPC2148 프로그래밍 단계
아시다시피 마이크로 컨트롤러는 아날로그 센서에서 아날로그 입력을 받고 ADC (아날로그-디지털 변환기)를 사용하여 이러한 신호를 처리합니다. 그러나 마이크로 컨트롤러가 서보 모터, DC 모터 등과 같은 아날로그 작동 장치를 제어하기 위해 아날로그 신호를 생성하려면 어떻게해야할까요? 마이크로 컨트롤러는 1V, 5V와 같은 출력 전압을 생성하지 않고 대신 PWM이라는 기술을 사용하여 아날로그 장치를 작동합니다. PWM의 예로는 온도에 따라 속도를 제어해야하는 노트북의 냉각 팬 (DC 모터)이 있으며, 마더 보드에서 PWM (Pulse Width Modulation) 기술을 사용하여 구현됩니다.
이 튜토리얼에서는 ARM7-LPC2148 마이크로 컨트롤러에서 PWM을 사용하여 LED의 밝기를 제어합니다.
PWM (펄스 폭 변조)
PWM은 모터의 속도, LED 밝기 등의 디지털 값을 사용하여 아날로그 장치를 제어하는 좋은 방법입니다. PWM은 순수한 아날로그 출력을 제공하지는 않지만 적절한 아날로그 펄스를 생성하여 Analog Devices를 제어합니다. PWM은 결과 파동의 평균값의 변화를 얻기 위해 실제로 직사각형 펄 스파의 폭을 변조합니다.
PWM의 듀티 사이클
PWM 신호가 HIGH (on time)로 유지되는 시간의 비율을 듀티 사이클이라고합니다. 신호가 항상 ON이면 100 % 듀티 사이클이고 항상 꺼져 있으면 0 % 듀티 사이클입니다.
듀티 사이클 = Turn ON 시간 / (Turn ON 시간 + Turn OFF 시간)
ARM7-LPC2148의 PWM 핀
아래 이미지 는 ARM7-LPC2148 의 PWM 출력 핀을 나타냅니다. PWM 용 으로 총 6 개의 핀이 있습니다.
PWM 채널 |
LPC2148 포트 핀 |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
ARM7-LPC2148의 PWM 레지스터
프로젝트에 들어가기 전에 LPC2148의 PWM 레지스터에 대해 알아야합니다.
다음은 PWM 용 LPC2148에서 사용되는 레지스터 목록입니다.
1. PWMPR: PWM 프리 스케일 레지스터
사용: 32 비트 레지스터입니다. 여기에는 PWM 타이머 카운터를 증가시키기 전에 PCLK가 순환해야하는 횟수 (마이너스 1)가 포함됩니다 (실제로 프리 스케일 카운터의 최대 값을 보유 함).
2. PWMPC: PWM 프리스케일러 카운터
사용: 32 비트 레지스터 입니다. 증가하는 카운터 값을 포함합니다. 이 값이 PR 값에 1을 더한 값과 같으면 PWM 타이머 카운터 (TC)가 증가합니다.
3. PWMTCR: PWM 타이머 제어 레지스터
사용: 카운터 활성화, 카운터 재설정 및 PWM 활성화 제어 비트를 포함합니다. 8 비트 레지스터입니다.
7: 4 |
삼 |
2 |
1 |
0 |
예약석 |
PWM 활성화 |
예약석 |
카운터 리셋 |
카운터 활성화 |
- PWM 활성화: (비트 -3)
0- PWM 비활성화
1- PWM 활성화
- 카운터 활성화: (비트 -0)
0- 카운터 비활성화
1- 카운터 활성화
- 카운터 재설정: (비트 -1)
0- 아무것도하지 않습니다.
1- PCLK의 양의 에지에서 PWMTC 및 PWMPC를 재설정합니다.
4. PWMTC: PWM 타이머 카운터
사용: 32 비트 레지스터입니다. 증가하는 PWM 타이머의 현재 값을 포함합니다. 프리스케일러 카운터 (PC)가 프리스케일러 레지스터 (PR) 값에 1을 더한 값에 도달하면이 카운터가 증가합니다.
5. PWMIR: PWM 인터럽트 레지스터
사용: 16 비트 레지스터입니다. PWM 매치 채널 0-6에 대한 인터럽트 플래그를 포함합니다. 인터럽트 플래그는 해당 채널 (MRx Interrupt)에 대해 인터럽트가 발생할 때 설정됩니다. 여기서 X는 채널 번호 (0 ~ 6)입니다.
6. PWMMR0-PWMMR6: PWM 매칭 레지스터
사용: 32 비트 레지스터 입니다. 실제로 Match Channel 그룹은 6 개의 단일 에지 제어 또는 3 개의 이중 에지 제어 PWM 출력을 설정할 수 있습니다. 7 개의 일치 채널을 수정하여 PWMPCR의 요구 사항에 맞게 이러한 PWM 출력을 구성 할 수 있습니다.
7. PWMMCR: PWM 매칭 제어 레지스터
사용: 32 비트 레지스터입니다. 여기에는 선택한 일치 채널을 제어하는 인터럽트, 재설정 및 중지 비트가 포함되어 있습니다. PWM 일치 레지스터와 PWM 타이머 카운터간에 일치가 발생합니다.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
삼 |
2 |
1 |
0 |
예약석 |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
여기서 x는 0에서 6까지입니다.
- PWMMRxI (비트 -0)
PWM 인터럽트 활성화 또는 비활성화
0- PWM Match 인터럽트를 비활성화합니다.
1- PWM Match 인터럽트를 활성화합니다.
- PWMMRxR:(비트 -1)
RESET PWMTC- PWMRx와 일치 할 때마다 타이머 카운터 값
0- 아무것도하지 않습니다.
1- PWMTC를 재설정합니다.
- PWMMRxS:(비트 2)
PWMTC가 Match 레지스터 값에 도달하면 STOP PWMTC & PWMPC
0- PWM 중지 기능을 비활성화합니다.
1- PWM 중지 기능을 활성화합니다.
8. PWMPCR: PWM 제어 레지스터
사용: 16 비트 레지스터입니다. 여기에는 PWM 출력 0-6을 활성화하고 각 출력에 대해 단일 에지 또는 이중 에지 제어를 선택하는 비트가 포함되어 있습니다.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
미사용 |
PWMENA6-PWMENA1 |
미사용 |
PWMSEL6-PWMSEL2 |
미사용 |
- PWMSELx (x: 2 ~ 6)
- PWMx 용 단일 에지 모드
- 1- PWMx 용 이중 에지 모드.
- PWMENAx (x: 1 ~ 6)
- PWMx 비활성화.
- 1- PWMx 활성화.
9. PWMLER: PWM 래치 활성화 레지스터
사용: 8 비트 레지스터입니다. 여기에는 각 일치 채널에 대한 일치 x 래치 비트가 포함됩니다.
31: 7 |
6 |
5 |
4 |
삼 |
2 |
1 |
0 |
미사용 |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 ~ 6):
0- 새 일치 값로드 비활성화
1- 타이머가 재설정 될 때 (PWMMRx) PWMMatch 레지스터에서 새 일치 값을로드합니다.
이제 ARM 마이크로 컨트롤러에서 펄스 폭 변조를 시연하기위한 하드웨어 설정 구축을 시작하겠습니다.
필요한 구성 요소
하드웨어
- ARM7-LPC2148 마이크로 컨트롤러
- 3.3V 전압 조정기 IC
- 10k 전위차계
- LED (모든 색상)
- LCD (16x2) 디스플레이 모듈
- 브레드 보드
- 전선 연결
소프트웨어
- Keil uVision5
- 플래시 매직 도구
회로도 및 연결
LCD와 ARM7-LPC2148 간의 연결
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (등록 선택) |
P0.6 |
E (사용) |
P0.12 |
D4 (데이터 핀 4) |
P0.13 |
D5 (데이터 핀 5) |
P0.14 |
D6 (데이터 핀 6) |
P0.15 |
D7 (데이터 핀 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
LED와 ARM7-LPC2148 간의 연결
LED의 ANODE는 LPC2148의 PWM 출력 (P0.0)에 연결되고 LED의 CATHODE 핀은 LPC2148의 GND 핀에 연결됩니다.
ARM7-LPC2148과 3.3V 전압 조정기가있는 전위차계 간의 연결
3.3V 전압 조정기 IC |
핀 기능 |
ARM-7 LPC2148 핀 |
1. 왼쪽 핀 |
-GND의 Ve |
GND 핀 |
2. 센터 핀 |
조정 된 + 3.3V 출력 |
전위차계 입력 및 전위차계의 출력을 LPC2148의 P0.28로 |
3. 오른쪽 핀 |
+ 5V에서 Ve 입력 |
+ 5V |
주목할 점
1. 여기서 3.3V의 전압 조정기는 LPC2148의 ADC 핀 (P0.28)에 아날로그 입력 값을 제공하는 데 사용되며 5V 전원을 사용하기 때문에 3.3V의 전압 조정기로 전압을 조정해야합니다.
2. 전위차계는 LPC2148 핀 P0.28에 아날로그 입력 (ADC)을 제공하기 위해 (0V ~ 3.3V) 전압을 변경하는 데 사용됩니다.
PWM 용 ARM7-LPC2148 프로그래밍
ARM7-LPC2148을 프로그래밍하려면 keil uVision 및 Flash Magic 도구가 필요합니다. 마이크로 USB 포트를 통해 ARM7 Stick을 프로그래밍하기 위해 USB 케이블을 사용하고 있습니다. Keil을 사용하여 코드를 작성하고 16 진수 파일을 만든 다음 Flash Magic을 사용하여 HEX 파일을 ARM7 스틱에 플래시합니다. keil uVision 및 Flash Magic 설치 및 사용 방법에 대한 자세한 내용은 ARM7 LPC2148 마이크로 컨트롤러 시작하기 링크를 클릭하고 Keil uVision을 사용하여 프로그래밍하십시오.
이 튜토리얼에서는 ADC 및 PWM 기술을 사용하여 LED의 밝기를 제어합니다. 여기서 LPC2148에는 ADC 입력 핀 P0.28을 통해 아날로그 입력 (0 ~ 3.3V)이 제공되고이 아날로그 입력은 디지털 값 (0 ~ 1023)으로 변환됩니다. 그런 다음 LPC2148의 PWM 출력이 8 비트 분해능 (2 8)에 불과하므로이 값은 다시 디지털 값 (0-255)으로 변환됩니다. LED는 PWM 핀 P0.0에 연결되며 LED의 밝기는 전위차계를 사용하여 제어 할 수 있습니다. ARM7-LPC2148의 ADC에 대해 자세히 알아 보려면 링크를 따르십시오.
PWM 및 ADC를위한 LPC2148 프로그래밍 단계
1 단계: 첫 번째 는 프로그래머가 필요로하는 LPC2148의 시스템 클록 및 주변 장치 클록을 설정하므로 클록 생성을 위해 PLL 을 구성하는 것입니다. LPC2148의 최대 클럭 주파수는 60Mhz입니다. 다음 줄은 PLL 클록 생성을 구성하는 데 사용됩니다.
void initilizePLL (void) // 클럭 생성에 PLL을 사용하는 함수 { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; while (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
2 단계: 다음은 PINSEL 레지스터를 사용하여 LPC2148의 PWM 핀과 PWM 기능을 선택하는 것입니다. LPC2148의 PWM 출력에 P0.0을 사용하므로 PINSEL0을 사용합니다.
PINSEL0 = 0x00000002; // PWM 출력용 핀 P0.0 설정
3 단계: 다음으로 PWMTCR (타이머 제어 레지스터)을 사용하여 타이머를 재설정해야합니다.
PWMTCR = (1 << 1); // PWM 타이머 제어 레지스터를 카운터 리셋으로 설정
그리고 PWM의 분해능을 결정하는 프리 스케일 값을 설정합니다. 0으로 설정합니다
PWMPR = 0X00; // PWM 프리 스케일 값 설정
4 단계: 다음으로 PWMMR0에 대한 재설정, 인터럽트와 같은 동작을 설정하므로 PWMMCR (PWM 일치 제어 레지스터)을 설정해야합니다.
PWMMCR = (1 << 0)-(1 << 1); // PWM 일치 제어 레지스터 설정
5 단계: PWMMR을 사용하여 PWM 채널의 최대 기간을 설정합니다.
PWMMR0 = PWM 값; // PWM 값 최대 값 제공
우리의 경우 최대 값은 255입니다 (최대 밝기)
6 단계: 다음으로 PWMLER를 사용하여 래치 활성화를 해당 일치 레지스터로 설정해야합니다.
PWMLER = (1 << 0); // Enalbe PWM 래치
(PWMMR0 사용) 따라서 PWMLER에서 1을 설정하여 해당 비트를 활성화합니다.
7 단계: 핀에 대한 PWM 출력을 활성화하려면 PWMTCR을 사용하여 PWM 타이머 카운터 및 PWM 모드를 활성화해야합니다.
PWMTCR = (1 << 0)-(1 << 3); // PWM 및 PWM 카운터 활성화
8 단계: 이제 ADC 핀 P0.28에서 PWM의 듀티 사이클을 설정하기위한 전위차계 값을 가져와야합니다. 따라서 LPC2148의 ADC 모듈을 사용하여 전위차계 아날로그 입력 (0 ~ 3.3V)을 ADC 값 (0 ~ 1023)으로 변환합니다.
여기서는 LPC2148의 PWM이 8 비트 분해능 (2 8)을 가지 므로 0-1023에서 0-255 값을 4로 나누어 값을 변환합니다.
9 단계: - 에 대한 LPC2148의 ADC 핀 P0.28을 선택, 우리는 사용
PINSEL1 = 0x01000000; //P0.28을 ADC INPUT으로 설정 AD0CR = (((14) << 8)-(1 << 21)); // A / D 변환을위한 클럭 및 PDN 설정
다음 줄 은 아날로그 입력 (0 ~ 3.3V)을 캡처하여 디지털 값 (0 ~ 1023)으로 변환합니다. 그런 다음이 디지털 값을 4로 나누어 (0 ~ 255) 로 변환 한 후 LED가 연결된 LPC2148의 P0.0 핀 에 PWM 출력 으로 공급됩니다.
AD0CR-= (1 << 1); // ADC 레지스터에서 AD0.1 채널 선택 delaytime (10); AD0CR-= (1 << 24); // A / D 변환 시작 while ((AD0DR1 & (1 << 31)) == 0); // ADC 데이터 레지스터에서 DONE 비트 확인 adcvalue = (AD0DR1 >> 6) & 0x3ff; // ADC 데이터 레지스터에서 결과 얻기 dutycycle = adcvalue / 4; // (0에서 255까지) 듀티 사이클 값을 가져 오는 공식 PWMMR1 = dutycycle; // PWM 매칭 레지스터에 듀티 사이클 값 설정 PWMLER- = (1 << 1); // 듀티 사이클 값으로 PWM 출력 활성화
10 단계:- 다음으로 LCD (16X2) 디스플레이 모듈에 해당 값을 표시합니다. 그래서 우리는 LCD 디스플레이 모듈을 초기화하기 위해 다음 줄을 추가합니다.
Void LCD_INITILIZE (void) // LCD를 준비하는 기능 { IO0DIR = 0x0000FFF0; //P0.12,P0.13,P0.14,P0.15,P0.4,P0.6 핀을 OUTPUT delaytime (20); LCD_SEND (0x02); // 4 비트 동작 모드로 LCD 초기화 LCD_SEND (0x28); // 2 줄 (16X2) LCD_SEND (0x0C); // 커서를 벗어난 커서에 표시 LCD_SEND (0x06); // 커서 자동 증가 LCD_SEND (0x01); // 클리어 LCD_SEND (0x80); // 첫 줄 첫 번째 위치 }
LPC2148 을 사용 하여 4 비트 모드에서 LCD를 연결 했으므로 니블 단위로 니블 (Upper Nibble & Lower Nibble)로 표시 할 값을 보내야합니다. 따라서 다음 줄이 사용됩니다.
void LCD_DISPLAY (char * msg) // 전송 된 문자를 하나씩 출력하는 기능 { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF)-((msg & 0xF0) << 8)); // 상단 니블 전송 IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH to print data IO0CLR = 0x00000020; // RW LOW 쓰기 모드 delaytime (2); IO0CLR = 0x00000040; // EN = 0, RS 및 RW는 변경되지 않음 (예: RS = 1, RW = 0) delaytime (5); IO0PIN = ((IO0PIN & 0xFFFF00FF)-((msg & 0x0F) << 12)); // 하단 니블 전송 IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; 지연 시간 (2); IO0CLR = 0x00000040; 지연 시간 (5); i ++; } }
이러한 ADC 및 PWM 값을 표시하기 위해 int main () 함수 에서 다음 줄을 사용 합니다.
LCD_SEND (0x80); sprintf (displayadc, "adcvalue = % f", adcvalue); LCD_DISPLAY (displayadc); // ADC 값 표시 (0 ~ 1023) LCD_SEND (0xC0); sprintf (ledoutput, "PWM OP = %. 2f", 밝기); LCD_DISPLAY (LED 출력); // (0 ~ 255)의 듀티 사이클 값 표시
튜토리얼의 전체 코드와 비디오 설명은 다음과 같습니다.