- ADC 란?
- ARM7-LPC2148의 ADC
- ARM7-LPC2148의 ADC 핀
- ARM7-LPC2148의 ADC 레지스터
- LPC2148의 ADxCR 레지스터
- ADxGDR : ADC 글로벌 데이터 레지스터
- 필요한 구성 요소
- 회로도
- ADC 용 ARM7-LPC2148 프로그래밍
전자 업계에는 온도, 속도, 변위, 압력 등을 측정하는 데 사용되는 다양한 아날로그 센서가 시장에 나와 있습니다. 아날로그 센서는 시간이 지남에 따라 지속적으로 변화하는 출력을 생성하는 데 사용됩니다. 아날로그 센서의 이러한 신호는 수 마이크로 볼트 (uV)에서 수 밀리 볼트 (mV)까지 값이 매우 작은 경향이 있으므로 어떤 형태의 증폭이 필요합니다. 마이크로 컨트롤러에서 이러한 아날로그 신호를 사용 하려면 마이크로 컨트롤러가 디지털 신호 만 이해하고 처리하므로 아날로그 신호를 디지털 신호 로 변환 해야합니다. 따라서 대부분의 마이크로 컨트롤러에는 ADC (Analog to Digital converter) 라는 중요한 기능이 내장 되어 있습니다. 마이크로 컨트롤러 ARM7-LPC2148 에는 ADC 기능도 있습니다.
이 튜토리얼에서는 아날로그 핀에 가변 전압을 공급하여 ARM7-LPC2148에서 ADC를 사용 하고 아날로그에서 디지털로 변환 한 후 16x2 LCD 화면에 표시 하는 방법을 살펴 봅니다. 이제 ADC에 대한 간략한 소개부터 시작하겠습니다.
ADC 란?
앞서 언급했듯이 ADC는 아날로그에서 디지털로의 변환을 나타내며 실제 세계의 아날로그 값을 1과 0과 같은 디지털 값으로 변환하는 데 사용됩니다. 그렇다면 이러한 아날로그 값은 무엇입니까? 온도, 속도, 밝기 등과 같은 일상 생활에서 볼 수있는 것입니다. 이러한 매개 변수는 각 센서에 의해 아날로그 전압으로 측정 된 다음 이러한 아날로그 값이 마이크로 컨트롤러의 디지털 값으로 변환됩니다.
ADC 범위가 0V ~ 3.3V이고 10 비트 ADC가 있다고 가정 해 보겠습니다. 즉, 입력 전압 0-3.3V가 1024 레벨의 개별 아날로그 값 (2 10 = 1024) 으로 분할된다는 것을 의미합니다. 1024는 10 비트 ADC의 분해능을 의미하며, 마찬가지로 8 비트 ADC 분해능은 512 (28)이고 16 비트 ADC 분해능은 65,536 (216)입니다. LPC2148에는 10 비트 분해능 ADC가 있습니다.
이를 통해 실제 입력 전압이 0V이면 MCU의 ADC는 0으로 읽고 3.3V이면 MCU는 1024를 읽고 1.65v와 같은 사이에 있으면 MCU는 512를 읽습니다. 아래를 사용할 수 있습니다. ADC 및 작동 전압의 분해능을 기반으로 MCU가 읽을 디지털 값을 계산하는 공식.
(ADC 해상도 / 작동 전압) = (ADC 디지털 값 / 실제 전압 값)
예를 들어 기준 전압이 3v 인 경우:
이전 기사에서 ADC에 대해 자세히 설명했습니다.
ARM7-LPC2148의 ADC
- LPC2148에는 두 개의 아날로그-디지털 변환기가 있습니다.
- 이 변환기는 단일 10 비트 연속 근사 아날로그-디지털 변환기입니다.
- ADC0에는 6 개의 채널 이 있지만 ADC1에는 8 개의 채널이 있습니다.
- 따라서 LPC2148 에 사용할 수있는 ADC 입력 의 총 개수 는 14 개 입니다.
- (0 ~ 3.3V) 범위의 입력 전압 만 변환합니다. 3.3V 기준 전압을 초과하지 않아야합니다. IC를 손상시키고 불확실한 값을 제공하기 때문입니다.
LPC2148에서 ADC의 몇 가지 중요한 기능
- 초당 400000 개 이상의 10 비트 샘플을 수행 할 수있는 각 변환기.
- 모든 아날로그 입력에는 인터럽트 오버 헤드를 줄이기위한 전용 결과 레지스터가 있습니다.
- 단일 또는 다중 입력을위한 버스트 변환 모드.
- 입력 핀 또는 타이머 일치 신호에서 전환시 선택적 변환.
- 두 변환기 모두에 대한 전역 시작 명령.
다른 마이크로 컨트롤러에서 ADC를 사용하는 방법도 확인하십시오.
- Arduino Uno에서 ADC를 사용하는 방법?
- ADC0808과 8051 마이크로 컨트롤러의 인터페이스
- PIC 마이크로 컨트롤러의 ADC 모듈 사용
- Raspberry Pi ADC 튜토리얼
- MSP430G2에서 ADC를 사용하는 방법-아날로그 전압 측정
- STM32F103C8에서 ADC를 사용하는 방법
ARM7-LPC2148의 ADC 핀
앞서 말했듯이 ARM7-LPC2148에는 6 개의 아날로그 입력 핀이있는 ADC0 채널과 8 개의 아날로그 입력 핀이있는 ADC1이 있습니다. 따라서 완전히 아날로그 입력을위한 14 개의 핀이 있습니다. 아래 다이어그램은 아날로그 입력에 사용할 수있는 핀을 보여줍니다.
ADC 입력 핀은 다른 GPIO 핀과 멀티플렉싱되기 때문입니다. ADC 기능을 선택하려면 PINSEL 레지스터를 구성하여 활성화해야 합니다.
아래 표는 LPC2148에서 ADC의 핀과 해당 ADC 채널 번호를 보여줍니다. AD0은 채널 0이고 AD1은 채널 1입니다.
LPC2148 핀 |
ADC 채널 번호 |
P0.28 |
AD0.1 |
P0.29 |
AD0.2 |
P0.30 |
AD0.3 |
P0.25 |
AD0.4 |
P0.4 |
AD0.6 |
P0.5 |
AD0.7 |
P0.6 |
AD1.0 |
P0.8 |
AD1.1 |
P0.10 |
AD1.2 |
P0.12 |
AD1.3 |
P0.13 |
AD1.4 |
P0.15 |
AD1.5 |
P0.21 |
AD1.6 |
P0.22 |
AD1.7 |
ARM7-LPC2148의 ADC 레지스터
레지스터는 LPC2148의 A / D 변환 기능을 사용하기위한 프로그래밍에 사용됩니다.
다음은 A / D 변환을 위해 LPC2148에서 사용되는 레지스터 목록입니다.
1. ADCR: 아날로그-디지털 제어 레지스터
사용:이 레지스터는 LPC2148에서 A / D 컨버터를 구성하는 데 사용됩니다.
2. ADGDR: 아날로그-디지털 글로벌 데이터 레지스터
용도:이 레지스터는 A / D 컨버터 용 DONE 비트를 가지며 변환 결과는 여기에 저장됩니다.
3. ADINTERN: 아날로그-디지털 인터럽트 활성화 레지스터
사용: 인터럽트 활성화 레지스터입니다.
4. ADDR0 – ADDR7: 아날로그 - 디지털 채널 데이터 레지스터
용도:이 레지스터는 각 채널에 대한 A / D 값을 포함합니다.
5. ADSTAT: 아날로그-디지털 상태 레지스터.
용도:이 레지스터는 각 ADC 채널에 대한 DONE 플래그와 각 ADC 채널에 대한 OVERRUN 플래그를 포함합니다.
이 튜토리얼에서는 ADCR 및 ADGDR 레지스터 만 사용합니다. 그들에 대해 자세히 보자
LPC2148의 ADxCR 레지스터
채널 0 및 채널 1에 대해 각각 AD0CR 및 AD1CR. 32 비트 레지스터입니다. 아래 표는 ADCR 레지스터의 비트 필드를 나타냅니다.
31:28 |
27 |
26:24 |
23:22 |
21 |
20 |
19:17 |
16 |
15: 8 |
7: 0 |
예약석 |
가장자리 |
스타트 |
예약석 |
PDN |
예약석 |
CLKS |
파열 |
CLCKDIV |
SEL |
개별 레지스터를 구성하는 방법에 대해 살펴 보겠습니다.
1. SEL: (0 ~ 7)의 비트는 ADC 변환을위한 채널을 선택하는 데 사용됩니다. 각 채널에 1 비트가 할당됩니다. 예를 들어 Bit-0을 설정하면 ADC가 변환을 위해 AD0.1을 샘플링합니다. 그리고 비트 -1을 설정하면 AD0.1이됩니다. 마찬가지로 비트 -7을 설정하면 AD0.7에 대한 변환이 수행됩니다. 중요한 단계는 PLC2148의 PORT0에 대해 PINSEL0과 같이 사용중인 포트에 따라 PINSEL이 있다는 것입니다.
2. CLCKDIV: (8에서 15)의 비트는 Clock Divisor 용입니다. 여기서 APB 클럭 (ARM 주변 버스 클럭)은 A / D 컨버터에 필요한 클럭을 생성하기 위해이 값에 1을 더한 값으로 나뉩니다. 이는 LPC2148에서 연속 근사 방법을 사용하므로 4.5MHz 이하 여야합니다.
3. BURST: 비트 16은 BURST 변환 모드에 사용됩니다.
설정 1: ADC는 SEL 비트에서 선택된 모든 채널에 대해 변환을 수행합니다.
설정 0: BURST 변환 모드를 비활성화합니다.
4. CLCKS: 연속 A / D 변환 모드이므로 버스트 모드에서 A / D 변환을위한 분해능 및 클럭 수를 선택하기 위해 (17 ~ 19) 3 비트의 비트가 사용됩니다.
비트 값 (17 ~ 19) |
비트 (정확도) |
시계 없음 |
000 |
10 |
11 |
001 |
9 |
10 |
010 |
8 |
9 |
011 |
7 |
8 |
100 |
6 |
7 |
101 |
5 |
6 |
110 |
4 |
5 |
111 |
삼 |
4 |
5. PDN: 비트 21은 LPC2148에서 ADC의 전원 차단 모드 를 선택하기위한 것 입니다.
- A / D가 PDN 모드입니다.
- A / D가 작동 모드입니다.
6. START: (24에서 26)의 비트는 START를위한 것입니다. 0을 설정하여 BURST 변환 모드가 OFF 인 경우이 START 비트는 A / D 변환을 시작할 때 유용합니다. START는 에지 제어 변환에도 사용됩니다. LPC2148의 CAP 또는 MAT 핀에 입력이있을 때 A / D가 변환을 시작합니다. 아래 표를 확인하세요
비트 값 (24 ~ 26) |
LPC2148의 핀 |
ADC의 기능 |
000 |
PDN 모드에서 ADC를 설정하는 데 사용됩니다. 시작 없음 |
|
001 |
A / D 변환 시작 |
|
010 |
CAP0.2 / MAT0.2 |
LPC2148의 CAP / MAT 핀에서 핀 27 (상승 또는 하강)에서 선택한 EDGE에서 A / D 변환 시작 |
011 |
CAP0.0 / MAT0.0 |
|
100 |
MAT0.1 |
|
101 |
MAT0.3 |
|
110 |
MAT1.0 |
|
111 |
MAT1.1 |
7. EDGE: 27 번째 비트는 EDGE 용이며 START 비트에 010-111이 포함 된 경우에만 사용됩니다. CAP 또는 MAT 입력이있을 때 변환을 시작합니다. 위 표에서 볼 수 있습니다.
설정 : 0- 하강 에지에서
1- 상승 에지에서
ADxGDR: ADC 글로벌 데이터 레지스터
ADC 채널 0 및 ADC 채널 1에 대한 AD0GDR 및 AD1GDR.
A / D 변환의 RESULT와 A / D 변환이 완료되었음을 나타내는 DONE 비트가 포함 된 32 비트 레지스터입니다. 아래 표는 ADGDR 레지스터의 비트 필드를 나타냅니다.
31 |
30 |
29:27 |
26:24 |
23:16 |
15: 6 |
5: 0 |
끝난 |
오버런 |
예약석 |
CHN |
예약석 |
결과 |
예약석 |
1. 결과: 이 비트 (6 ~ 15)에는 ADCR SEL 레지스터에서 선택한 채널에 대한 A / D 변환 결과가 포함됩니다. 값은 A / D 변환이 완료된 후에 만 읽혀지며 DONE 비트로 표시됩니다.
예: 10 비트 ADC 결과의 경우 저장된 값은 (0에서 1023)까지 다양합니다.
2. CHANNEL: 이 비트 24 ~ 26은 A / D 변환이 수행되는 채널 번호를 포함합니다. 변환 된 디지털 값은 RESULT 비트에 있습니다.
예: 000은 ADC 채널 0 용이고 001은 ADC 채널 1 용입니다.
3. OVERRUN: OVERRUN에 대한 30 번째 비트는 BURST 모드에서 사용됩니다. 1로 설정하면 이전에 변환 된 ADC 값이 새로 변환 된 ADC 값으로 덮어 쓰기됩니다. 레지스터를 읽으면 OVERRUN 비트를 지 웁니다.
4. DONE: 31 번째 비트는 DONE 비트입니다.
세트 1: A / D 변환이 완료되었을 때.
Set 0: 레지스터를 읽고 ADCR을 쓸 때.
LPC2148의 ADC에서 사용되는 중요한 레지스터에 대해 살펴 보았습니다. 이제 ARM7에서 ADC 사용을 시작하겠습니다.
필요한 구성 요소
하드웨어
- ARM7-LPC2148 마이크로 컨트롤러
- 3.3V 전압 조정기 IC
- 5V 전압 조정기 IC
- 10K 전위차계 – 2 개
- LED (모든 색상)
- LCD 디스플레이 (16X2)
- 9V 배터리
- 브레드 보드
- 전선 연결
소프트웨어
- Keil uVision5
- Magic Flash 도구
회로도
아래 표 는 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) |
ARM 7 – LPC2148에서 LCD를 사용하는 방법에 대해 자세히 알아보십시오.
중요: 여기서는 5V LCD 디스플레이 용 전압 레귤레이터 IC 2 개와 전위차계로 변경할 수있는 아날로그 입력 용 3.3V를 사용합니다.
LCD 및 ARM7 스틱이있는 5V 전압 조정기 간 연결
5V 전압 조정기 IC |
핀 기능 |
LCD 및 ARM-7 LPC2148 |
1. 왼쪽 핀 |
+ 배터리 9V 입력에서 Ve |
체크 안함 |
2. 센터 핀 |
-배터리에서 Ve |
VSS, R / W, K LCD ARM7의 GND |
3. 오른쪽 핀 |
조정 된 + 5V 출력 |
LCD의 VDD, A ARM7의 + 5V |
LCD가있는 전위차계
전위차계는 LCD 디스플레이의 대비를 변경하는 데 사용됩니다. 포트에는 3 개의 핀이 있는데 왼쪽 핀 (1)은 + 5V에 연결되고 가운데 (2)는 LCD 모듈의 VEE 또는 V0에 연결되고 오른쪽 핀 (3)은 GND에 연결됩니다. 노브를 돌려 대비를 조정할 수 있습니다.
3.3V 전압 레귤레이터가있는 LPC2148과 전위차계 간의 연결
3.3V 전압 조정기 IC |
핀 기능 |
ARM-7 LPC2148 |
1. 왼쪽 핀 |
-배터리에서 Ve |
GND 핀 |
2. 센터 핀 |
조정 된 + 3.3V 출력 |
전위차계 입력 및 전위차계의 출력을 P0.28로 |
3. 오른쪽 핀 |
+ 배터리 9V 입력에서 Ve |
체크 안함 |
ADC 용 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을 사용하여 프로그래밍하십시오.
이 튜토리얼에서는 LPC2148에서 ADC를 사용하여 아날로그 입력 전압 (0 ~ 3.3V)을 디지털 값으로 변환하고 LCD 디스플레이 (16x2)에 아날로그 전압을 표시합니다. 전위차계는 입력 아날로그 전압을 변경하는 데 사용됩니다.
ARM7-LPC2148 4 비트 모드와 LCD 인터페이스에 대한 자세한 내용은이 링크를 참조하십시오.
ARM 7 ADC를 사용하는 전체 코드는 여기에 우리가 그것의 몇 부분을 설명하는이 튜토리얼의 끝에 제공됩니다.
LPC2148-ADC 프로그래밍에 관련된 단계
1. PINSEL 레지스터 는 LPC2148의 포트 핀을 선택하고 ADC 기능을 아날로그 입력으로 사용합니다.
PINSEL1 = 0x01000000; // AD0.1로 P0.28 선택
2. ADxCR (ADC 제어 레지스터)에 값을 기록하여 변환 할 클럭 및 비트 정확도를 선택합니다.
AD0CR = 0x00200402; // 변환을 위해 ADC 동작을 10 비트 / 11 CLK로 설정 (000)
3. ADxCR의 START 비트에 값을 기록하여 변환을 시작합니다.
여기서는 AD0CR 레지스터의 24 번째 비트에 썼습니다.
AD0CR = AD0CR-(1 << 24);
4. 이제 0에서 1로 변경되는 해당 ADxDRy (ADC 데이터 레지스터)의 DONE 비트 (31 번째)를 확인합니다. 따라서 데이터 레지스터의 31 번째 비트에서 변환이 이루어 졌는지 지속적으로 확인하기 위해 while 루프를 사용 합니다.
while (! (AD0DR1 & 0x80000000));
5. 완료 비트가 1로 설정되면 변환이 성공한 다음 동일한 ADC 데이터 레지스터 AD0DR1에서 결과를 읽고 값을 변수에 저장합니다.
adcvalue = AD0DR1;
우리라는 변수에 저장 전압을 디지털 값으로 변환하는 공식을 사용하여 다음으로 전압 .
전압 = ((adcvalue / 1023.0) * 3.3);
5. 다음 줄은 아날로그에서 디지털로 변환 한 후 디지털 값 (0 ~ 1023)을 표시하는 데 사용됩니다.
adc = adcvalue; sprintf (displayadc, "adcvalue = % f", adc); LCD_DISPLAY (displayadc); // ADC 값 표시 (0 ~ 1023)
6. 다음 라인은 아날로그에서 디지털로 변환 한 후 5 단계 이후에 입력 아날로그 전압 (0 ~ 3.3V)을 표시하는 데 사용됩니다.
LCD_SEND (0xC0); sprintf (voltvalue, "전압 = %. 2f V", 전압); LCD_DISPLAY (볼트 값); // 디스플레이 (아날로그 전압 입력)
7. 이제 LCD 디스플레이에 입력 전압과 디지털 값을 표시해야합니다. 그 전에 LCD 디스플레이를 초기화하고 디스플레이에 메시지를 보내기 위해 적절한 명령을 사용해야합니다.
아래 코드는 LCD를 초기화하는 데 사용됩니다.
void LCD_INITILIZE (void) // LCD를 준비하는 기능 { IO0DIR = 0x0000FFF0; //P0.12,P0.13,P0.14,P0.15,P0.4,P0.6 핀을 OUTPUT으로 설정 delay_ms (20); LCD_SEND (0x02); // 4 비트 동작 모드로 LCD 초기화 LCD_SEND (0x28); // 2 줄 (16X2) LCD_SEND (0x0C); // 커서를 벗어난 커서에 표시 LCD_SEND (0x06); // 커서 자동 증가 LCD_SEND (0x01); // 클리어 LCD_SEND (0x80); // 첫 줄 첫 번째 위치 }
아래 코드는 LCD에 값을 표시하는 데 사용됩니다.
문자를 인쇄하는 공극 LCD_DISPLAY (* CHAR MSG) // 함수 하나씩 전송 { I = 0 uint8_t; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF)-((msg & 0xF0) << 8)); // 상단 니블 전송 IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH to print data IO0CLR = 0x00000020; // RW LOW 쓰기 모드 delay_ms (2); IO0CLR = 0x00000040; // EN = 0, RS 및 RW 변경되지 않음 (즉, RS = 1, RW = 0) delay_ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF)-((msg & 0x0F) << 12)); // 하단 니블 전송 IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; 지연 _ms (2); IO0CLR = 0x00000040; 지연 _ms (5); i ++; } }
아래 기능은 지연 을 생성하는 데 사용됩니다.
void delay_ms (uint16_t j) // 밀리 초 단위로 지연시키는 함수 { uint16_t x, i; for (i = 0; i
데모 비디오 가 포함 된 전체 코드 는 다음과 같습니다.