CHƯƠNG 7. MỘT SỐ ỨNG DỤNG
7.1 Ứng dụng vi điều khiển trong bài toán đo và hiển thị nhiệt độ
Đo và hiển thị giá trị nhiệt độ, đầu ra cảm biến nhiệt độ là giá trị điện áp tương tự 7.1.2 Thực hiện việc đo nhiệt độ sử dụng bộ ADC nội của vi điều khiển
ADC- Analogue Digital Converter là bộ chuyển đổi tương tự số, biến tín hiệu dạng tương tự sang tín hiệu số.
Như ta đã biết, để điều khiển đối tượng thông thường ta phải đo được đối tượng. Việc đo sử dụng các cảm biến, đầu ra cảm biến thường là tín hiệu điện áp hoặc dòng điện dạng tương tự. Trong khi đó tín hiệu đầu vào của vi điều khiển là tín hiệu số. Vì vậy, chúng ta cần có bộ chuyển đổi tương tự số làm trung gian giữa cảm biến và vi điều khiển.
Các dòng vi điều khiển hiện đại như AVR, PIC, ARM thường tích hợp sẵn bộ ADC bên trong vi điều khiển làm giảm bớt chi phí và thiết kế bộ chuyển đổi ADC bên ngoài.
Trong vi điều khiển PIC16F877A có tích hợp một bộ ADC 10 bit và 8 đầu vào có khả năng làm đầu vào của tín hiệu tương tự gồm các chân: RA0 (AN0), RA1 (AN1),RA2 (AN2),RA3 (AN3), RA5 (AN4),RE0 (AN5), RE1 (AN6),RE2 (AN7).
13.2 Các thanh ghi cài đặt và trạng thái của bộ ADC
Việc cài đặt và sử dụng các đầu vào ADC sử dụng 4 thanh ghi với các bit tương ứng như sau:
- Thanh ghi điều khiển ADCON0 - Thanh ghi điều khiển ADCON1
- Thanh ghi các bit cao của giá trị số ADRESH - Thanh ghi các bit thấp của giá trị số ADRESL Thanh ghi điều khiển ADCON0
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/𝑫𝑶𝑵𝑬 - ADON
Bit 7 Bit 0
Nhiệm vụ của các bit trong thanh ghi nhƣ sau:
ADCS1: ADCS0: 2 bit lựa chọn nguồn xung chuyển đổi của bộ ADC
114
ADCON1<ADCS2> ADCS1:ADCS0 Nguồn xung
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
Hai bit ADCS1:ADCS0 kết hợp cùng bit ADCS2 thuộc thanh ghi ADCON1 (sẽ giới thiệu sau) để đƣa ra các lựa chọn nguồn xung cho quá trình chuyển đổi ADC. Ở đây Fosc là tần số xung của thạch anh nếu mạch thạch anh dùng và Frc là tần số của mạch RC tạo xung nếu ta dùng mạch này.
CHS2:CHS0: 3 bit lựa chọn kênh ADC sẽ đƣợc đo
CHS2:CHS0 Kênh ADC đƣợc đo
000 Kênh 0 – RA0
001 Kênh 1 – RA1
010 Kênh 2 – RA2
011 Kênh 3 – RA3
100 Kênh 4 – RA5
101 Kênh 5 – RE0
110 Kênh 6 – RE1
111 Kênh 7 – RE2
Vi điều khiển PIC16F877A có một bộ ADC nhƣng có đến 8 kênh đầu vào. Vì vậy tại mỗi thời điểm vi điều khiển chỉ đo được 1 kênh hay 1 tín hiệu vào tương tự. 3 bit này có nhiệm vụ chọn 1 trong 8 kênh đó tại mỗi thời điểm. Lưu ý là ta có thể kết nối tối đa 8 đầu
115
vào tương tự, sau khi đo xong một kênh ta chuyển sang chọn kênh tiếp theo và đo, cứ như vậy cho đến khi hết 8 kênh.
GO/𝑫𝑶𝑵𝑬 : bit trạng thái báo quá trình chuyển đổi ADC đã hoàn tất hay chƣa Khi bit ADON = 1:
Nếu bit GO/𝐷𝑂𝑁𝐸 =1 nghĩa là quá trình chuyển đổi đang đƣợc thực hiện, chƣa hoàn tất Nếu bit GO/𝐷𝑂𝑁𝐸 =0 nghĩa là quá trình chuyển đổi đã hoàn tất, lúc này ta đã có thể lấy kết quả
ADON:
Bit này đƣợc cài bằng 1 để bật nguồn cho mô đun ADC hoạt động Nếu không muốn dùng mô đun ADC ta cho bit này bằng 0
Thanh ghi điều khiển ADCON1
ADFM ADCS2 - - PCFG3 PCFG2 PCFG1 PCFG0
Bit 7 Bit 0
Nhiệm vụ của các bit trong thanh ghi nhƣ sau:
ADFM: bit chọn chế độ định dạng canh trái hoặc canh phải cho kết quả biến đổi ADC
=1: Canh phải
=0: Canh trái
Ta sẽ giải thích rõ hơn vấn đề này khi đề cập đến 2 thanh ghi ADRESH và ADRESL ADCS2: bit chọn nguồn xung đã đƣợc giới thiệu trong khi đề cập đến chức năng của 2 bit ADCS1:ADCS0 trong thanh ghi ADCON0
PCFG3:PCFG0: 4 bit chọn cấu hình cho các chân đầu vào ADC
116
Bảng 7.1: Các bit chọn kênh ADC Trước hết ta giải thích các ký hiệu trong bảng:
𝑉𝑅𝐸𝐹+: Giá trị điện áp lớn nhất của đầu vào tương tự của bộ ADC với đầu ra giá trị số lớn nhất (1023)
𝑉𝑅𝐸𝐹−: Giá trị điện áp nhỏ nhất của đầu vào tương tự của bộ ADC với đầu ra giá trị số nhỏ nhất (0)
Với bộ ADC 10 bit ta có:
Giá trị tương tự Giá trị số
𝑉𝑅𝐸𝐹+ 0
𝑉𝑅𝐸𝐹− 1023
V tương tự Giá trị số
Theo công thức tam giác thuận ta có:
𝑉 𝑡ươ𝑛𝑔 𝑡ự=𝑉𝑅𝐸𝐹+− 𝑉𝑅𝐸𝐹−
1023 𝐺𝑖á 𝑡𝑟ị 𝑠ố
Sau khi chuyển đổi ADC, giá trị số nằm trong thanh ghi số, và ta có thể tính đƣợc giá trị điện áp tương tự ở đầu vào là V tương tự theo công thức trên.
Tới đây, ta có thể giải thích các ký hiệu có trong bảng trên nhƣ sau:
117
Các ký hiệu AN0- AN7 đã đƣợc định nghĩa trong phần đầu là ký hiệu của 8 chân đầu vào tương tự của vi điều khiển: RA0 (AN0), RA1 (AN1),RA2 (AN2),RA3 (AN3), RA5 (AN4),RE0 (AN5), RE1 (AN6),RE2 (AN7)
𝑉𝐷𝐷: Điện áp dương nguồn của vi điều khiển, trong trường hợp này là 5 V 𝑉𝑆𝑆: Điện áp âm nguồn của vi điều khiển, trong trường hợp này là 0 V A: nghĩa là đầu vào này được cài đặt là đầu vào tương tự (Analog) D: nghĩ là đầu vào này đƣợc cài đặt là đầu vào số (Digital)
Nhƣ ta đã biết, vi điều khiển PIC16F877A có một bộ ADC và 8 chân đầu vào có khả năng cài đặt là đầu vào tương tự. Tuy nhiên không phải là trong tấc cả các trường hợp ta phải cài đặt cả 8 chân là đầu vào tương tự (vì nếu như ta chỉ cần đo 1 tín hiệu tương tự thì việc cài đặt cả 8 chân nói trên là đầu vào tương tự sẽ lãng phí mất 7 chân dành cho các nhiệm vụ khác), và không phải khi nào 𝑉𝑚𝑎𝑥 cũng là 𝑉𝐷𝐷 và 𝑉𝑚𝑖𝑛 cũng là 𝑉𝑆𝑆. Ta còn có những lựa chọn khác.
Ta thử giải thích một số trường hợp điển hình có trong bảng như sau:
- PCFG3:PCFG0=0000
Khi đó theo bảng ta có giá trị tương ứng như sau:
AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 𝑽𝑹𝑬𝑭+ 𝑽𝑹𝑬𝑭−
A A A A A A A A 𝑉𝐷𝐷 𝑉𝑆𝑆
Trong trường hợp này, cả 8 chân AN7-AN0 đều được cài đặt là đầu vào tương tự của bộ ADC (A-Analog)
𝑉𝑅𝐸𝐹+ = 𝑉𝐷𝐷 = 5𝑉, 𝑉𝑅𝐸𝐹− = 𝑉𝑆𝑆 = 0𝑉
Công thức chuyển đổi nhƣ trong phần đã viết:
𝑉 𝑡ươ𝑛𝑔 𝑡ự=𝑉𝑅𝐸𝐹+− 𝑉𝑅𝐸𝐹−
1023 𝐺𝑖á 𝑡𝑟ị 𝑠ố=5 − 0
1023𝐺𝑖á 𝑡𝑟ị 𝑠ố
- PCFG3:PCFG0=0010
Khi đó theo bảng ta có giá trị tương ứng như sau:
118
AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 𝑽𝑹𝑬𝑭+ 𝑽𝑹𝑬𝑭−
D D D A A A A A 𝑉𝐷𝐷 𝑉𝑆𝑆
Trong trường hợp này, 5 chân AN4-AN0 được cài đặt là đầu vào tương tự của bộ ADC (A-Analog), 3 chân AN7-AN5 đƣợc cài đặt là chân vào ra số (D-Digital)
𝑉𝑅𝐸𝐹+ = 𝑉𝐷𝐷 = 5𝑉, 𝑉𝑅𝐸𝐹− = 𝑉𝑆𝑆 = 0𝑉 Công thức chuyển đổi nhƣ trong phần đã viết
𝑉 𝑡ươ𝑛𝑔 𝑡ự=𝑉𝑅𝐸𝐹+− 𝑉𝑅𝐸𝐹−
1023 𝐺𝑖á 𝑡𝑟ị 𝑠ố=5 − 0
1023𝐺𝑖á 𝑡𝑟ị 𝑠ố - PCFG3:PCFG0=0011
Khi đó theo bảng ta có giá trị tương ứng như sau:
AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 𝑽𝑹𝑬𝑭+ 𝑽𝑹𝑬𝑭−
D D D A 𝑽𝑹𝑬𝑭+ A A A 𝐴𝑁3 𝑉𝑆𝑆
Trong trường hợp này, 4 chân AN4, AN2,AN1, AN0 được cài đặt là đầu vào tương tự của bộ ADC (A-Analog), 3 chân AN7-AN5 đƣợc cài đặt là chân vào ra số (D-Digital) 𝑉𝑅𝐸𝐹+ = 𝐴𝑁3, 𝑉𝑅𝐸𝐹−= 𝑉𝑆𝑆 = 0𝑉
Trường hợp này, điện áp vào lớn nhất của bộ ADC bằng giá trị điện áp mà ta đặt vào chân AN3
Công thức chuyển đổi đƣợc viết lại nhƣ sau:
𝑉 𝑡ươ𝑛𝑔 𝑡ự=𝑉𝑅𝐸𝐹+− 𝑉𝑅𝐸𝐹−
1023 𝐺𝑖á 𝑡𝑟ị 𝑠ố=𝐴𝑁3 − 0
1023 𝐺𝑖á 𝑡𝑟ị 𝑠ố
- PCFG3:PCFG0=1000
Khi đó theo bảng ta có giá trị tương ứng như sau:
AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 𝑽𝑹𝑬𝑭+ 𝑽𝑹𝑬𝑭−
A A A A 𝑽𝑹𝑬𝑭+ 𝑽𝑹𝑬𝑭− A A 𝐴𝑁3 𝐴𝑁2
119
Trong trường hợp này, 6 chân AN7, AN6, AN5, AN4, AN1, AN0 được cài đặt là đầu vào tương tự của bộ ADC (A-Analog)
𝑉𝑅𝐸𝐹+ = 𝐴𝑁3, 𝑉𝑅𝐸𝐹−= 𝐴𝑁2
Trường hợp này, điện áp vào lớn nhất của bộ ADC bằng giá trị điện áp mà ta đặt vào chân AN3
Công thức chuyển đổi đƣợc viết lại nhƣ sau:
𝑉 𝑡ươ𝑛𝑔 𝑡ự=𝑉𝑅𝐸𝐹+− 𝑉𝑅𝐸𝐹−
1023 𝐺𝑖á 𝑡𝑟ị 𝑠ố=𝐴𝑁3 − 𝐴𝑁2
1023 𝐺𝑖á 𝑡𝑟ị 𝑠ố
Các trường hợp khác dễ dàng suy ra từ các giải thích trên.
Cấu trúc bộ chuyển đổi có thể xem như hình dưới đây.
Hình 7.1: Cài đặt chọn kênh ADC
120
Thanh ghi chứa kết quả giá trị số sau chuyển đổi ADRESH:ADRESL
Hai thanh ghi 8 bit ADRESH và ADRESL là hai thanh ghi 8 bit đồng thời chứa dữ liệu giá trị số 10 bít sau khi chuyển đổi của bộ ADC.
Nhƣ vậy cặp thanh ghi ADRESH:ADRESL có độ dài 16 bit chứa một giá trị số 10 bit sau khi chuyển đổi. Theo nhƣ giới thiệu, bit ADFM của thanh ghi ADCON1 cho phép chọn cách chứa dữ liệu canh trái hoặc canh phải nhƣ sau:
Hình 7.2: Thanh ghi chứa giá trị ADC
Theo nhƣ hình vẽ trên, khi bit ADFM=1, dữ liệu đƣợc canh phải, giá trị dữ liệu số sau chuyển đổi bao gồm 10 bit: 2 bit cao nhất là bít thứ 1 và thứ 0 của thanh ghi ADRESH, 8 bit thấp còn lại là 8 bit của thanh ghi ADRESL
Theo nhƣ hình vẽ trên, khi bit ADFM=0, dữ liệu đƣợc canh tría, giá trị dữ liệu số sau chuyển đổi bao gồm 10 bit: 8 bit cao nhất là 8 bít của thanh ghi ADRESH, 2 bit thấp còn lại là bit 7 và bít 6 của thanh ghi ADRESL
Các bước thực hiện việc chuyển đổi ADC - Bước 1: Cấu hình mô đun ADC
o Cấu hình các chân vào ra số và các điện áp lớn nhất, nhỏ nhất: sử dụng 4 bít PCFG3:PCFG0 của thanh ghi ADCON1
o Chọn kênh đầu vào ADC để đọc giá trị: sử dụng 3 bít CHS2:CHS0 của thanh ghi ADCON0
121
o Chọn tần số chuyển đổi ADC: sử dụng 3 bít gồm bít ADS2 của thanh ghi ADCON1 và 2 bít ADS1:ADS0 của thanh ghi ADCON0
o Chọn cách canh lề giá trị số: sử dụng bít ADFM của thanh ghi ADCON0 o Bật mô đun ADC: cho bit ADON của thanh ghi ADCON0 bằng 1
- Bước 2: đợi 1 khoảng thời gian để bộ ADC cấu hình xong - Bước 3: Bắt đầu quá trình chuyển đổi: set bít GO/𝑫𝑶𝑵𝑬 =1
- Bước 4: Đợi quá trình chuyển đổi hoàn thành bằng cách kiểm tra cho đến khi nào bit GO/𝐃𝐎𝐍𝐄 =0
- Bước 5: Đọc giá trị số nằm trong thanh ghi ADRESH và ADRESL dựa theo canh trái hoặc canh phải
- Bước 6: Quay lại bước 1 và bước 2 để chọn kênh đầu vào khác hoặc chuyển sang bước 3 để đọc chính giá trị kênh đã chọn trước đó
Ví dụ về chương trình đọc ADC từ cảm biến nhiệt độ
;16f877 a/d test routine
;TEST CIRCUIT:
;pin 11 & 32 = 5VDC
;pin 12 & 31 = 0VDC
;pin 1 = 5VDC
;pin 2 = 0 - 5 VDC analog input (center tap on 20k variable resistor)
;pin 13 & 14 = 4MHz crystal with 18pF capacitors to 0VDC
;pin 15,16,17,18,23,24,25,26 PORTC outputs each to 330 ohm resistor
; in series with LED to 0VDC
;**********************************************************
__config _LVP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF &
_BODEN_OFF
& _DEBUG_OFF list p=16f877
122
include "p16f877.inc"
; Start at the reset vector org 0x000
goto Start org 0x004 Interrupt retfie Start
bsf STATUS,RP0 ;bank 1 bcf STATUS,RP1
movlw H'00'
movwf TRISC ;portc [7-0] outputs
clrf ADCON1 ;left justified, all inputs a/d bcf STATUS,RP0 ;bank 0
movlw B'01000001' ;Fosc/8 [7-6], A/D ch0 [5-3], a/d on [0]
movwf ADCON0 Main
call ad_portc goto Main
ad_portc
;wait for acquision time (20uS)
;(non-critical for this test)
bsf ADCON0,GO ;Start A/D conversion Wait
btfsc ADCON0,GO ;Wait for conversion to complete
123
goto Wait
movf ADRESH,W ;Write A/D result to PORTC movwf PORTC ;LEDs
return
end