Bài 5: ADC
Nội dung
Modul ADC trong PIC16F877A
Ứng dụng của ADC
Giới thiệu
ADC (Analog to Digital Converter) là bộ chuyển đổi tín
hiệu tương tự sang số.
PIC16F877A có 8 ngõ vào analog ( AN7:AN0).
Hiệu điện thế chuẩn có thể được lựa chọn là VDD, VSS
hay hiệu điện thể chuẩn được xác lập trên hai chân
RA2 và RA3.
Giới thiệu
Kết quả chuyển đổi từ tín tiệu tương tự sang tín
hiệu số là 10 bit số tương ứng và được lưu trong hai
thanh ghi ADRESH:ADRESL
Khi quá trình chuyển đổi hoàn tất , bit
(ADCON0) được xóa về 0 và cờ ngắt ADIF được
set.
Quy trình chuyển đổi ADC
1. Thiết lập các thông số cho bộ chuyển đổi ADC:
-Chọn ngõ vào analog, chọn điện áp mẫu (dựa trên
các thông số của thanh ghi ADCON1).
bit 7 ADFM: A/D Result Format Select bit
bit 6 ADCS2: A/D Conversion Clock Select bit
1. Thiết lập các thông số cho ADC
bit 3-0 PCFG3:PCFG0: A/D Port Configuration Control bits
1. Thiết lập các thông số cho ADC
-Chọn kênh chuyển đổi AD (thanh ghi ADCON0).
-Chọn xung clock cho kênh chuyển đổi AD (thanh
ghi ADCON0).
-Cho phép bộ chuyển đổi AD hoạt động (thanh ghi
ADCON0).
Bit 7,6 ADCS1:ADCS0 A/D Conversion Clock Select bit
1. Thiết lập các thông số cho ADC
Bit 5-3 CHS2:CHS0 - Analog Channel Select
bit
Các bit này dùng để chọn kênh chuyển đổi
ADC
000 kênh 0 (AN0)
001 kênh 1 (AN1)…
111 kênh 7 (AN7)
Bit 2 A/D Conversion Status bit
(Khi ADON = 1)
=1 A/D đang hoạt động(set bit này sẽ làm
khởi động ADC và tự xóa khi quá trình chuyển
đổi kết thúc)
=0 A/D không hoạt động
Bit 0 ADON - A/D On bit(ADON = 1 bật A/D)
Quy trình chuyển đổi ADC
2. Thiết lập các cờ ngắt cho bộ AD( không bắt buộc)
• Clear bit ADIF(ADC Interrupt Flag bit =0 chưa hoàn thành chuyển
đổi)
• Set bit ADIE( ADC Interrupt Enable bit=1 cho phép ngắt ADC )
• Set bit PEIE( Peripheral Interrupt Enable bit = 1 cho phép tất cả các
ngắt ngoại vi)
• Set bit GIE(Global Interrupt Enable bit= 1 cho phép tất cả các ngắt)
Quy trình chuyển đổi ADC
3. Đợi 1 khoảng thời gian cần thiết( 20us).
4. Bắt đầu quá trình chuyển đổi (set bit )
5. Đợi cho tới khi quá trình chuyển đổi hoàn tất
bằng cách:
Dò bit GO/DONE có bị xóa chưa, hoặc chờ
ngắt A/D( nếu dùng ngắt)
6. Đọc kết quả chuyển đổi và xóa cờ ngắt ADIF
( nếu dùng ngắt) , set bit GO/DONE ( nếu cần
tiếp tục chuyển đổi)
CCS
Các lệnh trong CCS
- #device ADC=xx
với xx là số bit .Với PIC16F877A thì xx=08 hoặc xx=10.
- Setup_ADC(mode)
Mode có thể là:
ADC_OFF // Tắt ADC
ADC_CLOCK_DIV_2 //thời gian lấy mẫu bằng xung Clock/2
ADC_CLOCK_DIV_4 //thời gian lấy mẫu bằng xung Clock/4
ADC_CLOCK_DIV_8 //thời gian lấy mẫu bằng xung Clock/8
ADC_CLOCK_DIV_16 //thời gian lấy mẫu bằng xung Clock/16
ADC_CLOCK_DIV_32 //thời gian lấy mẫu bằng xung Clock/32
ADC_CLOCK_DIV_64 //thời gian lấy mẫu bằng xung Clock/64
ADC_CLOCK_INTERNAL //thời gian lấy mẫu 2-6us
Các hàm trong CCS
- Setup_ADC_ports(Value)
Dùng để xác định chân lấy tín hiệu analog và điện thế
chuẩn sử dụng. Value là:
Các hàm trong CCS
- Set_ADC_channel(channel)
chọn chân để đọc vào giá trị analog bằng lệnh
Read_adc().Với PIC16F877A channel=0->7
- 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.
Mode không bắt buộc:
ADC_START_AND_READ
ADC_START_ONLY
ADC_READ_ONLY
- adc_done( )
Nó trả về TRUE nếu đã thực hiện chuyển đổi A/D,
FALSE nếu vẫn còn bận.
Bài toán
Đọc giá trị ADC 8 bit ở chân AN0(điều chỉnh
bằng biến trở 10k), đọc và xuất ra dãy led ở
portd.
Sơ đồ thuật toán
Chương trình
chính
Đọc giá trị ADC
Hiển thị ADC lên
PORTD
Chương trình
#include
#include
#fuses NOWDT,HS,PUT,NOPROTECT
#device 16f877a*=16 adc=8
#use delay(clock=20000000)
int8 adc;
main()
{
trisd=0;//dau ra
setup_adc(adc_clock_internal);//thoi gian lay mau 2-6us
setup_adc_ports(an0);//AN0 nhan analog
set_adc_channel(0);//chon chan de doc
delay_ms(10);
while(1)
{adc=read_adc();
portd=adc;
}
}