3) ADC

ADUC812 의 가장 큰 특징중에 하나는 ADC와 DAC를 내부적으로 가지고 있다는 거지요

이번에는 이 ADC와 DAC를 사용하는 방법을 소개할까 합니다.

 

ADUC812내부에는 12bit 8체널의 ADC를 가지고 있습니다. 12bit ADC를 사용하기 위해서는 기준 되는 전압을 정의해야 합니다. 그렇지 않으면 ADUC812가 전압을 어떻게 사용할지 모르니까요.

 

매뉴얼을 살펴보면 알겠지만 ADUC812 내부에는 2.5V의 레퍼런스가 들어 있습니다. 내부 레퍼런스를 사용할 경우 아날로그 input 가능범위는 0V-Vref 까지 즉 0V-2.5V까지죠 물론 외부 레펀런스도 사용 가능합니다. 외부 레퍼런스입력범위는 2.3V - AVDD까지입니다. AVDD를 3V로 쓰면 외부 레퍼런스전압은 2.3V-3V까지 가능하겠죠 만약 AVDD를 5V로 사용하신다면 외부 레퍼런스전압은 2.3V-5V까지 조정이 가능합니다.

 

그럼 ADC 시작은 언제부터 가능한 걸까요 이것은 CONVST핀(25번핀)을 사용하는 것에 따라 틀려집니다. 만약 CONVST핀을 사용한다면 이 핀에 'L'가 인가되면 동작을 하게 되어 있지요. 이 핀을 사용 안하면 어떻게 동작을 시킬까요 "1) 간단한 ADUC812칩의 특징"을 잘 살펴 보신분은 금방 이해가 될 겁니다. 키 포인트는 바로 타이머 2인터럽트죠. 타이머2 인터럽트의 시간을 설정하고 이 타이머 2인터럽트가 발생하면 ADC를 시작하고 컴버트가 끝나면 ADC인터럽트가 발생을 하게 됩니다. 그 다음에 인터럽트에 대한 처리를 하면 되겠죠.

 

ADC변환값에 대한 DMA처리가 가능하니까 DMA를 지원하는 외부 MCU나 CPU를 사용하신다면 이 기능을 활용해 보는 것도 좋을듯하군요

 

여기서 한가지를 집고 넘어가야겠군요 ADUC812의 9번째 아날로그신호는 온도센서입니다. 이 온도센서는 600mA일 때 25도이며 1도 상승시 마다 -3mA가 줄어듭니다. 만약 온도가 하강하면 +3mA가 증가하겠죠.

그럼 ADC에 관련된 레지스터를 살펴봅시다. 레지스터를 모르고 프로그램을 할 방법은 없겠죠.

 

ADDCCON1 (ADC Control SFR #1)

이 레지스터는 ADC의 기능을 설정하는 놈입니다.

어드레스 : EFH , 파워 온 시 기본값 : 20H , BIT단위 제어 불가능

BIT7

MD1

MODE BIT

MD1 MD0

0 0 : ADC 파워 다운

0 1 : ADC 표준모드

1 0 : Conversion cycle 사용하지 않으면 ADC 파워다운

1 1 : Conversion cycle 사용하지 않으면 ADC 대기상태

BIT6

MD0

BIT5

CK1

ADC 계산 분주율을 설정합니다.

CK1 CK0 MCLK DIVIDER

0 0 : 1

0 1 : 2

1 0 : 4

1 1 : 8

BIT4

CK0

BIT3

AQ1

얻어지는 신호(이전신호와 지금신호)를 고르게 얻기위한 값으로 사용된다.(몇번 ADC를 하고 받을것인지 설정)

AQ1 AQ0 #ADC Clks

0 0 1

0 1 2

1 0 3

1 1 4

 

입력된 source 저항이 8k 이하면 00으로 선택하고 그이상이면 다른 값으로 선택한다.

BIT2

AQ0

BIT1

T2C

타이머 2를 사용할건지를 선택한다.

BIT0

EXC

CONVST를 사용할것인지 석택한다.

선택시 CONVST 신호가 low active일때 동작한다.

CONVST는 100ns보다 pulsewidth를 사용해야 한다.

 

ADCCON2(ADC Control SFR #2)

SFR Address : D8H , SFR Power On Default Value

Bit 제어 : YES

BIT7

ADCI

ADC 변환후 SET되며 인터럽트 루틴으로 점프한다.

인터럽트 처리가끝나면 자동으로 지워진다.

BIT6

DMA

DMA를 사용가능하도록 해준다

BIT5

CCONV

계속해서 ADC를 하도록 SET한다.

BIT4

SCONV

한번의 변화만 하기위해 SET하며 변화가 끝나면 0로 된다.

BIT3

CS3

변환해야될 체널을 선택한다.

CS3 CS2 CS1 CS0 선택된체널

0 0 0 0 0

0 0 0 1 1

0 0 1 0 2

0 0 1 1 3

0 1 0 0 4

0 1 0 1 5

0 1 1 0 6

0 1 1 1 7

1 0 0 0 Temp Sensor

1 X X X Other Combinations

1 1 1 1 DMA STOP

BIT2

CS2

BIT1

CS1

BIT0

CS0

 

ADCCON3(ADC Control SFR #3)

SFR Address : F5H , SFR Power On Default Value : 00H

Bit 제어 : NO

 

BIT7

BUSY

ADC 처리중일 BUSY 가 1로되 처리가 안끝났다고 알려준다.

BIT6

 

RESERVED

BIT5

 

BIT4

 

BIT3

 

BIT2

 

BIT1

 

BIT0

 

 

위에 제어 비트들을 살펴보았다면 Reference 인터페이스 부분을 다시 한번 살펴보아야 하겠죠. 만약 내부 레퍼런스를 사용한다면 Vref 와 Cref핀에 100nF의 Capacitor를 달아주어야 합니다.

외부 레퍼러스의 경우 전에 말씀드렸듯이 사용가능 범위는 2.3V-AVDD까지며 이때는 Cref에 100nF의 Capacitor를 달아주어야 하며, 내부 레퍼런스의 오차범위는 ±50mV입니다.

 

변환된 값은 어디에 저장되는지 알아야 실제 그 값을 가지고 다른 처리가 가능하겠죠. 처리된 값은 ADCDATAH 와 ADCDATAL에 저장됩니다.

ADCDATAH의 상위 4bit(bit7-bit4)에는 처리된 채널 번호가 들어가고 하위 4bit(bit3-bit0)에는 12bit 처리된 값중에 상위 4bit가 들어갑니다. ADCDATAL는 나머지 하위 8bit가 저장 됩니다.

 

ADCDATAH

bit7

bit6

bit5

bit4

bit3

bit2

bit1

bit0

CH ID(현재 읽어들인 체널값)

상위 4bit

 

ADCDATAL

bit7

bit6

bit5

bit4

bit3

bit2

bit1

bit0

하위 8bit

 

그러면 읽어들인 값을 가지고 어떻게 계산을 해야 할까요

Keil C 컴파일러에서 처리한 C소스 예제입니다. 레인지가 0V에서 2.5V (물론 내부 레퍼런스를 사용했을 때입니다) 이고, ADC 가 12bit이니까 총 STEP은 4096 이 됩니다. 계산을 하기위해 0V를 0으로 2.5V를 2500으로 처리하면

 

int DA_ADD;        

int DA_C;

 

DA_ADD = ((ADCDATAH & 0x0F) <<8 ) | ADCDATAL; //add AD converter value

DA_C =(int)((2500.0/4096.0)*add_DA_M); // Calculation = (reference/step) * converting value

ADCDATAH 의 하위 바이트만 읽어 들인 후 8Bit를 상위 바이트로 밀고 이 값에 하위 바이트 값을 OR시켜 하나의 DATA형태로 만듭니다.(int 형은 2 byte 라는 것을 잊으면 안됩니다.)

DA_C와 같이 계산을 하면 1.5V의 값이 들어오면 DA_C에 들어간 값은 약 1500이 될 겁니다. 이 값을 1000으로 나누면 원래의 DATA를 얻을 수 있겠죠.

 

이로서 ADC 부분을 마쳤습니다. 이중 DMA부분은 빠졌는데 필요한 분은 매뉴얼을 참고하여 프로그램 하시면 될 겁니다.

 

'공부 > 8051' 카테고리의 다른 글

[ADUC812] ADUC812 설명 6  (0) 2012.11.10
[ADUC812] ADUC812 설명 5  (0) 2012.11.10
[ADUC812] ADUC812 설명 4  (0) 2012.11.10
[ADUC812] ADUC812 설명 2  (0) 2012.11.10
[ADUC812] ADUC812 설명 1  (0) 2012.11.10

+ Recent posts