You are on page 1of 13

TM HIU V ADC CA VI IU KHIN PIC 16F877A

I. GII THIU V ADC CA PIC

ADC l b chuyn i tn hiu tng t thnh tn hiu s

PIC 16F877A c 8 ng vo Analog ( RA0:RA4 and RE0:RE2) v mi knh ADC l 10 bit vi chip 40 chn. Hiu in th chun V REF c th c la chn l VDD, VSS hay hiu in th chun c xc lp trn 2 chn RA2, RA3. B chuyn i ADC c cu trc c lp c th hot ng trong khi vi iu khin ang ch Sleep, xung cung cp cho ADC ly t dao ng RC bn trong ca khi ADC. Kt qu chuyn i t tn hiu tng t sang s l 10 Bit s tng ng v c lu trong 2 thanh ghi: ADRESH, ADRESL. Khi khng s dng b chuyn i ADC, cc thanh ghi ny c th c s dng nh cc thanh ghi thng thng khc. Khi qu trnh chuyn i hon tt, kt qu s c lu vo 2 thanh ghi ADRESH, ADRESL. Bit c xa v 0 v c ngt ADIF c SET .
II. KHI ADC TRONG PIC

Cc thanh ghi lin quan n b chuyn i ADC

Thanh ghi ADCON0 ( ADDRESS 1FH): c chc nng iu khin hot ng ca thanh ghi ADC.

Bit 6-7: cc bit la chn xung chuyn i AD. Bit 3-5: cc bit la chn knh tng t. Bit 2 : bit bo trng thi chuyn i ADC Bit 1 : Cha dng nu c l 0 Bit 0 : bit m ngun cho ADC hot ng. Bit 7,6 : Dng la chn tn s chuyn i

Bit 5-3 : CHS2:CHS0: Cc bit la chn knh tng t

Bit 2: GO/DONE: Bit ny bng 1 khi chuyn i ADC ang din ra. Bit ny bng 0 khi qu trnh chuyn i kt thc. Bit 0: ADON Bit ny bng 1 th khi ADC c m ngun Bit ny bng 0 th khi ADC b tt ngun gim bt cng sut tiu th. Thanh ghi ADCON1 ( ADDRESS 9FH) : Thit lp chc nng cho cc chn ca Port l ng vo nhn tng t hoc chn xut nhp I/O

Bit 7 : bit la chn nh dng kt qu ADC. Bit =1 canh l phi,ngc li canh l tri.

Bit 6 ( ADCS2): bit la chn xung clock cho chuyn i ADC.

Bit 5-4: cha dng nu c s c gi tr l 0. Bit 3-0: bit iu khin ADC.

THANH GHI ADRESH, ADRESL


Cha kt qu 10 bits ca chuyn i

III. Quy trnh chuyn i t tng t sang s gm nhng bc sau Thit lp cc thng s cho b chuyn i ADC

Chn ng vo analog, chn in p mu ( da trn cc thng s ca thanh ghi ADCON1).

Chn knh chuyn i AD ( thanh ghi ADCON0). Chn xung clock cho knh chuyn i AD ( thanh ghi ADCON0). Cho php b chuyn i AD hot ng ( thanh ghi ADCON0). Thit lp cc c ngt cho b ADC

Clear bit ADIF(ADC Interrupt Flag bit =0 cha hon thnh chuyn i)

Set bit ADIE( ADC Interrupt Enable bit=1 cho php ngt ADC Set bit PEIE( Peripheral Interrupt Enable bit = 1 cho php tt c cc ngt

ngoi vi) Set bit GIE (Global Interrupt Enable bit= 1 cho php tt c cc ngt) i cho qu trnh ly mu hon tt Bt u qu trnh chuyn i ( Set Bit )

i cho ti khi qu trnh chuyn i hon tt bng cch: Kim tra Bit . Nu Bit =0 th qu trnh chuyn i hon tt. Kim tra c ngt. c kt qu chuyn i v xa c ngt, set bit chuyn i). Tip tc thc hin cc bc 1 v 2 cho qu trnh chuyn i tip theo.

( nu cn tip tc

IV. BI TON

c gi tr ADC 8 bit chn AN0 (iu chnh bng bin tr 10k), v kim tra nu p ng vo analog > 2.5V th bt cc LED gn PORTB ln.

CHNG TRNH:
#include <pic.h> __CONFIG(0X3F7A); #define _XTAL_FREQ 20000000 void port_init(void); void adc_init(void); void int_init(void); void interrupt isr(void); //------------------------------------------------------------------------void port_init(void) { TRISA0 = 1; //khai bao RA0 la Input de doc ADC

TRISB = 0X00; //khai bao PortB xuat LED nen la OutPut PORTB = 0xFF; // Tat het LED o portB } //-----------------------------------------------------------------------void adc_init(void) { PCFG0=0; //chon dien ap mau dua tren cac thong so cua thanh ghi ADCON1 PCFG1=0; // VREF+ =VDD, VREF- = VSS PCFG2=0; PCFG3=0; ADCS1 = 0; // chon tan so lay mau // ADC conversion clock: = Fosc/8 ADCS0 = 1; // Select Input chanel: AN0 CHS1 = 0; // CHS <2:0> = 000 Select AN0 CHS2 = 0; CHS0 = 0; ADFM = 1; // ADFM = 1 Right justified ADFM = 0 Left justified Result format ADON = 1; // Turn on ADC Module __delay_ms (1); //delay to wait for adc module init. } //---------------------------------------------------------------//interrupt initialization THIET LAP CO NGAT CHO BO ADC void int_init() { GIE = 1; //Global Interrupt Enable //cho phep tat cac cac ngat xay ra PEIE = 1; //Peripheral Interrupt Enable // cho phep tat ca ngat ngoai vi ADIE = 1; //ADC Interrupt Enable // cho phep ngat adc ADIF = 0; //Clear ADC Interrupt Flag // xoa co ngat } //---------------------------------------------------------------void interrupt isr() { int ADC_result; if (ADIF== 1) //neu ngat adc xay ra { ADIF = 0; //Clear ADC Interrupt Flag//Read ADC result

ADC_result = (ADRESH<<8)|ADRESL; if (ADC_result> 512) //V_in > 2.5V <=> ADC_result > 512 { PORTB = 0; //bat cac led o port b } else { PORTB = 0xFF; } } } void main(void) { port_init(); adc_init(); int_init(); while(1) { __delay_us(50); //delay between 2 AD conversions //delay giua 2 lan chuyen doi GO_DONE = 1; //Set GODONE bit to start conversion //BAT BIT GO/DONE DE BAT DAU LAN CHUYEN DOI TIEP THEO }; }

You might also like