PIC có nhiều chân phục vụ  xử lý ADC với nhiều cách thức khác nhau . Để dùng ADC , bạn phải có khai báo #DEVICE cho biết dùng ADC mấy bit ( tuỳ chip hỗ trợ , thường là 8 hay 10 bit, dsPIC có AD 12 bit) .

pic

Các hàm phục vụ ADC : 
 Setup_ADC ( mode  ) : 
Không trả về trị . Dùng xác định cách thức hoạt động bộ biến đổi ADC . Tham số mode tuỳ thuộc file thiết bị *.h có tên tương ứng tên chip bạn đang dùng , nằm trong thư mục DEVICES của CCS . Muốn biết có bao nhiêu tham số có thể dùng cho chip đó , bạn mở file tương ứng đọc , tìm tới chỗ các định nghĩa cho chức năng ADC dùng cho chip đó tương ứng với hàm này .

ADC_OFF  : tắt hoạt động ADC ( tiết kiệm điện , dành chân  cho hoạt động khác ) .
ADC_CLOCK_INTERNAL  : thời gian lấy mẫu bằng xung clock IC
ADC_CLOCK_DIV_2  : thời gian lấy mẫu bằng xung clock / 2 
ADC_CLOCK_DIV_8  : thời gian lấy mẫu bằng xung clock / 8
ADC_CLOCK_DIV_32  : thời gian lấy mẫu bằng xung clock / 32

Setup_ADC_ports ( value ) 
Xác định chân lấy tín hiệu analog và điện thế chuẩn sử dụng . Tùy thuộc bố trí chân trên chip , số chân  và chân nào dùng cho ADC  và số chức  năng ADC mỗi chip mà value có thể có những giá trị khác nhau. Xem file tương ứng trong thư mục DEVICES để biết số chức năng tương ứng chip đó .
Ví dụ :
ALL_ANALOGS  .........: dùng tất cả chân sau làm analog  : A0  A1  A2  A3  A5   E0  E1  E2  (Vref=Vdd)
NO_ANALOG  ..............................................................: không dùng analog
AN0_AN1_AN2_AN4_AN5_AN6_AN7_VSS_VREF .:  A0 A1 A2 A5 E0 E1 E2 VRefh=A3
AN0_AN1_AN2_AN3_AN4     .....................................:  A0 A1 A2 A3 A5
AN0_AN1_AN3      .......................................................:  A0 A1 A3  , Vref = Vdd
AN0_AN1_VSS_VREF    ..............................................:  A0 A1 VRefh = A3
AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF  ......:  A0 A1 A5 E0 E1 E2 VRefh=A3 , VRefl=A2 .
AN0_AN1_AN2_AN3_AN4_AN5    ............................:  A0 A1 A2 A3 A5 E0
AN0_AN1_AN2_AN4_AN5_VSS_VREF  .................. :  A0 A1 A2 A5 E0 VRefh=A3
AN0_AN1_AN4_AN5_VREF_VREF   .........................:  A0 A1 A5 E0 VRefh=A3 VRefl=A2
AN0_AN1_AN4_VREF_VREF   .................................. :  A0 A1 A5 VRefh=A3 VRefl=A2
AN0_AN1_VREF_VREF     ...........................................:  A0 A1 VRefh=A3 VRefl=A2
AN0   ..............................................................................:  A0
AN0_VREF_VREF    ..................................................... :  A0 VRefh=A3 VRefl=A2

VD :  setup_adc_ports (AN0) ;  // A0 là kênh  analog , áp nguồn +5V cấp cho IC sẽ là điện áp chuẩn .

Set_ADC_channel ( channel ) :

Chọn chân để đọc vào giá trị analog bằng lệnh Read_ADC ( ) . Giá trị channel tuỳ số chân chức năng  ADC mỗi chip .
Hàm không trả về trị . Nên delay 10 us sau hàm này rồi mới dùng hàm read_ADC ( ) để bảo đảm kết quả đúng . Hàm chỉ hoạt động với A /D phần cứng trên chip.

Read_ADC ( mode ) : 
Dùng đọc  giá trị ADC từ thanh ghi chứa kết quả biến đổi ADC . Lưu ý hàm này sẽ hỏi vòng cờ cho tới khi cờ này báo đã hoàn thành biến đổi ADC.
mode có thể có hoặc không , gồm có :
ADC_START_AND_READ  :  giá trị mặc  định 
ADC_START_ONLY 
ADC_READ_ONLY 

Giá trị số tương ứng của các ADC:

ADC=8  0-255  ,ADC=10   0-1023 , ADC=12   0-4095  , ADC=16   0-65535 (Với áp nguồn +5V cấp cho IC sẽ là điện áp chuẩn )
Ví dụ lấy mẫu ADC trên chip 16F887 :

#Device ADC=10;

int 32 Ain0;

int16 vout,j=0;

setup_adc(ADC_CLOCK_INTERNAL  );
setup_adc_ports(sAN0);

/// lấy 1000 mẫu trong vòng 1s.

for (j=0;j<1000;j++) {
     set_adc_channel(0);
     delay_ms(1);
     vout = read_adc();
     Ain0 +=vout;
     } 

Ain0 /=1000;