ADC

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 hoặc hơn)

Thông dụng nhất khi dùng ADC là sử dụng 1 biến trở , điều chỉnh bởi 1 nút vặn , qua đó thu được 1 điện áp nhỏ hơn điện áp tham chiếu ( Vref – áp max ) , đưa vào chân biến đổi ADC , kết quả cho 1 giá trị số ADC 8 bit ( 0-255 ) hay ADC 10 bit (0-1023 ) . Thường thì áp Vref lấy bằng Vdd ( 5V ). Cần lưu ý là dùng ADC 10 bit thì biến trở có hiệu ứng xảy ra nhạy hơn rất nhiều so với 8bit, điều này khá bất lợi khi dùng đọc giá trị kiểm tra cập nhật tính toán

Các hàm sau phục vụ ADC

Setup_ADC ( mode  ) Dùng xác định cách thức hoạt động bộ biến đổi ADC, tham số mode phụ thuộc vào mô tả của từng chip. Sau đây là các  giá trị mode của 16F877:

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  ( mất 2-6 us ) thường là  chung cho các chip .
ADC_CLOCK_DIV_2  : thời gian lấy mẫu bằng xung clock / 2  ( mất 0.4 us trên thạch anh  20MHz )
ADC_CLOCK_DIV_8  : thời gian lấy mẫu bằng xung clock / 8  ( 1.6 us )
ADC_CLOCK_DIV_32  : thời gian lấy mẫu bằng xung clock / 32 ( 6.4 us )

 

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.

Sau đây là các giá trị cho value ( chỉ dùng 1 trong các giá trị )  của 16F877 :

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 , các chân đó sẽ là chân I /O .
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
( tên thì giống nhau cho tất cả thiết bị nhưng 16F877 chỉ có portA có 5 chân nên A0 , A1 , A2 , A5  được dùng , A6 , A7 không có )
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

Set_ADC_channel ( channel ) Chọn chân để đọc vào giá trị analog bằng lệnh Read_ADC ( ), Hàm không trả về trị  

Với 16F877 , channel có giá trị từ  0 -7:0-chân A0, 1-chân A1, 2-chân A2,  3-chân A3, 4-chân A5, 5-chân E0, 6-chân E1, 7-chân E2. 

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 (/ cặp 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 ( sẽ mất vài us )

Nếu giá trị ADC là 8 bit như khai báo trong chỉ thị #DEVICE , giá trị trả về của hàm là 8 bit , ngược lại là 16 bit nếu khai báo #DEVICE sử dụng ADC 10 bit trở lên

Mỗi lần chỉ đọc 1 kênh  Muốn đổi sang đọc chân nào , dùng hàm set_ADC_channel( ) lấy chân đó . Nếu không có đổi chân , dùng read_ADC( ) bao nhiêu lần cũng được 

mode có thể có hoặc không , gồm có :
- ADC_START_AND_READ  :  giá trị mặc  định
- ADC_START_ONLY  :  bắt đầu chuyển đổi và trả về
- ADC_READ_ONLY   :  đọc kết quả chuyển đổi lần cuối 

Ví dụ:

setup_adc(  ADC_CLOCK_INTERNAL  );
setup_adc_ports( ALL_ANALOG );
set_adc_channel(1);
while ( input(PIN_B0) )
{
   delay_ms( 5000 );
   value = read_adc();
   printf(“A/D value = %2x\n\r”, value);
}