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ụ: