Ví dụ: Nếu VREF+=5volt, VREF-=0volt thì khi thực hiện biến đổi ta sẽ có giá trị số tương ứng với các giá trị điện áp tương tự như sau: Điện áp tương tự đầu vào Giá trị số đầu ra Ghi chú
Trang 1Bộ biến đổi tương tự - số (Analog - Digital Converter: ADC)
Nội dung:
- Giới thiệu về ADC
- ADC trên PIC18F4520
- Lập trình biến đổi điện áp tương tự
1 Giới thiệu về ADC
Xem mục 1.1.1 trong giáo trình Tham khảo thêm:
https://voer.edu.vn/m/chuyen-doi-tuong-tu-so-adc-analog-digital-converter/d8fd4bc1
2 ADC trên PIC18F4520
Xem mục 6.1.2 trong giáo trình
Các vấn đề cần ghi nhớ:
- PIC18F4520 có 01 bộ ADC với 13 kênh (tại 1 thời điểm chỉ biến đổi được điện áp tương tự
từ 1 kênh)
- ADC trên PIC18F4520 có độ phân giải là 10bit, nghĩa là giá trị số ở đầu ra của ADC là một
số nguyên có giá trị từ 0 đến 1023
Ví dụ: Nếu VREF+=5(volt), VREF-=0(volt) thì khi thực hiện biến đổi ta sẽ có giá trị số tương ứng với các giá trị điện áp tương tự như sau:
Điện áp tương tự (đầu vào) Giá trị số (đầu ra) Ghi chú
…
Trong trường hợp cụ thể này, nếu đọc được từ ADC một giá trị số là x thì điện áp tương tự ở đầu vào sẽ là 5∗x
1023 (volt)
3 Lập trình biến đổi tương tự - số
Có 2 cách lập trình biến đổi tương tự - số bao gồm:
- Lập trình sử dụng thanh ghi (xem mục 7.3.3 trong giáo trình):
- Lập trình sử dụng các hàm trong thư viện pwm.h (xem mục 6.4 trong tài liệu tra cứu PIC) Cách này đơn giản hơn
Lưu ý:
Hàm OpenADC gồm 03 đối số (c onfig, config2 và portconfig) Các đối số
config, config2 được kết hợp bởi nhiều tham số bằng toán tử &
Ví dụ:
(1) Lựa chọn lần lượt 3 tham số của đối số config (trang 57) ta sẽ được:
Trang 2ADC_FOSC_2 & ADC_RIGHT_JUST & ADC_0_TAD
(2) Lựa chọn lần lượt 4 tham số của đối số config2 (trang 58) ta sẽ được:
ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS
(3) Đối số portconfig cần phải chọn theo tham số ADC_CH0 nên sẽ là 14
(hệ thập phân) hoặc 00001110 (hệ nhị phân) hoặc 0x0E (hệ hexa)
Cuối cùng hàm OpenADC được viết như sau:
OpenADC (
ADC_FOSC_2 & ADC_RIGHT_JUST & ADC_0_TAD,
ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS, 14);
3.1 Các bước lập trình với ADC:
(1) Copy khung chương trình (không sử dụng ngắt), thêm #include<adc.h>
(2) Xác định các chân vào ra và viết lệnh với TRIS, ADCON1
(3) Lựa chọn các tham số và viết hàm OpenADC
TIPS: Gõ từ khóa OpenADC để tìm hàm này trong “Tài liệu tra cứu PIC”; giá trị của
portconfig là giá trị khởi tạo cho ADCON1
(4) Viết các lệnh đọc giá trị số từ ADC, bao gồm:
ConvertADC(); // ra lệnh biến đổi
while(BusyADC()); // chờ biến đổi xong
x=ReadADC(); // Đọc giá trị số lưu vào biến x (x là biến kiểu unsigned int)
(5) Viết các lệnh theo yêu cầu đề bài
3.2 Ví dụ:
Vẽ, lắp ráp mạch điện và lập trình theo yêu cầu:
a Vẽ, lắp ráp mạch điện như sau:
- Sử dụng biến trở để tạo điện áp 0 đến 5V nối với
chân AN0.
- LED1-LED8 nối lần lượt với các chân RD0:RD7;
I/O pin
VR
10k
5V
R
560
LED
+88.8
Volts
b Vẽ lưu đồ thuật toán và viết chương trình theo yêu cầu như sau:
- Đọc giá trị số biến đổi được từ điện áp trên kênh AN0 và hiển thị dưới dạng số nhị phân trên LED1-LED10 LED sáng tương ứng bit “1”, LED tắt tương ứng bit “0”; bit có trọng số lớn nhất (D9) tương ứng LED10, bit có trọng số nhỏ nhất (D0) tương ứng LED1.
Trang 3B1: Copy khung chương trình (không sử dụng ngắt), thêm #include<adc.h>
B2: Xác định các chân vào ra và viết lệnh với TRIS, ADCON1:
Chân AN0/RA0: Chiều vào, dạng tín hiệu: tương tự; Các chân RD0-RD7, RC0-RC1: Chiều
ra, dạng tín hiệu: số
TRISA=0xFF; // AN0/RA0: vào
TRISC=0x00; //RC0, RC1: ra
TRISD=0x00; //RD0-RD7: ra
ADCON1=0x0e; // AN0: tương tự, AN1-AN12: số
B3: Lựa chọn các tham số và viết hàm OpenADC:
Đề bài yêu cầu biến đổi điện áp trong dải từ 0 – 5V trên chân AN0 nên cần chọn:
OpenADC (
ADC_FOSC_2 & ADC_RIGHT_JUST & ADC_0_TAD,
ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS, 14);
B4: Viết các lệnh đọc giá trị số từ ADC:
Trang 4ConvertADC(); // ra lệnh biến đổi
while(BusyADC()); // chờ biến đổi xong
x=ReadADC(); // Đọc giá trị số lưu vào biến x (x là biến kiểu unsigned int)
B5: Viết các lệnh theo yêu cầu đề bài:
Biến x gồm 16 bit, trong đó có 10 bit phía phải chứa giá trị số đọc được từ ADC (do hàm OpenADC chọn tham số ADC_RIGHT_JUST):
D1
Không sử dụng Chứa giá trị số đọc từ hàm ReadADC()
Để hiển thị theo yêu cầu đề bài cần:
- Xóa đi các bit không sử dụng bằng lệnh:
x=x & 0b0000001111111111;
- Lấy các bit D0-D7 hiển thị trên các LED1-LED8 ở RD0-RD7 bằng lệnh:
PORTD=x % 256;
- Lấy các bit D8-D9 hiển thị trên các LED9-LED10 ở RC0-RC1 bằng lệnh:
PORTD=x / 256;
Chương trình đầy đủ như sau:
// B1 Viet khung CT vi dieu khien PIC
#include<p18f4520.h>
#include<delays.h>
#include<adc.h>
#pragma config OSC = HS
#pragma config LVP = OFF
#pragma config MCLRE = ON
#pragma config WDT = OFF
// chuong trinh con
unsigned int x;
void main (void)
{
// B2 Vao ra
TRISA=0xff;
TRISC=0x00;
TRISD=0x00;
ADCON1=0x0e; // AN0 - tuong tu
// B3 Cau hinh ADC
OpenADC (
ADC_FOSC_2 & ADC_RIGHT_JUST & ADC_0_TAD,
ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS, 14);
Trang 5{
// B4 Doc ADC ConvertADC(); // ra lenh bien doi while(BusyADC()); // cho bien doi xong x=ReadADC();
// B5
x=x&0b0000001111111111;
PORTD=x%256;
PORTC=x/256;
}
}
Vẽ mạch mô phỏng:
Lấy biến trở:
Lấy voltmeter:
Trang 6Kết quả mô phỏng:
- Khi điện áp là 5V: Giá trị số biến đổi được sẽ là 1023=0b1111111111 Các LED trên các chân RD0-RD7 và RC0, RC1 sáng
RA0/AN0/C1IN-2
RA1/AN1/C2IN-3
RA2/AN2/C2IN+/VREF-/CVREF 4
RA3/AN3/C1IN+/VREF+
5 RA4/T0CKI/C1OUT 6
RA5/AN4/SS/HLVDIN/C2OUT 7
RA6/OSC2/CLKO 14
RA7/OSC1/CLKI 13
RB0/AN12/FLT0/INT0 33
RB1/AN10/INT1 34
RB2/AN8/INT2 35
RB3/AN9/CCP2A 36
RB4/KBI0/AN11 37
RB5/KBI1/PGM 38
RB6/KBI2/PGC 39
RB7/KBI3/PGD 40
RC0/T1OSO/T13CKI 15 RC1/T1OSI/CCP2B 16 RC2/CCP1/P1A 17 RC3/SCK/SCL 18 RC4/SDI/SDA 23 RC5/SDO 24 RC6/TX/CK 25 RC7/RX/DT 26 RD0/PSP0 19 RD1/PSP1 20 RD2/PSP2 21 RD3/PSP3 22 RD4/PSP4 27 RD5/PSP5/P1B 28 RD6/PSP6/P1C 29 RD7/PSP7/P1D 30 RE0/RD/AN5 8 RE1/WR/AN6 9 RE2/CS/AN7 10 RE3/MCLR/VPP 1
U1
PIC18F4520
RV1
1k
Volts
+5.00
Trang 7- RA0/AN0/C1IN-2
RA1/AN1/C2IN-3
RA2/AN2/C2IN+/VREF-/CVREF 4
RA3/AN3/C1IN+/VREF+
5 RA4/T0CKI/C1OUT 6
RA5/AN4/SS/HLVDIN/C2OUT 7
RA6/OSC2/CLKO 14
RA7/OSC1/CLKI 13
RB0/AN12/FLT0/INT0 33
RB1/AN10/INT1 34
RB2/AN8/INT2 35
RB3/AN9/CCP2A 36
RB4/KBI0/AN11 37
RB5/KBI1/PGM 38
RB6/KBI2/PGC 39
RB7/KBI3/PGD 40
U1
PIC18F4520
RV1
1k
Volts
+3.20
- RA0/AN0/C1IN-2
RA1/AN1/C2IN-3
RA2/AN2/C2IN+/VREF-/CVREF 4
RA3/AN3/C1IN+/VREF+
5 RA4/T0CKI/C1OUT 6
RA5/AN4/SS/HLVDIN/C2OUT 7
RA6/OSC2/CLKO 14
RA7/OSC1/CLKI 13
RB0/AN12/FLT0/INT0 33
RB1/AN10/INT1 34
RB2/AN8/INT2 35
RB3/AN9/CCP2A 36
RB4/KBI0/AN11 37
RB5/KBI1/PGM 38
RB6/KBI2/PGC 39
RB7/KBI3/PGD 40
RC0/T1OSO/T13CKI 15 RC1/T1OSI/CCP2B 16 RC2/CCP1/P1A 17 RC3/SCK/SCL 18 RC4/SDI/SDA 23 RC5/SDO 24 RC6/TX/CK 25 RC7/RX/DT 26 RD0/PSP0 19 RD1/PSP1 20 RD2/PSP2 21 RD3/PSP3 22 RD4/PSP4 27 RD5/PSP5/P1B 28 RD6/PSP6/P1C 29 RD7/PSP7/P1D 30 RE0/RD/AN5 8 RE1/WR/AN6 9 RE2/CS/AN7 10 RE3/MCLR/VPP 1
U1
PIC18F4520
RV1
1k
Volts
0.00
4 Bài tập
Câu 1 Vẽ, lắp ráp mạch điện và lập trình theo yêu cầu:
Trang 8a Vẽ, lắp ráp mạch điện như sau:
- Sử dụng biến trở để tạo điện áp 0 đến 5V nối với
chân AN1.
- LED1-LED8 nối lần lượt với các chân RD0:RD7;
LED9-LED10 nối lần lượt với các chân RC0-RC1; LED11 nối
với RE1.
ANx
I/O pin
VR
10k
5V
R
560
LED
+88.8
Volts
b Vẽ lưu đồ thuật toán và viết chương trình theo yêu cầu như sau:
- Đọc giá trị số biến đổi được từ điện áp trên kênh AN1 và hiển thị dưới dạng số nhị phân trên LED1-LED10 LED sáng tương ứng bit “1”, LED tắt tương ứng bit “0”; bit có trọng số lớn nhất (D9) tương ứng LED10, bit có trọng số nhỏ nhất (D0) tương ứng LED1.
- LED11 sáng khi điện áp trên AN1 lớn hơn hoặc bằng 3V, tắt khi điện áp trên AN1 nhỏ hơn 3V
Trang 9Thời hạn và hình thức nộp bài:
- Thời hạn: 23h59, thứ 5, ngày 2/4/2020
- Hình thức:
+ File word có tên theo thứ tự như sau: 3 số cuối mã SV_ Họ_Tên đệm_Tên
Ví dụ: 631_Chu_Quoc_An.docx.
+ Nội dung trong file word bao gồm: code (mã nguồn), 04 ảnh chụp kết quả mô phỏng gồm:
(1) Ảnh chụp khi điện áp trên AN1 là 0V, khi đó LED1-LED11 tắt
(2) Ảnh chụp khi điện áp trên AN1 là 2V, khi đó LED11 tắt, các LED1-LED10 sáng/tắt tương ứng giá trị số đọc được
(3) Ảnh chụp khi điện áp trên AN1 là 4V, khi đó LED11 sáng, các LED1-LED10 sáng/tắt tương ứng giá trị số đọc được
(4) Ảnh chụp khi điện áp trên AN1 là 5V, khi đó LED1-LED11 sáng.
Chú ý: Dùng phím mũi tên lên/xuống để điều chỉnh giá trị của biến trở cho đến khi có được điện áp mong muốn Các ảnh chụp cần hiển thị cả taskbar (có ngày giờ).
Nộp bài bằng cách: Vào “Bài tập trên lớp”, chọn “Biến đổi tương tự số - ADC”, nhấn “+ Thêm hoặc tạo”, chọn , chọn file word vừa làm xong, nhấn nút “Nộp”.
Các trường hợp nộp bài vào mục “Nhận xét” sẽ không được tính.