ADC and Led XC8 (part 2)

9:23:00 PM


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:



                                                                  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 AVSS 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 :




Bit 2 : bit báo trạng thái chuyển đổi ADC (A/D Conversion status bit)
GO/ DONE
= 1 Khi cho để bắt đầu thực hiện quá trình chuyển đổi.
GO/ DONE Sau khi chuyển đổi xong thì mạch chuyển đổi làm bit 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 ĐỔI ADC
- Để 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:
DONE Kiểm tra liên tục bit GO/ 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-5:

Ảnh mô phỏng protues.


Đây là code.

#include <stdio.h>
#include <stdlib.h>

#define _XTAL_FREQ 20000000     //defining crystal frequenct to 20 MHz

// PIC16F877A Configuration Bit Settings

#include <xc.h>

// CONFIG
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)


void main()
{
    unsigned short ADCResult;

    TRISD = 0b00000000;     //Setting PORTB as output port
    PORTD = 0b00000000;     //Initializing the port

    ADCON0bits.ADCS  = 0;   //Selecting the clk division factor = FOSC/2
    ADCON1bits.ADCS2 = 0;   //Selecting the clk division factor = FOSC/2

    ADCON1bits.ADFM = 1;    //Result right justified

    ADCON1bits.PCFG = 0;    //Setting all the analog ports as Analog inputs

    ADCON0bits.ADON = 1;    //Turns on ADC module

    ADCON0bits.CHS = 0;     //Selects channel 0 ( AN0 )

    while(1)
    {
    __delay_us(25); //Waits for the acquisition to complete

    ADCON0bits.GO = 1;   //Starts ADC conversion

    while (ADCON0bits.nDONE) continue;   //wait till ADC conversion is over

    ADCResult = (ADRESH<<8) + ADRESL ;   //Merging the MSB and LSB

    if(ADCResult>512)
        PORTD = 255;
    else
        PORTD = 0;
    }
}

Share this

Related Posts

Previous
Next Post »