Programming/8051

8051( 중급 10부 - A/D )

청솔1 2009. 11. 29. 15:53

8051( 중급 10부 - A/D )

요즈음에는 8051 코어에 A/D 컨버터를 내장한 CPU들이 많아서 그러한 CPU를 사용하면 손쉽게 A/D처리 할수 있슴다.

  그런 CPU로는 C8051Fxxxx 시리즈, ADuC8xx 시리즈, T89C51AC2, 필립스사의 80C752등 여러 업체로 부터 제공 받을수 있습니다.

 

  A/D 칩중 가장 많이 사용되는것은 ICL7107 시리즈 일겁니다.

  우리가 사용하는 멀티 미터등에는 ICL7106이 많이 사용되고 있지요.

  7107 FND 드라이브 회로를, 7106 segment type LCD 드라이브 회로를 내장하고 있어서 별도의 회로를 구성치 않아도 간단히 만들수 있슴다.

이런 시리즈에는 ICL7135와 같은것도 있슴다. 이것은 잘 이용하면 CPU에 인터페이스도 할수가 있다.

7135와 같은 것은 A/D 분해능이 4 1/2 digit 이므로 14 bit A/D 정도의 성능을 갖는다 할수 있슴다.

 

ICL7106, 7107 데이터 시트

 위에서 소개한 A/D 컨버터들은 모두 dual slope 방법에 의해 측정을 함다.

  dual slope 방법을 간단히 설명 한다면 capacitor를 완전 방전 시킨 상태에서( zero cross ) 충전 시간과 방전 시간을 측정 해서 A/D 값을 얻어 내는 방법이다.

 

dual slop 설명 자료

 

dual slope timing diagram  

 

아날로그 스위치등의 하드웨어와 타이밍 다이어그램을 코딩 시킬수 있으신 분들은 이러한 원리적인 부분을 응용하여 자신만의 A/D 컨버터를 만들어 보실수 있을검다.

실제로 얼마 전까지 산업용 indicator에는 이런식으로 풀어 헤쳐 만든 A/D를 사용하는 것도 본적이 있슴다.

 

  A/D 컨버터에는 위에서 설명한 방식 말고도 다양한 방법들이 있으며 각 IC 마다 고유의 방법을 이용하고 있으므로 A/D 컨버터를 더 공부 하고 싶으신 분들은 A/D 처리에 관한 책들을 참고 하시면 되리라 봄다.

 

  그리고 A/D 입력은 전압 입력이지만 산업 현장에서 간혹 4~20mA 출력의 센서를 취급하는 경우가 있슴다. 말하자면 전류 출력인데 이러한 것을 사용하는 경우는 전류를 전압으로 바꾸어 준 다음 입력을 읽어 들이면 됨다.

  그 방법을 모르겠다고라고라~~~~?

  간단함다. 우리가 중학교 시절 물상 시간( 요즈음엔 모라고 하드라...)에서 부터 배워 왔던 오옴의 법칙을 이용하문 됨다.

 

  V = I x R

 

  4~20mA의 출력측과 A/D 입력 회로의 GND 사이에 250 오옴의 저항을 연결함다.

  250 오옴의 저항과 4~20mA 연결단을 A/D 입력단에 걸어 주기만 하문 됨다.

  왜냐고라?

  다음식을 봅시다. 

 

  4  [ mA ] x 250[ 오옴 ] = 1 [ V ]

  20 [ mA ] x 250[ 오옴 ] = 5 [ V ]

 

  250 오옴 저항 하나로 간단하게 4~20mA의 전류를 1~5V 의 전압으로 변환 하였슴다.

  이때 정밀한 값을 얻기 위해서는 당연히 250 오옴의 저항이 정밀 해야 겠지요?

 

  본 강좌에서는 CPU 자체에 내장 되어 있지 않은 CPU 사용시 쉽게 인터페이스 할수 있는

 MCP3202 A/D 컨버터에 대한 설명을 해 드리겠슴다.

 

 MCP3202 자료

 

위의 데이터 시트를 보면 MCP3202로 부터 어떻게 A/D 데이터를 읽어 낼수 있는지에 대해 설명이 되어 있슴다.

사용하는 CPU SPI 인터페이스가 지원이 되면 간단 하지만 그렇지 않고 일반 CPU를 이용해서 포트 제어를 통해 A/D 값을 읽어 들일려면 다음과 같은 방법을 이용하면 됨다.

 

 산적이 실험한 MCP3202 두개로 부터 A/D 4채널 구성 도면

 

 다음 루틴은 보름전에 산적이 직접 실험을 거친 루틴임다.

 사용을 한 포트는 P2이므로 사용자에 따라 적당히 맞추어 define을 새로 정의 하고 포트의 초기화 부분을 수정하면 어떤 포트로든지 실험을 할수 있을검다.

#define AD_clk          P2.2

#define AD_Dout         P2.1

#define AD_Din          P2.0

#define AD_CS0          P2.7

#define AD_CS1          P2.6

 

unsigned int AD_read( int channel ) {

    unsigned int ad_data;

    int i, j;

    ad_data = 0; /* 데이터를 저장할 변수 초기화 */

    P2 = 0xff;

    /* 채널 선택 */

    if( channel < 2 ) AD_CS0 = 0;

    else              AD_CS1 = 0;

    for(i=0;i<2;i++);     /* 약간의 시간 지연을 위해 삽입 */

 

    AD_clk = 0;

 

    AD_Din = 1;     /* start */

    AD_clk = 1;

    for(i=0;i<2;i++);

    AD_clk = 0;

 

    AD_Din = 1;     /* single ended */

    AD_clk = 1;

    for(i=0;i<2;i++);

    AD_clk = 0;

 

    if( channel % 2 == 0 )

        AD_Din = 0;     /* channel select */

    else AD_Din = 1;

    AD_clk = 1;

    for(i=0;i<2;i++);

    AD_clk = 0;

 

    AD_Din = 1;     /* MSBF */

    AD_clk = 1;

    for(i=0;i<2;i++);

    AD_clk = 0;

 

    AD_clk = 1;     /* NULL bit */

    AD_clk = 0;

   

         /* 실제 데이터를 읽어 들이는 부분 */

    for(i=0;i<12;i++) {

         /* 현재 값을 왼쪽으로 1 비트 shift 시킨다. 이는 2를 곱한 결과와 동일 */

        ad_data <<= 1;

        AD_Dout = 1;

        AD_clk = 1;

        /* 읽힌 값이 '1'일때만 ad_data의 현재 값에 '1' or 시킨다 */

        if( AD_Dout == 1 ) ad_data |= 1;

        for(j=0;j<2;j++);

        AD_clk = 0;

        }

    P2 = 0xff;

    /* 최종적으로 얻어진 값을 리턴한다. */

    return ad_data;

    }

  

 이번 강좌에서는 A/D 칩으로 부터 값을 읽어 들이는 방법까지만 설명을 함다.

 다음 강좌에서는 A/D를 통해서 얻어 진 값을 우리가 원하는 데이터로 가공하기 위한 방법에 대해 설명을 함다.

[출처] 민이의 여행 

 

<< 전자기기 개발 --- 건강기기, 통신기기,각종 전자회로 개발, PCB ARTWORK >>