본문 바로가기
대한상공회의소 스마트팩토리 교육/IoT 디바이스 개발

[IoT 디바이스 개발] AVR(ATmega128A)«수업-11» : 아날로그-디지털 변환

by 나는영하 2022. 2. 14.

※ 주의사항 

본 블로그는 수업 내용을 바탕으로 제가 이해한 부분을 정리한 블로그입니다.
본 내용을 참고로만 보시고, 틀린 부분이 있다면 지적 부탁드립니다!

감사합니다😁

 

안녕하세요!!

오늘은 아래와 같은 내용을 확인해보겠습니다.

 

아날로그-디지털 변환(ADC)

ADC(ADCH + ADCL) 레지스터

ADMUX 레지스터

ADCSRA 레지스터

A/D 컨버터 제어 실습


1. ADC(Analog to Digital Converter)

1) ADC는 연속적인 신호인 아날로그 신호를 부호화된 디지털 신호로 변화하는 일이다.

아날로그 디지털 변환을 수행하는 기계 장치를 아날로그 디지털 변환기라고 하는데 이 장치는 온도, 압력, 음성, 영상 신호, 전압 등의 실생활에서 연속적으로 측정되는 신호를 컴퓨터에 입력하여 디지털화 시키는 장치이다.

ADC 블록 다이어그램

2) ADC 구성

(1) 범용 PORT F의 특수 기능

 - ADC0 ~ ADC7 : 8채널 10비트 A/D 컨버터의 아날로그 입력 단자

(2) ADC 정확도 성능 향상을 위한 독립 전원 구성

 - AVCC : Analog Supply Voltage ( VCC의 전압의 ±0.3V 유지해야 한다.)

 - AGND : Analog Ground (반드시 GND와 연결) 

 - AREF : Analog Reference Voltage

(3) 입력 전압의 범위

 - 일반 모드 입력전압의 범위 (0V ~ Vref)

 - 차동입력 모드 입력전압의 범위 (-Vref ~ +Vref)

(4) Vref의 범위

 - 전원전압 Vcc를 초과할 수 없다.

(Vref = VGND ~ VCC, 내부기준전압 2.56V)

 

3) ADC 동작

(1) ADC 동작 모드 

 - 단일 변환 모드 : ADC 동작을 한번만 수행

 - 프리 런닝 코드 : ADC 동작을 반복적으로 수행

(2) ADC 초기화 설정 (레지스터내 비트)

 - ADC 활성화 : ADEN = 1

 - ADC 클록 설정 : ADPS 2~0

 - ADC 기준 전압 설정 : REFS 1~0

 - ADC 입력 채널 설정 : MUX 4~0

 - ADC 동작 모드 설정 : ADFR

 - ADC 변환 완료 인터럽트 활성화 : ADIE

(3) ADC 스타트

 - ADC 시작 신호 : ADSC

 

 

 


 

2. ADC 관련 레지스터

2-1. ADC(ADCH + ADCL) 레지스터

- AD 변환한 디지털 데이터를 저장하는 레지스터이다.

- ATmega128A의 ADC는 10비트 해상도이지만 레지스터는 총 8비트 이므로 2개의 레지스터에 나누어서 저장된다.

- ADCH와 ADCL 레지스터의 총 16비트중 6비트는 사용되지 않는데, 데이터를 정렬하는 방식에따라 버려지는 비트의 위치가 달라진다. (왼쪽 정렬은 ADCL의 0 ~ 5비트가 버려지고, 오른쪽 정렬은 ADCH의 2 ~ 7비트가 버려진다.)

ADCH 레지스터 구조
ADCL 레지스터 구조

※ 오른쪽 정렬을 사용할경우에는 상위 6비트가 버려져서 프로그래밍 하는데 크게 상관없지만 왼쪽 정렬의 경우 하위비트 6비트가 버려지기 때문에 비트를 왼쪽으로 6개 이동해야하는 번거로움은 있다.

 

2-2. ADMUX 레지스터

ADMUX 레지스터는 AD변환을 위한 기준 전압과 입력 채널을 선택하기 위해 사용된다.

ADMUX 레지스터 구조

1) REFS1, REFS0 비트 (6, 7번 비트)

- AD변환의 기준 전압을 선택하기 위해 사용하는 비트

REFS0~1 비트별 기준 전압

- 수업 실습에서는 USB를 통해 VCC를 입력 받기 때문에 주로 비트를 01로 세트해서 사용한다.

 

2) ADLAR 비트 (5번 비트)

- 변환된 디지털 데이터의 저장 방법을 설정하기 위해 사용되는 비트

- 1로 세트할 경우 왼쪽정렬로 사용 되며, Default 값은 0에 해당된다.(오른쪽 정렬이 사용하기 편함!!)

 

3) MUX 0 ~ 4 비트 (0 ~ 4번 비트)

- ADC 입력으로 가해지는 전압을 선택하기 위해 사용되는 비트

MUX 0~4 비트 설정에 따른 단일입력

- ATmega128A는 단일 입력 및 차동 입력을 지원한다.

- 위의 표는 ADC 입력중 단일입력에 해당되는 값 만을 나타내며 차동입력은 01000부터 11101까지 해당된다.

11110은 전압값 1.23V를 입력하는 비트고 11111은 0V(GND)값을 입력하는 비트에 해당된다.

 

※ 단일 입력 및 차동 입력 이란???

- 단일 입력 : 신호의 크기를 접지(GND)와 비교하여 측정한다.

단일 입력의 경우 잡음이 들어오면 잡음이 그대로 ADC에 반영된다.

또한, ADC 변환후 디지털 값의 0에 해당되는 아날로그 전압은 항상 0V 이다.

 

- 차동 입력 : 2개의 입력 핀(+,-)으로 신호를 입력받아 이들의 차이를 ADC의 입력으로 받아 들인다.

차동 입력의 경우 2개의 입력에 잡음이 공통으로 들어오면 잡음이 상쇄되는 효과를 얻을 수 있다.

또한, ADC 변환후 디지털 값의 0에 해당되는 아날로그 전압은 입력되는 신호에 따라 달라진다. 

- ATmega128A에서 ADC 채널은 8개가 있지만 한개의 멀티플렉서에 연결되어 있기 때문에 한번에 다채널 동작은 불가능하다. 따라서 다채널의 ADC 프로그래밍을 할 시 ADMUX 레지스터에서 해당되는 채널을 선택하고 ADCSRA 레지스터를 통해 AD변환을 수행한다. 그리고 다음 채널로 변경하고 또다시 AD변환을 수행하는 코드를 짜주어야 한다. (자세한 설명은 3-1의 코드에서 하겠습니다.🤣)

2-3. ADCSRA 레지스터

- AD 변환의 상태를 나타내거나 AD 변환 과정을 제어하기 위해 사용된다.

ADCSRA 레지스터

1) ADEN 비트(7번 비트)

- ADC를 활성화 하는 비트이다.

- Default 값은 0으로 ADC가 사용이 불가능 한 상태에서 시작되고, ADC를 사용하기 위해서는 반드시 1로 세트해 주어야 한다.

2) ADSC 비트 (ADc Start Conversion, 6번 비트)

- AD변환을 시작하는 비트로 단일 변환 모드에서는 각 변환을 시작하기 위해, 프리러닝 모드에서는 첫번째 변환을 시작하기 위해 사용 된다.

3) ADFR 비트 (5번 비트)

- 1 : 프리러닝 모드, 0 : 단일 변환 모드 설정 (Default 값은 0)

4) ADIF 비트 (4번 비트) 

- AD 변환이 종료되고 데이터 레지스트가 업데이트 되면 1로 세트된다.

5) ADPS2~0 비트 (0 ~ 2번 비트)

- ADC 변환에 사용되는 클록을 생성하기 위한 분주율을 설정하기 위해 사용된다.

- 분주율이란 16Mhz 시스템 클록을 얼마의 값으로 나누어서 ADC 클록으로 사용할 것인지를 나타내는 것이다.

- AD채널이 여러개면 분주율을 줄여주는 것이 좋다.

- ADC에 공급하는 클록은 50~200Khz 범위를 추천하며, 3-1 코드 에서는 ATmega128에서는 16000000 / 128 = 125Khz의 클록을 ADC에 공급하고 있다. (즉, 0~2번 비트 111로 세트 / ADCSRA |= 0X07)

 


 

3. ADC 제어 실습

3-1. 가변저항 읽어서 LED 8개 제어

1) LED 및 가변저항 회로 결선

- PORT A : 8개 LED 결선 ( 220옴 저항 사용)

- PORT F - 0 : ADC 0번 채널에 가변저항 연결, 가변저항의 값(Analog)을 받아서 LED 출력 제어용

 

2) 코드 설명

- Line 14 ~ 23 : ADC 설정 및 초기화 함수부

ADC 채널을 다채널로 이용할 경우(센서를 여러개 사용할 경우) 본 함수는 채널이 바뀔때 마다 호출해야 한다.

- Line 25 ~ 29 : ADC를 통해 데이터가 버퍼에 들어왔는지 확인 후 리턴해주는 함수부

ADC 채널을 통해 아날로그 값이 ADC 레지스터에 업데이트 되면 ADIF 비트 값이 1로 세트된다.

- Line 41 : 가변저항이 연결되어있는 ADC 0번 채널로 선택하고 각종 AD 관련 설정을 해준다.

- Line 45 : ADC채널로 통해 들어온 데이터를 read 변수에 저장한다.

- Line 50 ~ 57 : 데이터 값에 따라 PORT A에 연결되어 있는 LED의 점등 개수를 변경한다.

 

3) 동작 확인

실습영상

- 가변저항의 값을 읽어서 가변 저항의 값에 따라 LED가 점등되는 갯수가 달라진다.

 

3-2. 포토 센서 및 릴레이 적용하여 LED 제어

1) 포토 센서 및 릴레이 회로 결선

- 포토센서는 PORTF-1에 연결해서 포토센서의 데이터 입력 값(Analog)을 받아서 ADC를 통해 Digital 값으로 변환한다.

- 릴레이는 PORTC-0에 연결해서 PORTC의 0번 핀을 출력했을때 릴레이가 동작할 수 있도록 설정한다.

(릴레이 동작은 ADC에 관련된 예제보단 UART 통신에 관련된 예제에 더 가까운것 같습니다. 하지만 일단 포함해서 본 실습에 적용해 보았습니다.😁)

 

- 릴레이는 지난 PLC 시간에 배운 스위치 제어장치로서,

릴레이가 여자되면 릴레이 내부의 A접점은 B접점이 되고, B접점은 A접점이 되는 동작을 한다. 

 

2) 코드 설명

UART 통신을 통해 PuTTY화면에서 사용자가 입력하는 문자에 따라 특정 ADC 채널이 활성화 되거나 혹은 릴레이나 LED가 점멸 동작을 하도록 프로그래밍

※ 3-1 코드와 비교했을때 반복문만 주로 바뀌었고 나머지 사용자 함수부나 초기화면 코드부분은 대동소이 하기 때문에 반복문만 확인하겠습니다.

 

- Line 53 ~ 55 : do ~ while문중에 do에 해당되는 부분. scanf 함수를 통해 사용자의 입력값을 ch 변수에 저장한다.

- Line 56 : 사용자가 입력한 문자가 c, v, r, e에 해당되지 않으면 do ~ while문을 탈출하지 않는다.

- Line 59 ~ 66 : 사용자가 'c'를 입력하면 ADC의 1번 채널이 활성화 되어서 포토센서의 데이터 값을 입력받고 출력한다.

- Line 67 ~ 74 : 사용자가 'v'를 입력하면 ADC의 0번 채널이 활성화 되어서 가변저항의 데이터 값을 입력받고 출력한다.

- Line 75 ~ 83 : PORTC의 0번 핀에 연결되어있는 릴레이를 동작시킨다.

(릴레이에 연결되어 있는 LED가 0.5초 간 꺼졌다 켜진다.)

- Line 84 ~ 92 : PORTA에 연결되어있는 LED 8개가 일정한 규칙을 가지고 점멸동작을 수행한다.

(PuTTY에서 "점멸 동작이 수행되었습니다."가 여러번 반복 된 이유는 for문 안에 들어가 있어서 그렇다.)

댓글