Thứ Hai, 3 tháng 12, 2018

CHƯƠNG 3 : XỬ LÝ ADC, CÁC HÀM I/O TRONG C


I / _ XỬ LÝ 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) . Bạn cần lưu ý là: 1 VDK hỗ trợ ADC 10 bit thì giá trị vào luôn là 10 bit , nhưng chia cho 4 thì còn 8 bit . Do đó 1 biến trở chiết áp cấp cho ngõ vào ADC mà bạn chọn chế độ 10 bit thì sẽ rất nhạy so với chế độ 8 bit ( vì 2 bit cuối có thay đổi cũng không ảnh hưởng giá trị 8 bit cao và do đó kết quả 8 bit ADC ít thay đổi ) , nếu chương trình có chế độ kiểm tra ADC để cập nhật tính toán , hay dùng ngắt ADC , thì nó sẽ chạy hoài thôi . Dùng ADC 8 bit sẽ hạn chế điều này . Do đó mà CCS cung cấp chọn lựa ADC 8 hay 10 bit tùy mục đích sử dụng .
Cấu hình bộ ADC :
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 ) (??) 
Trên các PIC có ngõ AVdd và AVss ( PIC 18 ) , thường thì bạn luôn nối AVdd tới Vdd , AVss tới Vss để đảm bảo họat động cho lập trình qua ICD 2 .
Các hàm sau phục vụ ADC :
1 / 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 . Sau đây là các giá trị mode của 16F877 , ( 1 số khác có thể không có hoặc có thêm như 16F877A có thêm 1 số thứ là ADC_CLOCK_DIV_2/4/8/16/32/64 . . .) :
- 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 )


2 / 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 đó . Để tương thích chương trình viết cho phiên bản cũ , 1 số tham số có 2 tên khác nhau ( nhưng cùng chức năng do định nghĩa cùng địa chỉ ) , ở đây dùng phiên bản 3.227 .Lưu ý : Vref : áp chuẩn ,  Vdd : áp nguồn
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 E0AN0_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_AN1_AN3 ) ;  // A0 , A1 , A3 nhận analog , áp nguồn +5V cấp cho IC sẽ là điện áp chuẩn .
3 / 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 .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
_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.
4 / 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 ) thì xong hàm .
_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 .
_Khi dùng hàm này , nó sẽ lấy ADC từ chân bạn chọn trong hàm Set_ADC_channel( ) trước đó .
Nghĩa là mỗi lần chỉ đọc 1 kênh Muốn đổi sang đọcchâ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
- #DEVCE  8 bit  10 bit  11 bit  16 bit
- ADC=8  0-255  0-255  00-255  00-255
- ADC=10  x  0-1023  x  x
- ADC=11  x  x  0-2047  x
- ADC=16  0-65280  0-65472  0-65504  0-65535_16F877 chỉ hỗ trợ ADC 8 và 10 bit .
VD :
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);
}
read_adc(ADC_START_ONLY);
sleep();
value=read_adc(ADC_READ_ONLY);
_Lưu ý : trên PIC 18 , cấu trúc ADC tương đối phứctạp , đa năng hơn như là cho phép lấy 2 mẫu cùng lúc , . . . cũng sử dụng với các hàm trên , có nhiều thông số trong file *.h , sẽ đề cập sau . 
5 / _ Ví dụ :
_Chương trình sau lấy ADC 8 bit , đọc và xuấtra dãy led ở port B , và xuất ra màn hình máy tính .
_Kết nối chân trên 16F877 : RA0 là chân lấy Analog vào , áp chuẩn là nguồn +5V , mass=0 V    
 
#include <16F877.h >
#use delay( clock=20000000 )
#device *= 16 ADC = 8    // sử dụng ADC 8 bit , giá trị ADC vào từ 0-255
#use rs232(baud=19200,parity=n,xmit=pin_C6,rcv=pin_C7)
Int8 adc ; 
Main( )
{
Setup_ADC ( ADC_internal ) ;
Setup_ADC_ports (AN0);
Set_ADC_channel ( 0 ) ;
Delay_us (10 );   // delay 10 us
While (true )
{  adc = read_adc ( ) ;
 Output_B ( adc ) ;   // xuatra port B gia tri bien adc
 Printf( “ gia tri adc la : %u “ , adc ) ;  // in ra man hinh  }
}
// giá trị biến adc từ 0-255 , dùng chương trình Serial port Monitor trong mục Tools của CCS để 
giám sát giá trị . Nhớ thiết lập tốc độ là 19200 như khai báo trên                                                                            

Không có nhận xét nào:

Đăng nhận xét

Bài đăng mới nhất

Valdes Fernando - Microcontrollers Applications With Pic

Bài đăng phổ biến