GIỚI THIỆU VỀ ADC CỦA PIC ADC là bộ chuyển đổi tín hiệu tương tự thành tín hiệu số... Bộ chuyển đổi ADC có cấu trúc độc lập để có thể hoạt động trong khi vi điều khiển đang ở chế độ Slee
Trang 1TÌM HIỂU VỀ ADC CỦA VI ĐIỀU KHIỂN
PIC 16F877A
I GIỚI THIỆU VỀ ADC CỦA PIC
ADC là bộ chuyển đổi tín hiệu tương tự thành tín hiệu số
Trang 3PIC 16F877A có 8 ngõ vào Analog ( RA0:RA4 and RE0:RE2) và mỗi kênh ADC là 10 bit với chip 40 chân Hiệu điện thế chuẩn V REF 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 2 chân RA2, RA3
Bộ chuyển đổi ADC có cấu trúc độc lập để có thể hoạt động trong khi vi điều khiển đang ở chế độ Sleep, xung cung cấp cho ADC lấy từ dao động RC bên trong của khối ADC
Kết quả chuyển đổi từ tín hiệu tương tự sang số là 10 Bit số tương ứng và được lưu trong 2 thanh ghi:
lưu trong 2 thanh ghi: ADRESH, ADRESL
Khi không sử dụng bộ chuyển đổi ADC, các thanh ghi này có thể được sử dụng như các thanh ghi thông thường khác Khi quá trình chuyển đổi hoàn tất, kết quả
sẽ được lưu vào 2 thanh ghi
sẽ được lưu vào 2 thanh ghi ADRESH, ADRESL Bit
được xóa về
được xóa về 0 và cờ ngắtvà cờ ngắt ADIF đượcđược SET
II. KHỐI ADC TRONG PIC
Các thanh ghi liên quan đến bộ chuyển đổi ADC
Trang 4Ø Thanh ghi ADCON0 ( ADDRESS 1FH): có chức năng điều khiển hoạt động
của thanh ghi ADC
Bit 6-7: các bit lựa chọn xung chuyển đổi AD.
Bit 3-5: các bit lựa chọn kênh tương tự.
Bit 2 : bit báo trạng thái chuyển đổi ADC
Bit 1 : Chưa dùng nếu đọc là ‘0’
Bit 0 : bit mở nguồn cho ADC hoạt động
Bit 7,6 : Dùng lựa chọn tần số chuyển đổi
Trang 5Bit 5-3 : CHS2:CHS0: Các bit lựa chọn kênh tương tự
Trang 6Ø Bit 2: GO/DONE:
Bit này bằng 1 khi chuyển đổi ADC đang diễn ra.
Bit này bằng 0 khi quá trình chuyển đổi kết thúc.
Ø Bit 0: ADON
Bit này bằng 1 thì khối ADC được mở nguồn
Bit này bằng 0 thì khối ADC bị tắt nguồn để giảm bớt công suất tiêu thụ.
Thanh ghi ADCON1 ( ADDRESS 9FH) :
Thiết lập chức năng cho các chân của Port là ngõ vào nhận tương tự hoặc chân xuất nhập I/O
Trang 7Bit 7 : bit lựa chọn định dạng kết quả ADC.
Bit =1 canh lề phải,ngược lại canh lề trái
Bit 6 ( ADCS2): bit lựa chọn xung clock cho chuyển đổi ADC.
Trang 8Bit 5-4: chưa dùng nếu đọc sẻ có giá trị là ‘0’ Bit 3-0: bit điều khiển ADC.
Trang 9THANH GHI ADRESH, ADRESL
Chứa kết quả 10 bits của chuyển đổi
III Quy trình chuyển đổi từ tương tự sang số gồm những bước sau
Thiết lập các thông số cho bộ chuyển đổi ADC
ghi ADCON1).
Thiết lập các cờ ngắt cho bộ ADC Thiết lập các cờ ngắt cho bộ ADC
Ø Clear bit ADIF(ADC Interrupt Flag bit =0 chưa hoàn thành chuyển đổi)
Trang 10Ø 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)
Đợi cho quá trình lấy mẫu hoàn tất Đợi cho quá trình lấy mẫu hoàn tất
Bắt đầu quá trình chuyển đổi ( Set Bit )
Đợi cho tới khi quá trình chuyển đổi hoàn tất bằng cách:
Kiểm tra Bit Nếu Bit =0 thì quá trình chuyển đổi
hoàn tất.
Kiểm tra cờ ngắt.
Đọc kết quả chuyển đổi và xóa cờ ngắt, set bit ( nếu cần tiếp tục chuyển đổi).
Tiếp tục thực hiện các bước 1 và 2 cho quá trình chuyển đổi tiếp theo
IV BÀI TOÁN
Trang 11Đọc giá trị ADC 8 bit ở chân AN0 (điều chỉnh bằng biến trở 10k), và kiểm tra nếu áp ngõ vào analog > 2.5V thì bật các LED gắn ở PORTB lên
#include <pic.h>
CONFIG(0X3F7A);
#define _XTAL_FREQ 20000000
void port_init(void);
void adc_init(void);
void int_init(void);
void interrupt isr(void);
// -void port_init(// -void)
{
TRISA0 = 1; //khai bao RA0 la Input de doc ADC
Trang 12TRISB = 0X00; //khai bao PortB xuat LED nen la OutPut
PORTB = 0xFF; // Tat het LED o portB
}
// -void adc_init(// -void) { PCFG0=0; //chon dien ap mau dua tren cac thong so cua thanh ghi ADCON1 PCFG1=0; // VREF+ =VDD, VREF- = VSS
PCFG2=0;
PCFG3=0;
ADCS1 = 0; // chon tan so lay mau // ADC conversion clock: = Fosc/8 ADCS0 = 1;
// Select Input chanel: AN0 CHS1 = 0; // CHS <2:0> = 000 Select AN0
CHS2 = 0; CHS0 = 0;
ADFM = 1; // ADFM = 1 Right justified ADFM = 0 Left justified Result format ADON = 1; // Turn on ADC Module delay_ms (1); //delay to wait for adc module init }
// -//interrupt initialization THIET LAP CO NGAT CHO BO ADC void int_init() { GIE = 1; //Global Interrupt Enable //cho phep tat cac cac ngat xay ra PEIE = 1; //Peripheral Interrupt Enable // cho phep tat ca ngat ngoai vi ADIE = 1; //ADC Interrupt Enable // cho phep ngat adc ADIF = 0; //Clear ADC Interrupt Flag // xoa co ngat }
// -void interrupt isr() { int ADC_result; if (ADIF== 1) //neu ngat adc xay ra {
ADIF = 0; //Clear ADC Interrupt Flag//Read ADC result
Trang 13ADC_result = (ADRESH<<8)|ADRESL;
if (ADC_result> 512) //V_in > 2.5V <=> ADC_result > 512
{
PORTB = 0; //bat cac led o port b
}
else
{
PORTB = 0xFF;
}
}
}
void main(void)
{
port_init();
adc_init();
int_init();
while(1)
{
delay_us(50); //delay between 2 AD conversions //delay giua 2 lan chuyen doi GO_DONE = 1; //Set GODONE bit to start conversion //BAT BIT GO/DONE
DE BAT DAU LAN CHUYEN DOI TIEP THEO
};
}