ADC의 사용

 

1    ADC의 기본사항

 

ADUC831은 ADUC812에 비해 ADC기능이 추가 수정되었다. 예를 들어 ADC의 오차를 잡아 주기 위한 Calibration, ADC on/off, 내 외부 레퍼런스의 사용자에 의한 선정 등등.. 그럼 관련 레지스터를 다시 설명 아래에서 다시 설명 드리겠습니다.

 

 

2    ADC의 관련 레지스터

 

ADUC831 ADCCON1 define

BIT7 

MDI 

1:ADC 동작 , 0: ADC 동작정지

BIT6 

EXT_REF 

1:External REF , 0: Internal REF

BIT5 

CK1 

converting clock divider ratio (CK1,CK0 값에따라 adc clk = mclk/x 설정)

x값은-> 00 : 16 ,01 : 2 ,10 : 4 , 11 : 8

BIT4 

CK0 

BIT3 

AQ1 

ADC clk 몇변만에값을추출할것인가? (AQ1,AQ0)

00: 1 ,01: 2 ,10: 3 ,11: 4

BIT2 

AQ0 

BIT1 

TC2 

동작 시작울 timer2 오버플로우 발생으로 한다

BIT0 

EXC 

동작 시작을 외부 convst pin low 되면 한다

 

ADUC831 ADCCON2 define

BIT7 

ADCI

adc 인터럽트발생 bit

BIT6 

DMA

DMA 동작설정

BIT5 

CCONV

continuous conversion 로설정(연속적동작)

BIT4 

SCONV

single conversion으로 설정

BIT3 

CS3

컨버팅체널설정

0000: ch1 ,0001: ch2 ,0010: ch3 ,0011: ch4 ,0100: ch5 ,

0101: ch6 ,0110: ch7 ,0111: ch8 ,1000: 온도 , 1001: DAC1 ,

1010: DAC2 ,1011: AGND, 1100: Vref ,1111: DMA STOP

BIT2 

CS2

BIT1 

CS1

BIT0 

CS0

         :        

ADUC831 ADCCON3 define

BIT7 

BUSY

The ADC Busy Status Bit( 1 = busy)

BIT6 

GNCLD

Gain Calibration Disable Bit ( 1 = Disable)

BIT5 

AVGS1

Averages Selection(평균값 설정)

00 : 15 , 01 : 1, 10 : 31 ,11 : 63

BIT4 

AVGS0

BIT3 

CS3

사용안함

BIT2 

CS2

사용안함

BIT1 

TYPICAL

Calibration Type Select

1 :Gain Calibration(full-scale) , 0: Offset Calibration (zero-scale)

BIT0 

CSCALS0

Start Calibration Cycle( 1 시작 종료시 자동clear)

 

3    ADC의 관련 SOURCE

 

Source ADC오차를 잡아 주기 위해 Calibration 을 실행한다.


void ADC_Calibration()    // open adc
전에사용, only aduc83
{
    ADCCON1 = 0x8C;

    //To calibrate device offset:
    ADCCON2 = 0x0B;             //00001011 -> select internal AGND
    ADCCON3 = 0x25;             //select offset calibration
    while((ADCCON3&0x01));      //
완료확인

    //To calibrate device gain:
    ADCCON2 = 0x0C;             //00001011 -> select internal VREF
    ADCCON3 = 0x27;             //select offset calibration
    while((ADCCON3&0x01));      //
완료확인
}

 

Source ADC초기화를 실행한다.


void OpenADC(int ms) /* LAUNCH ADC CONVERSIONS */ // --> adc
{
    _xuint TM;

EADC = 0; // disable adc -in sfr
    if(ms ==0)        // convst pin ADC on/off .
    {
         ADCCON1 = 0xA1    ;        //1,0,1,0,0,0,1,0
    }
    else
    { //
타이머 인터럽트 활용
         ADCCON1 = 0xA2    ;        //1,0,1,0,0,0,1,0

     TM = 0x10000 - (_uint)((ms * 1000.0) / (OSC_DIVIDE/(OSC/1000000.0)));
     TH2 = HIGH_BYTE(TM); //define.h ((char)(n>>8))
     TL2 = LOW_BYTE(TM); //fefine.h ((char)(n & 0xff))

     RCAP2L = TL2 ; // timer2

     RCAP2H = TH2 ; // - in sfr

     TR2 = 1;             //T2CON = 0x04 ; // run Timer2
    }

ADCCON2 = 0x00 ; // sellect chan = chanal 0
EADC = 1; //enable ADC interrupt -in sfr
}

 

Source ADC값 처리한다..

xdata unsigned int ADC_BUFF[3];

void adc_int() interrupt 6
{
    int add_DA_M;        
    int add_DA_R;
    unsigned char ch_chk;

    if( (ADCCON3 & 0x80) == 0x80 ) return;     //adconverting..
진행중인지 확인

    add_DA_M = (((ADCDATAH & 0x0F) <<8 ) | ADCDATAL);
    ch_chk = (ADCDATAH >> 4) & 0x0F; //
체널만 읽어들인다.
    
    add_DA_R = (int)((0.61*ADMULTIPLE)*add_DA_M) ; // Calculation

 

    switch(ch_chk)
    {
    case 0: ADC_BUFF[0] = add_DA_R;
                 break;
    case 1: ADC_BUFF[1] = add_DA_R;
                 break;
    case 2: ADC_BUFF[2] = add_DA_R;
             break;
        default:
     break;
}

ch_chk++;
if(ch_chk >= ADC_MAX_CH)
{
ch_chk =0;
}

ADCCON2 = ch_chk;     //체널변경

 

 

4    ADC의 관련 기타사항

 

회로 구성 시 주의 해야 할 사항이 있습니다. 노이즈 제거를 위해 다음 그림과 같이 구성하는 것을 추천하며 OPAMP를 연결하기 어렵다면 저항과 케페시터는 꼭 사용하는 것을 추천합니다.

 

레퍼런스 내부 선택 회로

 

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

8051 레지스터 자료  (0) 2012.11.15
[ADUC831] ADUC831 간단 매뉴얼 6  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 4  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 3  (0) 2012.11.12
[ADUC831] ADUC831 간단 매뉴얼 2  (0) 2012.11.12

+ Recent posts