Anh Nguyễn

nvtienanh.info

MPLAB XC8 – Lập trình đọc ADC

2016-01-13 Anh Nguyễnnotes

Trong bài này chúng ta sẽ học cách lập trình module ADC của vi điều khiển PIC 16F877A dùng trình biên dịch MPLAB XC8.

Tín hiệu của các đại lượng vật lý trong tự nhiên thông thường là tín hiệu analog như nhiệt độ, áp suất, độ ẩm… Chúng ta cần chuyển đổi tín hiệu analog sang tín hiệu số để các thiết bị điện tử như máy tính hoặc vi điều khiển có thể xử lý được. Việc chuyển đổi đó thường được thực hiện bằng một bộ ADC ( Analog to Digital Converter) nó sẽ chuyển tín hiệu liên tục – analog (ở đây là điện áp) sang các giá trị rời rạc Digital.

Vi điều khiển PIC16F877A có 8 cổng ADC 10bit và nó sẽ chuyển tín hiệu analog sang giá trị số - digital 10 bit, điện áp tham chiếu thấp – ADC Lower Reference là 0VDC và mức điện áp tham chiếu cao – ADC Higher Reference là 5VDC.

  • Vref- = 0V
  • Vref+ = 5V
  • n = 10 bits
  • Resolution (Độ phân giải) = (Vref+ – Vref-)/(2^n – 1) = 5/1023 = 0.004887V

Vi điều khiển PIC16F877A với bộ ADC 10 bit thì có độ phần giải là 0.004887V. Ví dụ với mỗi giá trị analog sẽ có giá trị digital tương ứng:

011316 1433 MPLABXC8Lp1

Module ADC của vi điều khiển PIC16F877A gồm có 4 thanh ghi.

  • ADRESH – A/D Result High Register: Thanh ghi này lưu giá trị ADC đọc về
  • ADRESL – A/D Result Low Register: Thanh ghi này lưu giá trị ADC đọc về
  • ADCON0 – A/D Control Register 0: Thanh ghi này chứa các bit điều khiển module ADC
  • ADCON1 – A/D Control Register 1: Thanh ghi này chứa các bit điều khiển module ADC

ADC Block Diagram

011316 1433 MPLABXC8Lp2

From this block diagram you can easily understand the working of ADC channel selection and reference voltage selection.

ADCON0 – A/D Control Register 0

011316 1433 MPLABXC8Lp3

  • Bit 7 ~ 6 : được đặt tên là ADCS1 & ADCS0 ( A/D Clock Selection bits). Các bit này kết hợp với bit ADCS2 của thanh ghi ADCON1 dùng để cài đặt tần số chuyển đổi ADC

    Bảng 1. Clock conversion

ADCON1

ADCON0

<ADCS1:ADCS0>

Clock Conversion

(Tần số đọc ADC)

0

00

FOSC/2

0

01

FOSC/8

0

10

FOSC/32

0

11

FRC

1

00

FOSC/4

1

01

FOSC/16

1

10

FOSC/64

1

11

FRC

  • FOSC là tần số của thạch anh
  • FRC là tần số nội của bộ ADC R/C oscillator
  • Bit 5 ~ 3 : được đặt tên là CH2, CH1 & CH0 là các bit lựa chọn các kênh analog của module ADC

    000 = Channel 0 (AN0)

    001 = Channel 1 (AN1)

    010 = Channel 2 (AN2)

    011 = Channel 3 (AN3)

    100 = Channel 4 (AN4)

    101 = Channel 5 (AN5)

    110 = Channel 6 (AN6)

    111 = Channel 7 (AN7)

  • Bit 2 : Go/Done là bit trạng thái chuyển đổi ADC.

    Khi bit ADON = 1:

    Go/Done = 1 Quá trình đọc ADC đang tiến hành và khi thực hiện xong bit này bị xóa và bằng 0

    Go/Done = 0 Quá trình đọc ADC thực hiện xong.

  • Bit 1 : Không thực thi và có giá trị 0.
  • Bit 0 : ADON, A/D Module On bit. Set bit này ADON = 1 thì module ADC được kích hoạt và khi ADON = 0 thì module ADC bị tắt

ADCON1 – A/D Control Register 1

011316 1433 MPLABXC8Lp4

  • Bit 7 : ADFM, A/D Result Format bit, bit này dùng để cài đặt việc lưu giá trị ADC đọc được trong 2 thành ghi.

    Như đã trình bày ở trên module ADC của vi điều khiển PIC16F877A có 10 và giá trị ADC được lưu ở 2 thanh ghi ADRESH | ADRESL , mỗi thanh ghi là 8 bit vì vậy kết hợp hai thanh ghi chúng ta có tổng cộng 16 bit. Tuy nhiên bộ ADC chỉ lưu giá trị tối đa là 10bit nên sẽ có 6 bit bị bỏ trống. Thanh ghi ADFM sẽ quyết định vị trí của 10 bit ADC sắp xếp như thế nào trong 16 bit của 2 thanh ghi gộp lại.

    ADFM = 1 (Right justified) 6 bit cao của thanh ghi ADRESH không dùng, 10bit ADC được lưu vào các bit còn lại trên 2 thanh ghi

    011316 1433 MPLABXC8Lp5

    ADFM = 0 (Left justified) 6 bit thấp của thanh ghi ADRESL không dùng, 10bit ADC được lưu vào các bit còn lại trên 2 thanh ghi

    011316 1433 MPLABXC8Lp6

  • Bit 6 : ADCS2, A/D Conversion clock selection bit. Xem bảng 1
  • Bit 5 ~ 4 : Không dùng và có giá trị mặc định là 0.
  • Bit 3 ~ 0 : PCFG3 ~ PCFG0, A/D Port Configuration Bits. Bit này để cài đặt các kênh ADC

011316 1433 MPLABXC8Lp7

A/D Acquisition Time

011316 1433 MPLABXC8Lp8

Thông tin cụ thể các bạn có thể xem thêm trong datasheet.

A/D Clock Selection

A/D clock được lựa chọn để đảm bảo TAD là nhỏ nhất, TAD là thời gian xử lý 1bit ADC và có giá trị là 1.6μs. Chúng ta chọn theo trong bảng dưới đây:

011316 1433 MPLABXC8Lp9

Sơ đồ mạch điện

011316 1433 MPLABXC8Lp10

Điện áp tham chiếu được sử dụng là VDD (5V) và VSS (GND), chúng ta sử dụng kênh AN0 của modul ADC đọc giá trị biến trở có giá trị từ 0-5V, bộ ADC sẽ đọc về 10bit digital (0-1023). Giá trị ADC được hiển thị thông qua 10 đèn led nối với PORTB và PORTC như hình trên.

Code MPLAB XC8

// 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 = OFF // Brown-out Reset Enable bit (BOR disabled)

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)

include #define XTALFREQ 8000000

void ADC_Init() { ADCON0 = 0x81; ADCON1 = 0x80; }

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

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

void main() { unsigned int a; TRISA = 0xFF; TRISB = 0x00; TRISC = 0x00; ADC_Init();

do { a = ADC_Read(0); PORTB = a; PORTC = a>>8; _delayms(100); }while(1); }

[product id=“3663”]