이것은 MPLAB 및 XC8을 사용하는 PIC 마이크로 컨트롤러 학습에 대한 9 번째 튜토리얼입니다. 지금까지 MPLABX 시작하기, PIC로 LED 깜박임, PIC의 타이머, LCD 인터페이스, 7 세그먼트 인터페이스 등과 같은 많은 기본 자습서를 다루었습니다. 완전 초보자 인 경우 여기에서 PIC 자습서의 전체 목록을 방문하십시오. 학습을 시작하십시오.
이 튜토리얼에서는 PIC 마이크로 컨트롤러 PICF877A와 함께 ADC를 사용 하는 방법을 배웁니다.. 대부분의 마이크로 컨트롤러 프로젝트에는 실제 세계에서 데이터를 읽는 데 가장 많이 사용되는 방법 중 하나이기 때문에 ADC (Analog to Digital converter)가 포함됩니다. 온도 센서, 플럭스 센서, 압력 센서, 전류 센서, 전압 센서, 자이로 스코프, 가속도계, 거리 센서 및 거의 모든 알려진 센서 또는 변환기와 같은 거의 모든 센서는 센서 판독 값을 기반으로 0 ~ 5V의 아날로그 전압을 생성합니다. 예를 들어 온도 센서는 온도가 25C 일 때 2.1V를 출력하고 온도가 60C 일 때 4.7까지 올라갈 수 있습니다. 실제 온도를 알기 위해 MCU는이 온도 센서의 출력 전압을 읽고이를 실제 온도와 연결하면됩니다. 따라서 ADC는 MCU 프로젝트에 중요한 작업 도구이며 PIC16F877A에서이를 사용하는 방법을 배울 수 있습니다.
다른 마이크로 컨트롤러에서 ADC를 사용하는 방법에 대한 이전 기사도 확인하십시오.
- Arduino Uno에서 ADC를 사용하는 방법?
- Raspberry Pi ADC 튜토리얼
- ADC0808과 8051 마이크로 컨트롤러의 인터페이스
PIC 마이크로 컨트롤러 PIC16F877A의 ADC:
다양한 유형의 ADC를 사용할 수 있으며 각 ADC에는 자체 속도와 해상도가 있습니다. 가장 일반적인 유형의 ADC는 플래시, 연속 근사 및 시그마-델타입니다. PIC16F877A에 사용되는 ADC의 형태는 연속 근사 ADC라고한다 짧은 또는 SAR. 그래서 우리가 그것을 사용하기 전에 SAR ADC에 대해 조금 배워 봅시다.
연속 근사 ADC: SAR ADC는 비교기와 일부 논리 대화를 통해 작동합니다. 이 유형의 ADC는 기준 전압 (가변)을 사용하고 비교기를 사용하여 입력 전압을 기준 전압과 비교하며 디지털 출력이 될 차이는 MSB (Most Significant Bit)에서 저장됩니다. 비교 속도는 PIC가 작동하는 클럭 주파수 (Fosc)에 따라 다릅니다.
이제 ADC에 대한 몇 가지 기본 사항을 알았으므로 데이터 시트를 열고 PIC16F877A MCU에서 ADC를 사용하는 방법을 알아 보겠습니다. 우리가 사용하는 PIC에는 10 비트 8 채널 ADC가 있습니다. 즉, ADC의 출력 값은 0-1024 (2 ^ 10)이고 MCU에는 아날로그 전압을 읽을 수있는 8 개의 핀 (채널)이 있습니다. 우리의 ADC가 10 비트이기 때문에 1024 값은 2 ^ 10에 의해 얻어집니다. 아날로그 전압을 읽을 수있는 8 개의 핀이 데이터 시트에 언급되어 있습니다. 아래 그림을 보시죠.
아날로그 채널 AN0 ~ AN7이 강조 표시됩니다. 이 핀만 아날로그 전압을 읽을 수 있습니다. 따라서 입력 전압을 읽기 전에 코드에서 입력 전압을 읽는 데 사용해야하는 채널을 지정해야합니다. 이 자습서에서는 전위차계와 함께 채널 4를 사용하여이 채널에서 아날로그 전압을 읽습니다.
A / D 모듈에는 입력 핀에서 데이터를 읽도록 구성해야하는 4 개의 레지스터가 있습니다. 이러한 레지스터는 다음과 같습니다.
• A / D 결과 상위 레지스터 (ADRESH)
• A / D 결과 하위 레지스터 (ADRESL)
• A / D 제어 레지스터 0 (ADCON0)
• A / D 제어 레지스터 1 (ADCON1)
ADC 프로그래밍:
PIC 마이크로 컨트롤러와 함께 ADC를 사용 하는 프로그램 은 매우 간단합니다.이 4 개의 레지스터를 이해하면 아날로그 전압을 읽는 것이 간단합니다. 평소와 같이 구성 비트를 초기화하고 void main () 부터 시작하겠습니다 .
void main () 내부에서 ADCON1 레지스터와 ADCON0 레지스터를 사용하여 ADC를 초기화 해야 합니다. ADCON0 레지스터에는 다음 비트가 있습니다.
이 레지스터에서 ADON = 1로 만들어 ADC 모듈을 켜고 ADCS1 및 ADCS0 비트를 사용하여 A / D 변환 클록을 켜야합니다. 나머지는 지금은 설정되지 않습니다. 우리 프로그램에서 A / D 변환 클럭은 Fosc / 16으로 선택되어 사용자 자신의 주파수를 시도하고 결과가 어떻게 변하는 지 볼 수 있습니다. 자세한 내용은 데이터 시트의 127 페이지에서 확인할 수 있습니다. 따라서 ADCON0은 다음과 같이 초기화됩니다.
ADCON0 = 0b01000001;
이제 ADCON1 레지스터에는 다음 비트가 있습니다.
이 레지스터에서 우리는 A / D Result Format Select bit를 ADFM = 1로 high로 만들고 ADCS2 = 1로 만들어 Fosc / 16을 다시 선택해야합니다. 내부 기준 전압을 사용할 계획이므로 다른 비트는 0으로 유지됩니다. 자세한 내용은 데이터 시트 128 페이지에서 확인할 수 있습니다. 따라서 ADCON1은 다음과 같이 설정합니다.
ADCON1 = 0x11000000;
이제 우리의 주요 기능 내에서 ADC 모듈을 초기화 한 후 while 루프로 들어가 ADC 값 읽기를 시작합니다. ADC 값을 읽으려면 다음 단계를 따라야 합니다.
- ADC 모듈 초기화
- 아날로그 채널 선택
- Go / Done 비트를 높게 설정하여 ADC 시작
- Go / DONE 비트가 낮아질 때까지 기다립니다.
- ADRESH 및 ADRESL 레지스터에서 ADC 결과 가져 오기
1. ADC 모듈 초기화: 이미 ADC 초기화 방법을 배웠으므로 아래 함수를 호출하여 ADC를 초기화합니다.
공극 ADC_Initialize () 함수는 다음과 같이 될 것이다.
무효 ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON 및 Fosc / 16이 선택됨 ADCON1 = 0b11000000; // 내부 기준 전압이 선택됨}
2. 아날로그 채널을 선택합니다. 이제 ADC 값을 읽는 데 사용할 채널을 선택해야합니다. 이것에 대한 함수를 만들어서 while 루프 내부의 각 채널 사이를 쉽게 이동할 수 있습니다.
unsigned int ADC_Read (unsigned char channel) {// **** 채널 선택 ** /// ADCON0 & = 0x11000101; // 채널 선택 비트 지우기 ADCON0-= channel << 3; // 필요한 비트 설정 // ** 채널 선택 완료 *** ///}
그러면 선택할 채널이 가변 채널 내에서 수신됩니다. 라인에서
ADCON0 & = 0x1100101;
이전 채널 선택 (있는 경우)이 지워집니다. 이는 비트 및 연산자 "&"를 사용하여 수행됩니다. 비트 3, 4 및 5는 강제로 0이되고 나머지 비트는 이전 값으로 유지됩니다.
그런 다음 채널 번호를 세 번 왼쪽으로 이동하고 비트 또는 연산자 "-"를 사용하여 비트를 설정하여 원하는 채널을 선택합니다.
ADCON0-= 채널 << 3; // 필요한 비트 설정
3. Go / Done 비트를 하이로 만들어 ADC 시작: 채널이 선택되면 GO_nDONE 비트를 하이 로 만들어 ADC 변환을 시작해야합니다.
GO_nDONE = 1; // A / D 변환 초기화
4. Go / DONE 비트가 낮아질 때까지 기다립니다. GO / DONE 비트는 ADC 변환이 완료 될 때까지 높게 유지되므로이 비트가 다시 낮아질 때까지 기다려야합니다. 이것은 while 루프 를 사용하여 수행 할 수 있습니다.
while (GO_nDONE); // A / D 변환이 완료 될 때까지 기다립니다.
5. ADRESH 및 ADRESL 레지스터에서 ADC 결과를 가져옵니다. Go / DONE 비트가 다시 낮아지면 ADC 변환이 완료된 것입니다. ADC의 결과는 10 비트 값이됩니다. MCU는 8 비트 MCU이므로 결과는 상위 8 비트와 하위 2 비트로 나뉩니다. 상위 8 비트 결과는 레지스터 ADRESH에 저장되고 하위 2 비트는 레지스터 ADRESL에 저장됩니다. 따라서 10 비트 ADC 값을 얻으려면 레지스터에이 값을 더해야합니다. 이 결과는 아래와 같이 함수에 의해 반환됩니다.
반환 ((ADRESH << 8) + ADRESL); // 결과 반환
ADC 채널을 선택하고 ADC를 트리거하고 결과를 반환하는 데 사용되는 전체 기능이 여기에 표시됩니다.
unsigned int ADC_Read (unsigned char channel) {ADCON0 & = 0x11000101; // 채널 선택 비트 지우기 ADCON0-= channel << 3; // 필요한 비트 설정 __delay_ms (2); // 홀드 커패시터를 충전하기위한 획득 시간 GO_nDONE = 1; // A / D 변환 초기화 while (GO_nDONE); // A / D 변환이 완료 될 때까지 기다립니다. return ((ADRESH << 8) + ADRESL); // 결과 반환}
이제 채널 선택을 입력으로 받아 ADC 값을 반환하는 기능이 있습니다. 따라서이 튜토리얼에서는 채널 4에서 아날로그 전압을 읽고 있으므로 while 루프 내에서이 함수를 직접 호출 할 수 있습니다. 함수 호출은 다음과 같습니다.
나는 = (ADC_Read (4)); // "i"에 adc의 결과를 저장합니다.
ADC의 출력을 시각화하려면 LCD 또는 7 세그먼트와 같은 일종의 디스플레이 모듈이 필요합니다. 이 튜토리얼에서는 출력을 확인하기 위해 7 세그먼트 디스플레이를 사용합니다. 그림과 함께 7 세그먼트를 사용하는 방법을 알고 싶다면 여기 튜토리얼을 따르십시오.
전체 코드는 아래에 주어진 그 과정도 설명되어 비디오 마지막에.
하드웨어 설정 및 테스트:
일반적으로 하드웨어를 사용하기 전에 Proteus를 사용하여 코드를 시뮬레이션하면 프로젝트 의 회로도가 아래에 나와 있습니다.
4 자리 7 세그먼트 디스플레이 모듈과 PIC 마이크로 컨트롤러의 연결은 이전 프로젝트와 동일합니다. 방금 아날로그 채널 4 인 핀 7에 전위차계를 추가했습니다. 포트를 변경하면 가변 전압이 MCU로 전송됩니다. ADC 모듈에서 읽고 7- 세그먼트 디스플레이 모듈에 표시됩니다. 4 자리 7 세그먼트 디스플레이 및 PIC MCU와의 인터페이스에 대해 자세히 알아 보려면 이전 자습서를 확인하십시오.
여기서는 LED 깜박임 자습서에서 만든 것과 동일한 PIC 마이크로 컨트롤러 보드 를 사용했습니다. 연결을 확인한 후 프로그램을 PIC에 업로드하면 다음과 같은 출력이 표시됩니다.
여기서 우리는 포트에서 ADC 값을 읽고 0-1024 출력을 0-5 볼트로 매핑하여 실제 전압으로 변환했습니다 (프로그램에 표시됨). 그런 다음 값이 7 세그먼트에 표시되고 멀티 미터를 사용하여 확인됩니다.
이제 우리는 시장에서 사용 가능한 모든 아날로그 센서를 사용할 준비가되었습니다. 계속해서 시도해보십시오. 평소처럼 문제가 발생하면 의견 섹션을 사용하여 기꺼이 도와 드리겠습니다.