마하전자기술연구소 LOGO

제품검색 고객센터053-604-2355
기술자료실

Home > 기술자료실 기술자료실

제 목 4. A/D변환의 사용법
첨부파일


PIC16F87x의 A/D변환의 사용법


(2002/8/8)

【개요】

마이크로칩사의 최신 팁인, PIC16F87x 시리즈에는, 기다리기 어려워
있던 10비트의 A/D변환 모듈이 내장되었습니다.
여기에서는, 이 10비트 A/D변환 모듈의 사용법을 주로 C컴파일러를
베이스로 해 설명하고 있습니다.

【10비트 A/D변환의 개요】

PIC16F87x 시리즈의 10비트 A/D변환은, 순서대로 변환 방식에서, 분해가능이
1024 단계가 된 것이 됩니다.
지금까지가 8비트로 256 단계 밖에 없었기 때문에, 측정에는 분해가능 부족해
사용할 수 있지 않았습니다만, 이번은 꽤 응용범위를 펼칠 수가 있습니다.
1024의 분해가능이 있다고 하는 것은, 1 V의 전압을 측정할 때는 1 mV단위
그리고 계측 할 수 있다고 하는 것이 되기 때문입니다.

【A/D변환에 필요한 변환 시간】

PIC에서는, A/D변환을 하기 위해서, 우선 아날로그 신호를 일단 내부의 콘덴서
에 저축합니다. 그 후, 참조가 되는 일정한 전압을 가산해 비교하면서 계측 한다
그렇다고 하는 원리이기 (위해)때문에, A/D변환을 정확하게 실시하기 위해서(때문에)는, 축적할 때까지의 시간
(와)과 계측 할 시간의 양쪽 모두를 확보하는 것이 필요하게 됩니다.
종래의 PIC의 경우와 비교해, 이 시간이 어느 정도일까하고 말하면(자)

축적 시간+계측 시간=
 (종래 8비트)
    12μsec+1.6μsec×9.5 =최소 28μsec
 (이번 10비트)
    20μsec+1.6μsec×12 =최소 39μsec
됩니다. (클락 20 MHz때)

【레지스터의 상세 내용】

A/D변환 제어용으로는 3 종류의 레지스터가 있습니다만, 상세 내용과 설정 내용
(은)는 밑그림과 같이 되어 있습니다.
PIC16F87x의 종류에 의해 채널수가 다릅니다만, 밑그림은 PIC16F877
의 예입니다.




A/D변환 클락(Tad)의 설정 방법법은 아래 표로 합니다.

설정

ADCS1, 0

PIC의 클럭 주파수

20MHz

10MHz

4MHZ

1MHz

Fosc/2

00

 

 

 

2.0

Fosc/8

01

 

 

2.0

8.0

Fosc/32

10

1.6 

3.2

8.0

 

Frc

11

2~ 6 

 상표와 같이 클럭 주파수에 의해 가능한 설정은 황색의 설정
 만됩니다. 다른 설정으로 했을 경우에는, 정밀도가 보증되지 않습니다.
 왜냐하면 A/D용 클락으로서는 1.6μsec 이상 필요한 때문입니다.




여기에서는 특히 ADFM 비트의 사용법이 지금까지 없었던 것이 되어, 밑그림의
같은 지정이 됩니다.



아날로그 입력 포토의 사용법의 설정은 아래 표와 같이 됩니다

PCFG3-0

RE2

RE1

RE0

RA5

RA3

RA2

RA1

RA0

0000

A

A

A

A

A

A

A

A

0001

A

A

A

A

Vref+

A

A

A

0010

D

D

D

A

A

A

A

A

0011

D

D

D

A

Vref+

A

A

A

0100

D

D

D

D

A

D

A

A

0101

D

D

D

D

Vref+

D

A

A

011x

D

D

D

D

D

D

D

D

1000

A

A

A

A

Vref+

Vref-

A

A

1001

D

D

A

A

A

A

A

A

1010

D

D

A

A

Vref+

A

A

A

1011

D

D

A

A

Vref+

Vref-

A

A

1100

D

D

D

A

Vref+

Vref-

A

A

1101

D

D

D

D

Vref+

Vref-

A

A

1110

D

D

D

D

D

D

D

A

1111

D

D

D

D

Vref+

Vref-

D

A

 A는 아날로그 입력 D는 디지탈 입출력 Vref+ Vref-는 기준 전압 입력
 기준 전압 입력의 지정이 없을 때는, 전원 전압이 기준이 된다.



【C컴파일러에서의 사용법】

CCS사 C컴파일러로, 10비트 A/D변환을 정상적으로 동작시키려면 , 독 붐비는 변수
(을)를 long형이나 float형으로 하는 것만으로 10비트의 데이터로서 독 붐빌 수가 있습니다.

(2001/1/12)
 8비트와 10비트 게다가 right justify와 좌힐 이러한 전부를 취급할 수 있도록(듯이) 하기 위한(해)
 Ver2. 732로 의사 명령이 추가되었습니다.
 추가된 의사 명령은 아래와 같이가 되고 있어, 이것을 #include   <16 F877>의
 곧 다음에 어떤 것이나 하나를 지정 추가하게 되었습니다.

   《추가 의사 명령》
     #DEVICE  ADC=8   //종래와 같이 8비트로서 읽힌다
     #DEVICE  ADC=10  //10비트로 right justify로 읽힌다
     #DEVICE  ADC=16  //10비트이지만, 왼쪽 채우기로 읽힌다.



 실제의 예로 설명하면(자), 우선 밑그림의 회로도를 바탕으로 해 아날로그 신호이다
Analog0와 Analog1의 입력을 디지탈 데이터로 변환하는 예를 생각해 봅니다.
Vref+에 가세하는 레퍼런스 전압을 정확히 2. 047 V로 하면, 전면적이
0 V~2.047 V의 범위가 되어, 10비트의 A/D변환 다음에 생각하면(자), 1비트 당 2mV
의 분해가능이 됩니다.
또, 레퍼런스 전압을 1. 023 V 그렇다면, 1비트 맞아 정확히 1 mV의 분해
노우로 할 수도 있기 때문에, 매우 취급하기 쉬워집니다.






≪예 1≫ long형으로 바이너리 데이터로서 취급하는 경우
   이 예에서는 액정 표시기에의 표시 내용은 아래와 같이가 됩니다.

      CH=2 03EF

   액정 표시기에의 표시 출력에도”printf문"가 사용할 수 있으므로 간단하게
   희망하는 포맷으로 표시 출력을 할 수가 있습니다.


///////////////////////////////////////////
// A/D Converter test program for PIC16F877
// This A/D is 10bit mode
// LCD is SC1602BSLB or SC1602BS*B
//////////////////////////////////////////
#include <16f877.h>
#device ADC=10
#use delay(CLOCK=10000000)
#use fast_io(D)
#byte porta = 5
#byte portb = 6
#byte portc = 7
//////// Port define and link LCD library
#byte port = 8      //define port D
#define rs PIN_D0    //chip select
#define rw PIN_D1    //read/write
#define stb PIN_D2    //strobe
#include

///////////////////////////////////////////////
// LCD test program main routine
// Display several message on LCD
// with some interval.
// Constant Message is send by lcd_data()
///////////////////////////////////////////////

main(){
  int  ch;      //cahnnel number
  long data;      //analog data

  lcd_init();      //initialize LCD

  setup_adc_ports(ANALOG_RA3_REF); //RA3 is Ref+ others A/D
  setup_adc(ADC_CLOCK_DIV_32);   //Fosc/32 full speed

  do {               //endless loop
   for (ch=0;ch<7;ch++){
   lcd_clear();          //clear display
   set_adc_channel(ch);      //set channel
   delay_us(50);
   data=read_adc();        //get data 10 bits
   printf(lcd_data, "CH=%1U %4LX", ch, data);
   delay_ms(1000);
  }
 }while(1);
}



≪예 2≫ float형으로 10진소수로서 취급하는 경우
  이 예로 말하면(자) 액정 표시기의 표시는 아래와 같이가 되어, 직접 입력 전압치를
  표시시킬 수가 있습니다.

      CH=0 1.002 Volt

   액정 표시기에의 표시 출력에도”printf문"가 사용할 수 있으므로 간단하게
   희망하는 포맷으로 표시 출력을 할 수가 있습니다.


///////////////////////////////////////////
// A/D Converter test program for PIC16F877
// This A/D is 10bit mode
// LCD is SC1602BSLB or SC1602BS*B
//////////////////////////////////////////
#include <16f877.h>
#device ADC=10
#use delay(CLOCK=10000000)
#use fast_io(D)
#byte porta = 5
#byte portb = 6
#byte portc = 7
//////// Port define and link LCD library
#byte port = 8      //define port D
#define rs PIN_D0    //chip select
#define rw PIN_D1     //read/write
#define stb PIN_D2     //strobe
#include

///////////////////////////////////////////////
// LCD test program main routine
// Display several message on LCD
// with some interval.
// Constant Message is send by lcd_data()
///////////////////////////////////////////////

main(){
  int  ch;       //cahnnel number
  float data;      //analog data

  lcd_init();       //initialize LCD

  setup_adc_ports(ANALOG_RA3_REF); //RA3 is Ref+ others A/D
  setup_adc(ADC_CLOCK_DIV_32);   //Fosc/32 full speed

  do {               //endless loop
   for (ch=0;ch<7;ch++){
    lcd_clear();         //clear display
    set_adc_channel(ch);     //set channel
    delay_us(50);
    data=read_adc();       //get data 10 bits
    printf(lcd_data, "CH=%1U %1. 3f Volt", ch, data/500);
    delay_ms(1000);
   }
  }while(1);
}




(구판 보존)

【C컴파일러의 미비 수정】

CCS사의 C컴파일러에서는, Ver2. 660이후의 버젼에 대해서는 PIC16F87x
시리즈를 서포트하고 있습니다.
그러나, 오리지날의 헤더 파일에는 일부 미비가 있는 것 같아, A/D변환의
설정이 일부에서 오지 않습니다.

거기서 우선 헤더 파일의 수정을 실시합니다. 수정이라고 해도 간단해, MPLAB
의 디렉토리하에 있는 PIC16C74의 헤더 파일(16c74.h)의 마지막 몇 줄기의
아래와 같이 부분을 카피해, PIC16F877의 헤더 파일(16f877.h)의 마지막에 쳐
붙인 뒤, 덧쓰기 보존합니다.
이것으로 SETUP_ADC( ) 함수도 정상적으로 컴파일 되게 됩니다.


////////////////////////// Constants used for SETUP_ADC()
#define ADC_OFF        0
#define ADC_CLOCK_DIV_2    1
#define ADC_CLOCK_DIV_8   0x41
#define ADC_CLOCK_DIV_32  0x81
#define ADC_CLOCK_INTERNAL 0xc1

#define ADC_DONE 0x8C40 // Used for ENABLE/DISABLE INTERRUPTS
#define INT_ADC  0x8C40 // Used for ENABLE/DISABLE INTERRUPTS



(2001/1/12)
이 불편도 Ver2. 7이후는 수정되고 있기 때문에, 최신의 Example를 다우 로드
해 전개하면 모든 헤더 파일이 최신의 것에 할 수 있습니다.
이 Example는 누구라도 다운로드할 수 있습니다.

목록보기

www.1chip.com, www.1chip.co.kr
www.micom114.com
자료실바로가기

대구광역시 북구 산격2동 1629 산업용재관 10동 13호 (2층) / Tel. 053-604-2355 / Fax. 053-383-2354 / E-mail. maha@paran.com