- ADC (아날로그-디지털 변환) 란?
- AVR 마이크로 컨트롤러 Atmega16의 ADC
- 필요한 구성 요소
- 회로도
- Atmega16에서 ADC 제어 레지스터 설정
- ADC 용 Atmega16 프로그래밍
거의 모든 임베디드 애플리케이션에서 사용되는 공통 기능 중 하나는 ADC 모듈 (아날로그-디지털 컨버터)입니다. 이 아날로그-디지털 변환기 는 온도 센서, 기울기 센서, 전류 센서, 플렉스 센서 등과 같은 아날로그 센서에서 전압을 읽을 수 있습니다.이 튜토리얼에서는 ADC 란 무엇이며 Atmega16에서 ADC를 사용하는 방법을 배웁니다. 이 튜토리얼은 작은 전위차계를 Atmega16의 ADC 핀에 연결하는 것을 포함하며 8 개의 LED는 ADC 입력 값의 변화에 따른 ADC 출력 값의 변화하는 전압을 표시하는 데 사용됩니다.
이전에는 다른 마이크로 컨트롤러의 ADC에 대해 설명했습니다.
- ARM7 LPC2148에서 ADC를 사용하는 방법-아날로그 전압 측정
- STM32F103C8에서 ADC를 사용하는 방법-아날로그 전압 측정
- MSP430G2에서 ADC를 사용하는 방법-아날로그 전압 측정
- Arduino Uno에서 ADC를 사용하는 방법?
- MPLAB 및 XC8과 함께 PIC 마이크로 컨트롤러의 ADC 모듈 사용
ADC (아날로그-디지털 변환) 란?
ADC는 Analog to Digital Converter를 의미합니다. 전자 제품에서 ADC는 전류 및 전압과 같은 아날로그 신호를 디지털 코드 (이진 형식)로 변환하는 장치입니다. 실제 세계에서 대부분의 신호는 아날로그이며 모든 마이크로 컨트롤러 또는 마이크로 프로세서는 바이너리 또는 디지털 언어 (0 또는 1)를 이해합니다. 따라서 마이크로 컨트롤러가 아날로그 신호를 이해하게하려면 이러한 아날로그 신호를 디지털 형식으로 변환해야합니다. ADC는 우리를 위해 정확히 이것을합니다. 다양한 애플리케이션에 사용할 수있는 많은 유형의 ADC가 있습니다. 인기있는 ADC는 플래시, 연속 근사 및 시그마-델타입니다.
가장 저렴한 유형의 ADC는 연속 근사화이며이 자습서에서는 연속 근사화 ADC가 사용됩니다. 연속 근사 유형의 ADC에서 일련의 디지털 코드는 각각 고정 아날로그 레벨에 해당하며 연속적으로 생성됩니다. 내부 카운터는 변환중인 아날로그 신호와 비교하는 데 사용됩니다. 아날로그 레벨이 아날로그 신호보다 더 커지면 생성이 중지됩니다. 아날로그 레벨에 해당하는 디지털 코드는 아날로그 신호의 원하는 디지털 표현입니다. 이것으로 연속 근사에 대한 작은 설명을 마칩니다.
ADC에 대해 자세히 알아 보려면 ADC에 대한 이전 자습서를 참조하십시오. ADC는 IC 형태로 제공되며 마이크로 컨트롤러는 현재 내장 ADC와 함께 제공됩니다. 이 튜토리얼에서는 Atmega16의 내장 ADC를 사용 합니다. Atmega16의 내장 ADC에 대해 논의 해 보겠습니다.
AVR 마이크로 컨트롤러 Atmega16의 ADC
Atmega16에는 10 비트 및 8 채널 ADC가 내장되어 있습니다. 10 비트는 입력 전압이 0-5V이면 10 비트 값으로 분할됩니다. 즉, 1024 레벨의 개별 아날로그 값 (2 10 = 1024) 으로 분할됩니다. 이제 8 채널 은 각 핀이 아날로그 전압을 읽을 수있는 Atmega16의 전용 ADC 핀 8 개에 해당합니다. 완전한 PortA (GPIO33-GPIO40)는 ADC 작동 전용입니다. 기본적으로 PORTA 핀은 일반 IO 핀이며 포트 핀이 다중화되었음을 의미합니다. 이러한 핀을 ADC 핀으로 사용하려면 ADC 제어 전용 특정 레지스터를 구성해야합니다. 이것이 레지스터가 ADC 제어 레지스터로 알려진 이유입니다. 내장 된 ADC의 기능을 시작하기 위해 이러한 레지스터를 설정하는 방법에 대해 논의하겠습니다.
Atmega16의 ADC 핀
필요한 구성 요소
- Atmega16 마이크로 컨트롤러 IC
- 16Mhz 수정 발진기
- 2 개의 100nF 커패시터
- 2 개의 22pF 커패시터
- 누름 단추
- 점퍼 와이어
- 브레드 보드
- USBASP v2.0
- Led (모든 색상)
회로도
Atmega16에서 ADC 제어 레지스터 설정
1. ADMUX 레지스터 (ADC 멀티플렉서 선택 레지스터) :
ADMUX 레지스터는 ADC 채널 선택 및 기준 전압 선택을위한 것입니다. 아래 그림은 ADMUX 레지스터의 개요를 보여줍니다. 설명은 아래에 설명되어 있습니다.
- 비트 0-4: 채널 선택 비트.
MUX4 |
MUX3 |
MUX2 |
MUX1 |
MUX0 |
ADC 채널 선택 |
0 |
0 |
0 |
0 |
0 |
ADC0 |
0 |
0 |
0 |
0 |
1 |
ADC1 |
0 |
0 |
0 |
1 |
0 |
ADC2 |
0 |
0 |
0 |
1 |
1 |
ADC3 |
0 |
0 |
1 |
0 |
0 |
ADC4 |
0 |
0 |
1 |
0 |
1 |
ADC5 |
0 |
0 |
1 |
1 |
0 |
ADC6 |
0 |
0 |
1 |
1 |
1 |
ADC7 |
- Bit-5: 결과를 오른쪽 또는 왼쪽으로 조정하는 데 사용됩니다.
ADLAR |
기술 |
0 |
결과를 오른쪽 조정 |
1 |
결과를 왼쪽 조정 |
- 비트 6-7: ADC의 기준 전압을 선택하는 데 사용됩니다.
REFS1 |
REFS0 |
전압 레퍼런스 선택 |
0 |
0 |
AREF, 내부 Vref 꺼짐 |
0 |
1 |
AREF 핀에 외부 커패시터가있는 AVcc |
1 |
0 |
예약석 |
1 |
1 |
AREF 핀에서 외부 커패시터가있는 내부 2.56 기준 전압 |
이제 내부 ADC를 읽고 PORTC의 모든 핀으로 출력하도록 프로그램에서 이러한 레지스터 비트를 구성하기 시작합니다.
ADC 용 Atmega16 프로그래밍
전체 프로그램은 다음과 같습니다. JTAG 및 Atmel studio를 사용하여 Atmega16에서 프로그램을 레코딩하고 전위차계를 회전하여 ADC 값을 변경합니다. 여기서 코드는 한 줄씩 설명됩니다.
ADC 변환 된 값을 읽는 하나의 함수를 만드는 것부터 시작하십시오. 그런 다음 ADC_read 함수 에서 채널 값을 'chnl' 로 전달 합니다.
unsigned int ADC_read (unsigned char chnl)
ADC 채널이 8 개뿐이므로 채널 값은 0에서 7 사이 여야합니다.
chnl = chnl & 0b00000111;
ADMUX 레지스터에 '40', 즉 '01000000'을 써서 아날로그 입력이 디지털 변환을 위해 연결되는 ADC0으로 PORTA0을 선택했습니다.
ADMUX = 0x40;
이제이 단계는 ADC 변환 프로세스를 포함합니다. 여기서 ADCSRA 레지스터의 ADSC 비트에 ONE을 쓰면 변환이 시작됩니다. 그 후 변환이 완료되면 ADIF 비트가 값을 반환 할 때까지 기다립니다. ADCSRA 레지스터의 ADIF Bit에 '1'을 써서 변환을 중지합니다. 변환이 완료되면 ADC 값을 반환합니다.
ADCSRA-= (1 <
여기서 내부 ADC 기준 전압은 REFS0 비트를 설정하여 선택됩니다. 그 후 ADC를 활성화하고 프리스케일러를 128로 선택합니다.
ADMUX = (1 <
이제 ADC 값을 저장하고 PORTC로 보냅니다. PORTC에는 8 개의 LED가 연결되어 디지털 출력을 8 비트 형식으로 표시합니다. 우리가 보여준 예는 하나의 1K 포트를 사용하여 0V에서 5V 사이의 전압을 변경합니다.
나는 = ADC_read (0); PORTC = i;
Digital Multimeter는 ADC 핀에 아날로그 입력 전압을 표시하는 데 사용되며 8 개의 LED는 ADC 출력의 해당 8 비트 값을 표시하는 데 사용됩니다. 포텐쇼미터를 돌리면 멀티 미터와 빛나는 LED에서 해당 결과를 볼 수 있습니다.
완전한 코드와 작업 비디오가 아래에 나와 있습니다.