Bit 7,6 ADCS1:ADCS0 A/D Conversion Clock Select bit.
Trang 1Bài 5: ADC
N i dung ộ
Modul ADC trong PIC16F877A
Ứng d ng c a ADC ụ ủ
Trang 2Gi 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
Trang 3Gi 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<2>) được xóa v 0 và c ng t ADIF đề ờ ắ ược set
Trang 4Quy 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
Trang 51 Thi t l p các thông s cho ADC ế ậ ố
bit 3-0 PCFG3:PCFG0: A/D Port Configuration Control bits
Trang 61 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
Trang 71 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)ậ
Trang 8Quy 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 ư ể
• 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 ấ ả
• Set bit GIE(Global Interrupt Enable bit= 1 cho phép t t c các ng t) ấ ả ắ
Trang 9Quy 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) ế ụ ể ổ
Trang 11CCS
Trang 12Cá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 ờ ấ ẫ
Trang 13Cá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à:ẩ ử ụ
Trang 14Cá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.ế ẫ ậ
Trang 15Bà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
Trang 16S đ thu t toán ơ ồ ậ
Ch ươ ng trình chính
Đ c giá tr ADC ọ ị
Hi n th ADC lên ể ị PORTD
Trang 17Ch ươ ng trình
#include<16f877a.h>
#include <def_877a.h>
#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;
}
Trang 18Bài toán
Đo nhi t đ s d ng LM35 trên chân AN1.ệ ộ ử ụ