Bài 7: MPLAB XC8 – Lập Trình đọc ADC - Tiện ích 123
Có thể bạn quan tâm
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.
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
ADCON0 – A/D Control Register 0

- 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 <ADCS2> | 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

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

- 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

A/D Acquisition Time
Thông tin cụ thể các bạn có thể xem thêm trong datasheet.
A/D Clock Selection
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.
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:

Đ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:
void ADC_Init(){ ADFM=1; //10 bit và 6 bit cao k dung(=0 thi 6 bit thap k dung) ADON=1; //CHo phep ADC hoat dong } unsigned int ADC_Read(unsigned int channel) { //chon kenh CHS0= channel; //ADCS0 CHS1 = channel>>1; //ADCS1 CHS2 = channel>>2; //ADCS2 __delay_ms(5); GO_nDONE = 1; //bat dau thuc hien doc ADC while(GO_nDONE); //Cho ADC thuc hien chuyen doi xong return ((ADRESH<<8)| ADRESL); //Ghep byte thap va byte cao cua gia tri ADC } /*——————————————————————————– //cach tinh nhiet do * do phan giai : x=(5-0)/( 2^10-1)=4.887×10^-3 * chenh lech : 10m/x=2.046 ——————————————————————————–*/ code+ mô phỏng: downloadShare this:
- X
Từ khóa » Ngôn Ngữ Lập Trình Mplab
-
Ngôn Ngữ Lập Trình Mplab C18 - Tài Liệu Text - 123doc
-
Ngôn Ngữ Lập Trình MPLAB C18 | PDF - Scribd
-
Ngôn Ngữ Lập Trình MPLAB C18 - PDFCOFFEE.COM
-
Cơ Bản Về MPLAB X Cho VĐK PIC - Mạch In
-
(PDF) Giao Trinh Học Lập Trinh PIC
-
HƯỚNG DẪN LẬP TRÌNH PIC16F877A TRÊN MPLAB XC8
-
PIC: Cài đặt Phần Mềm MPLABxIDE Và XC8 Compiler - DevIOT
-
Lập Trình VĐK PIC Với MPLAB C18 - TailieuXANH
-
Tạo Một Dự án Với MPLAB X IDE Và MPLAB XC8 - Điện Tử Việt
-
Xin Trình Biên Dịch ASM Dùng Trong MPLAB | Payitforward Community
-
MPLAB XC8: Lập Trình Nháy đèn Led | Anh Nguyễn - Nvtienanh
-
[PDF] Tài Liệu Học Tập Vi điều Khiển ứng Dụng Trong đo
-
MPLAB Pickit 4 Trong Mạch Trình Gỡ Lỗi Nhanh Chóng Và Dễ ...
-
Lập Trình C Trong Vi điều Khiển (Phần 1) - Điện Tử Hello