adc với pic 18f4520
TRANSCRIPT
7/29/2019 ADC với Pic 18f4520
http://slidepdf.com/reader/full/adc-voi-pic-18f4520 1/5
ADC vớ i Pic 18f4520
1.Giớ i Thiệu:
Bộ chuyển đổi tương tự -số hay gọi tắt là ADC đượ c viết tắt bở i cụm từ tiếng anh (Analog to
Digital Converter) nó có chức năng lấy mức điện áp vào tương tự sau một thờ i gian biến đổi nó
sẽ sinh ra mã đầu ra dạng số biểu diễn đầu vào tương tự .Bộ chuyển đổi tương tự ứng dụng r ất
r ộng rãi trong đo lường và điều khiển sử dụng vi điều khiển thuộc họ VĐK 8051 không đượ ctích hợ p Mudule ADC trong chip vì vậy tạ p cho mạch điện.ADC đượ c ứng dụng r ộng rãi trong
đo lườ ng chúng ta càn phải ghép nối vớ i vi mạch biến đổi ADC,ví dụ như ADC0804,sự ghép nốinày tạo ra sự phức điều khiển nên các hãng sản xuất đã tích hợ p module ADC vào trong chip,r ất
tiện chúng lợ i cho việc phát triển các ứng dụng.Trong nôi dung bài viết này ta sẽ nghiến cứu cụ
thể về ADC trong vi điều khiển PIC 18f4520 của hãng Microchip
các thông số k ỹ thuật quan tr ọng của ADC:
- Độ phân giải của ADC đượ c biểu thị bằng số bít của tín hiệu đầu ra.Số lượ ng bít càng nhiều thì
sai số lượ ng tử càng nhỏ
-Tốc độ chuyển đổi được xác định bằng thờ i gian hoàn thành một lần chuyển đổi.Thờ i gian này
đượ c tính từ khi có lệnh điều khiển chuyển đổi đến khi có tín hiệu số đầu ra.
2.Bộ chuyển đổi ADC trong vi điều khiển PIC18f4520-Giớ i thiệu về ADC 10 bít trong pic18f4520.
VI điều khiển PIC 18f4520 đượ c tích hợ p module ADC với 13 đầu vào tương tự từ AN0 -
AN12,độ phân giải lad 10 bít số.
*các thanh ghi trong mudule ADC
+Thanh ghi chứa k ết quả của byte cao ADRESH(A/D result high register)
+Thanh ghi chứa k ết quả của byte thấ p ADRESH(A/D result low register)
7/29/2019 ADC với Pic 18f4520
http://slidepdf.com/reader/full/adc-voi-pic-18f4520 2/5
+Thanh ghi điều khiển A/D 0 ADCON0 (A/D control register 0)
Thanh ghi ADCON0 đượ c sử dụng để điều khiển hoạt động của các module AD.thanh ghi
ADCON1 đượ c sử dụng để cấu hình các chân AN0 đến AN12 của các cổng vào /ra(vào ra tươngtự hay song song).Thanh ghi ADCON2 đượ c sử dụng để cấu hình nguồn xung cho module
ADC,thờ i gian thu nhận và lựa chọn cách đặt 10 bít số sau khi biến đổi vào thanh ghi k ết quả
ADRESH và ADRESL.
Nguyên Lý:
7/29/2019 ADC với Pic 18f4520
http://slidepdf.com/reader/full/adc-voi-pic-18f4520 3/5
Code Chương Trình
#include<p18f4520.h>
#include<stdio.h>
#include <adc.h> // gọi hàm adc
#include <delays.h>
#define LCD_DATA PORTD
#define LCD_RS PORTEbits.RE0
#define LCD_RW PORTEbits.RE1
#define LCD_EN PORTEbits.RE2
char mang[80];
unsigned int AD; // giá tr ị số khi đọc ADC
void khoitao(void);//định nghĩa hàm khở i tạo có kiểu k xác định
void ghilenh(char lenh);//định nghĩa hàm ghi lệnh kiểu char
void ghidata(char data);
void chuoi (char *str);//định nghĩa chuỗi
void ADC0(void);// hàm đọc ADC0
void ADC0(void)
{
OpenADC(
ADC_FOSC_32 & // chọn tần số hoạt động hay nghĩa là khai báo xung nhị p chuyển đổi ad=1/32xung nhị p hệ thống
ADC_RIGHT_JUST & //khai báo dồn phải dữ liệu khi chuyển đổi
ADC_12_TAD,//12 AD chuyển đổi đồng hồ chậm tr ễ
ADC_CH0 & //chọn kênh CH0
ADC_INT_OFF& //khai bao không sử dụng ngắt cho ADC
ADC_VREFPLUS_VDD& //Vref+ = 5V
ADC_VREFMINUS_VSS, //Vref- = 0V
14);//ADCON1=OX0E;E=14 //chọn chân AN0
ConvertADC(); // bắt đầu hoạt động
while(BusyADC() ); // chờ hoạt đọng xong
AD = ReadADC(); // đọc và lưu giá trị vào AD
CloseADC(); // dừng hoạt động
}
void khoitao (void)
7/29/2019 ADC với Pic 18f4520
http://slidepdf.com/reader/full/adc-voi-pic-18f4520 4/5
{
ghilenh(0x03);
ghilenh(0x38);
ghilenh(0x06);
ghilenh(0x0c);
ghilenh(0x01);
}
void ghilenh (char lenh)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 1;
LCD_DATA = lenh;LCD_EN = 0;
Delay1KTCYx(10);//10mS
}
void ghidata (char data)
{
if(data=='\n')
{
ghilenh(0xC0);
Delay1KTCYx(10);//10mS
return;}
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 1;
LCD_DATA = data;
LCD_EN = 0;
Delay1KTCYx(10);//10mS
}
void ghichuoi (char *str)
{
while(*str)
{
ghidata(*str);
str++;
}
7/29/2019 ADC với Pic 18f4520
http://slidepdf.com/reader/full/adc-voi-pic-18f4520 5/5
}
void main()
{
float AD1;
unsigned int AD2;
TRISD=0x00;//set port D là đầu ra
TRISE=0X00;
TRISA=0X01; //chọn RA0 là chiều vào
ADCON1=0X0E; //chọn kênh CH0
khoitao();
ghilenh(0x82);
sprintf(&mang[0],"Welcome to ");
ghichuoi(&mang[0]);
ghilenh(0xc2);sprintf(&mang[0],"Techshowvn.com ");
ghichuoi(&mang[0]);
Delay1KTCYx(10000);
while(1)
{
ADC0(); // đọc ADC0
AD1=(float)(AD*5)/1023; // tính ra giá tr ị điện áp
AD2=(unsigned int)(AD1*1000);//chuyển về mV, ép kiểu số nguyên// hiển thị lên LCD giá tr ị số đọc đượ c AD và giá tr ị điện áp tương ứng
ghilenh(0X80);
sprintf(&mang[0],"ADC0 = %4d \nVolt = %d.%d V ",AD,AD2/1000,AD2%1000);
ghichuoi(&mang[0]);
}
}