Thứ Tư, 24 tháng 2, 2016

BÀI 21 : ADC PIC16F887 XC8

I.  GIỚI THIỆU 
Ở chương  này khảo sát  vi điều khiển giao tiếp với vi mạch chuyển đổi tương tự sang số (ADC) và vi điều khiển có tích hợp ADC để thực hiện các ứng dụng trong đo lường và điều khiển.
Sau khi kết thúc chương này bạn có thể  kết nối vi điều khiển không có tích hợp bộ chuyển đổi ADC với các vi mạch ADC, sử dụng  được  vi điều khiển có tích hợp ADC, biết trình tự thực hiện quá trình chuyển đổ i ADC, biết tính toán độ phân giải,  chuyển đổi và tính trung bình kết quả.
II.  ADC CỦA VI ĐIỀU KHIỂN PIC 16F887 
Vi điều khiển PIC 16F877A  có bộ chuyển đổi tín hiệu tương tự sang tín hiệu số ADC 10 bit đa hợp 8 kênh và PIC 16F887 có 14 kênh. Mạch ADC dùng cho các ứng dụng giao tiếp với tín hiệu tương tự  có thể nhận  từ các cảm biến như cảm biến nhiệt độ LM35, cảm biến áp suất, cảm biến độ ẩm,  cảm biến khoảng cách, …
Phần này sẽ khảo sát chi tiết khối ADC của PIC, các thanh ghi của khối ADC, trình tự thực hiện chuyển đổi, tập lệnh lập trình C cho ADC  và ứng dụng ADC để đo nhiệt độ.
1.  KHẢO SÁT ADC CỦA PIC 16F887
ADC của PIC16F887 có sơ đồ khối như hình 7-1:
Chức năng các thành phần:
  AN0 đến AN13 (analog) là 14 ngõ vào của 14 kênh tương tự được đưa đến mạch đa hợp. 
  CHS<3:0> là các ngõ vào chọn kênh của bộ đa hợp tương tự. 
  Tín hiệu kênh tương tự đã chọn sẽ được đưa đến bộ chuyển đổi ADC.
  Điện áp tham chiếu dương Vref+ có thể lập trình nối với nguồn cung cấp dương AVDD
hoặc điện áp tham chiếu bên ngoài nối với ngõ vào Vref+ của chân AN3, bit lựa chọn là 
VCFG0.
  Điện áp tham chiếu âm Vref-  có thể lập trình nối với nguồn cung cấp AV
SS hoặc điện áp tham chiếu bên ngoài nối với ngõ vào Vre- của chân AN2, bit lựa chọn là VCFG1.
  Hai ngõ vào Vref+ và Vref- có chức năng thiết lập độ phân giải cho ADC.
  Bit  ADON  có  chức  năng  cho  phép  ADC  hoạt  động  hoặc  tắt  bộ  ADC  khi  không  hoạt 
động để giảm công suất tiêu tán, ADON bằng 1 thì cho phép, bằng 0 tắt.
  Kết  quả  chuyển  đổi  là  số  nhị  phân  10  bit  sẽ  lưu  vào  cặp  thanh  ghi  16  bit  có  tên  là ADRESH và ADRESL, 10 bit kết quả lưu vào thanh ghi 16 bit nên có dạng lưu là canh lề trái và canh lề phải tùy thuộc vào bit lựa chọn có tên ADFM.
ADC có 14 kênh nhưng mỗi thời điểm chỉ chuyển đổi 1 kênh và chuyển đổi  kênh nào thì phụ thuộc vào 4 bit chọn kênh CHS4:CHS0. Hai ngõ vào điện áp tham chiếu dương và âm có thể lập trình nối với nguồn VDD và VSS hoặc nhận điện áp tham chiếu từ bên ngoài qua 2 chân RA3 và RA2.
Khối ADC độc lập với CPU nên có thể hoạt động khi CPU đang ở chế độ ngủ do xung cung cấp cho ADC lấy từ dao động RC bên trong của khối ADC.
2.  KHẢO SÁT CÁC THANH GHI CỦA PIC 16F887
Khối ADC có 4 thanh ghi:
Thanh ghi lưu kết quả byte cao: ADRESH (A/D Result High Register)
Thanh ghi lưu kết quả byte thấp: ADRESL (A/D Result Low Register)
Thanh ghi điều khiển ADC thứ 0: ADCON0 (A/D Control Register 0)
Thanh ghi điều khiển ADC thứ 1: ADCON1 (A/D Control Register 1)
a.  Thanh ghi ADCON0 (ADC Control register)chứa các bit điều khiển khối ADC như sau:
- Bit 7-6  ADCS<1:0>: Các bit  lựa chọn xung chuyển đổi AD (AD Conversion Clock Select bits) :
00 = FOSC/2
01 = FOSC/8
10 = FOSC/32
11 = FRC  (xung clock lấy từ bộ dao động nội bên trong có tần số lớn nhất là 500 kHz)
Bit 5-3  CHS<3:0>: Các bit lựa chọn kênh tương tự (Analog Channel Select bits) như bảng 7-1:
- Bit 2 DONE GO /: bit báo trạng thái chuyển đổi ADC (A/D Conversion status bit)
Khi cho GO/DONE = 1 để bắt đầu thực hiện quá trình chuyển đổi.
Sau khi chuyển đổi xong thì mạch chuyển đổi làm bit GO/DONE xuống mức 0.
- Bit 0  ADON: bit mở nguồn cho ADC hoạt động (AD ON bit):
         ADON = 1 có chức năng mở nguồn cho khối chuyển đổi ADC hoạt động.
         ADON = 0 sẽ tắt nguồn khối chuyển đổi ADC để giảm công suất tiêu thụ.
b.  Thanh ghi ADCON1 thiết lập các chân của port là tương tự hoặc xuất nhập số IO. 
- Bit 7  ADFM: bit lựa chọn định dạng kết quả ADC (AD Result Format Select bit):
ADFM = 1: có chức năng canh lề phải, 6 bit MSB của ADRESH có giá trị là „0‟.
ADFM = 0: có chức năng canh lề trái, 6 bit LSB của ADRESL có giá trị là „0‟.
- Bit 5  VCFG1: bit lựa chọn điện áp tham chiếu (Voltage reference bit)
VCFG1 = 1: có chức năng nối điện áp tham chiếu Vref- với ngõ vào AN3.
VCFG1 = 0: có chức năng nối điện áp tham chiếu Vref- với VSS.
- Bit 4  VCFG0: bit lựa chọn điện áp tham chiếu (Voltage reference bit)
VCFG0 = 1: có chức năng nối điện áp tham chiếu Vref+ với ngõ vào AN3 .
VCFG0 = 0: có chức năng nối điện áp tham chiếu Vref+ với VDD
- Bit 6, 3-0: chưa dùng nếu đọc sẽ có giá trị là „0‟
c.  Thanh ghi ADRESH và ADRESL
Cặp thanh ghi 16 bit ADRESH:  ADRESL dùng để lưu kết quả chuyển đổi 10 bit của ADC sau khi chuyển đổi xong. Do kết quả chỉ có 10 bit nhưng lưu trong cặp thanh ghi 16 bit   nên có 2 kiểu định dạng tùy  thuộc vào bit ADFM (ADC Format). 
Hình sau trình bày 2 kiểu định dạng của cặp thanh ghi kết quả:

Chức năng của canh lề phục vụ cho 2 khả năng xử lý kết quả: nếu lấy kết quả 10 bit để xử lý thì nên chọn chế độ canh lề phải, còn nếu lấy kết quả 8 bit thì chọn chế độ canh lề trái  và chỉ lấy kết quả của thanh ghi byte cao ADRESH, bỏ đi 2 bit có trọng số thấp nhất của thanh ghi ADRESL và chú ý đến tính toán giá trị, trong chương trình C nếu không khai báo thuộc tính ADC 10 bit thì phần mềm tự động lấy giá trị 8 bit cao.
3.  TRÌNH TỰ THỰC HIỆN CHUYỂN 
Để thực hiện chuyển đổi ADC thì phải thực hiện các bước sau:
- Bước 1: Cấu hình cho port:
Cấu hình cho các port ở chế độ ngõ vào tương tự.
Không được định cấu hình cho các port ở chế độ xuất dữ liệu.
- Bước 2: Cấu hình cho module ADC:
Chọn xung clock cho chuyển đổi ADC.
Định cấu hình cho điện áp chuẩn.
Chọn kênh ngõ vào tương tự cần chuyển đổi.
Chọn định dạng cho 2 thanh ghi lưu kết quả.
Mở nguồn cho ADC.
- Bước 3: Thiết lập cấu hình ngắt ADC nếu sử dụng:
Xóa cờ báo ngắt ADIF của ADC.
Cho bit ADIE bằng 1 để cho phép ADC ngắt.
Cho bit PEIE bằng 1 để cho phép ngắt ngoại vi.
Cho bit GIE bằng 1 để cho phép ngắt toàn cục.
- Bước 4: Chờ hết thời gian ổn định theo yêu cầu.
- Bước 5: Bắt đầu chuyển đổi bằng cách cho bit GO/DONE lên 1.
- Bước 6: Kiểm tra chuyển đổi ADC kết thúc bằng cách:
Kiểm tra liên tục bit GO/DONE nếu về 0 thì quá trình chuyển đổi kết thúc. Nếu dùng ngắt thì chờ ngắt ADC  xảy ra.
- Bước 7: Đọc cặp thanh ghi kết quả (ADRESH: ADRESL), xóa bit ADIF nếu dùng ngắt.
- Bước 8: Thực hiện chuyển đổi kế tiếp. 
4.  LỰA CHỌN NGUỒN XUNG CHO CHUYỂN ĐỔI ADC
Tần số xung clock cho bộ chuyển đổi ADC được lựa chọn bằng phần mềm bởi các bit ADCS nằm trong thanh ghi ADCON0. Có 4 lựa chọn cho nguồn xung clock như sau:
FOSC/2
FOSC/8
FOSC/32
FRC lấy từ bộ dao động bên trong.
Tần số xung clock tùy chọn phụ thuộc vào tần số bộ dao động như bảng 7-2:
Thời gian chuyển đổi ADC cho mỗi bit được xác định  bởi chu kỳ  TAD.  Để chuyển đổi  hoàn tất 10 bit sẽ dùng tối thiểu 11 chu kỳ TAD
như hình 7-5.
- Đây là ảnh mô phỏng protues.

adc pic1f887

- Đây là code chương trình.
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#define _XTAL_FREQ 4000000
// CONFIG1
#pragma config FOSC = XT        // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = OFF        // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)

// CONFIG2
#pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)
void ADC_Init()
{
   ADCON0 = 0x41;
   ADCON1 = 0xC0;
}

unsigned int ADC_Read(unsigned char channel)
{
   if(channel > 7)
     return 0;

   ADCON0 &= 0xC5;
   ADCON0 |= channel<<3;
   __delay_ms(2);
   GO_nDONE = 1;
   while(GO_nDONE);
   return ((ADRESH<<8)+ADRESL);
}

void main()
{
   unsigned int a;
   TRISC = 0x00;
   TRISD = 0x00;
   PORTD = 0;
   PORTC = 0; 
   ADC_Init();

   do
   {
     a = ADC_Read(0);
     PORTC = a;
     PORTD = a>>8;
     __delay_ms(100);
   }while(1);
}
- Link download project Click here


EmoticonEmoticon