MỤC LỤC
LỜI NÓI ĐẦU ........................................................................................................................... 2
CHƯƠNG I: ............................................................................................................................... 4
TỔNG QUAN VÀ NHIỆM VỤ ................................................................................................ 4
I.1.Tổng quan ......................................................................................................................... 5
I.2. Nhiệm vụ ......................................................................................................................... 5
CHƯƠNG II: ............................................................................................................................. 7
GIỚI THIỆU CHUNG VỀ ATMEGA8 VÀ CÁC LINH KHIỆN SỬ DỤNG TRONG ĐỀ
TÀI ............................................................................................................................................. 7
II.1.ATmega8 ......................................................................................................................... 8
II.1.1. Tổng quan ................................................................................................................ 8
II.2 Cảm Biến LM35 ............................................................................................................ 23
II.3 Cảm biến HS1101 ......................................................................................................... 25
CHƯƠNG III: .......................................................................................................................... 32
GHÉP NỐI VÀ LẬP TRÌNH ĐO NHIỆT ĐỘ, ĐỘ ẨM ......................................................... 32
III.1 Sơ đồ khối và tính chọn linh kiện ................................................................................ 33
III.1.1 Sơ đồ khối và chức năng nhiệm vụ của từng khối ................................................ 33
III.1.2 Ghép nối và tính toán chọn linh kiện .................................................................... 34
III.2 Sơ đồ mô phỏng và kết quả mô phỏng......................................................................... 38
III.3 Lập trình cho vi điều khiển .......................................................................................... 40
III.3.1 Lưu đồ chương trình ............................................................................................. 40
III.3.2 Phần mềm lập trình CodevisionAVR ................................................................... 43
III.3.3 Lập trình ................................................................................................................ 44
III.3.4 Mạch in ................................................................................................................. 50
CHƯƠNG IV: .......................................................................................................................... 51
TỔNG KẾT .............................................................................................................................. 51
IV.1 Hướng phát triển của đề tài.......................................................................................... 52
IV.2 Tổng kết ....................................................................................................................... 52
Nguyễn Thanh Tùng –ĐỒ ÁN I
1
LỜI NÓI ĐẦU
Ngày nay, sự bùng nổ của khoa học kỹ thuật đòi hỏi chúng ta phải ứng dụng những
công nghệ mới, hiện đại vào sản xuất và đời sống để đạt được hiệu quả cao nhất.
Những thành tựu của khoa học kỹ thuật tiên tiến làm thế giới của chúng ta đã và đang
ngày một thay đổi, văn minh và hiện đại hơn. Sự phát triển của kỹ thuật điện tử đã tạo
ra hàng loạt những thiết bị với các đặc diểm nổi bật như sự chính xác cao,tốc độ
nhanh, gọn nhẹ là những yếu tố cần thiết góp phần cho hoạt động của con người đạt
hiệu quả cao.
Kỹ thuật vi điều khiển hiện nay rất phát triển, nó co ứng dụng vào rất nhiều lĩnh vực
sản xuất công nghiệp, tự động hóa, trong đời sống và còn nhiều lĩnh vực khác nữa. So
với kỹ thuật số thì kỹ thuật vi điều khiển nhỏ gọn hơn rất nhiều do nó được tích hợp
lại và có khả năng lập trình được để diều khiển. Nên rất tiện dụng và cơ động. Các bộ
vi điều khiển theo thời gian cùng với sự phát triển của công nghệ bán dẫn đã phát triển
rất nhanh,từ các bộ vi điều khiển 4 bit đơn giản đến các bộ vi điều khiển 32 bit, rồi sau
này là 64 bit. Điện tử đang trở thành một ngành khoa học đa nhiệm vụ. Điện tử đã đáp
ứng được những đòi hỏi không ngừng những yêu cầu cần thiết trong hoạt động đời
sống hằng ngày.
Một trong số đó là ứng dụng nhiệt kế điện tử vào sản xuất và đời sống nhắm xác định
được nhiệt độ chính xác của thiết bị cũng như hệ thống có những điều chỉnh phù hợp.
Chính vì thế, với những kiến thức đã học về vi điều khiển và một số nghiên cứu về
cảm biến nhiệt và độ ẩm em quyết định làm đồ án về “Đo nhiệt độ và độ ẩm hiển thị
dùng LCD”.
Bài báo cáo được chia thành 4 chương và được sắp xếp như sau:
Chương I: Giới thiệu về tổng quan về đề tài và những nhiệm vụ đặt ra trong việc thực
hiện đề tài.
Chương II: Giới thiệu chung về vi điều khiển ATmega8 và các linh kiện sử dụng trong
đề tài.
Chương III: Trình bày cách tính chọn linh khiện trong mạch và cách thức lập trình cho
vi điều khiển.
Chương IV: Tổng kết,qua bài báo cáo thu hoạch,nhận xét những gì đã làm được và
chưa làm được để rút kinh nghiệm
Nguyễn Thanh Tùng –ĐỒ ÁN I
2
Nhóm sinh viên chúng em xin cảm ơn thầy Lê Hải Sâm, trong thời gian vừa qua đã
hướng dẫn, chỉ bảo chúng em hoàn thành đề tài này.Trong thời gian làm việc với thầy,
không những học được những kiến thức mới, bổ ích mà chúng em còn học được cả
tinh thần và thái độ làm việc, nhất là việc hoạt động nhóm sao cho có hiệu quả.
Mặc dù cố gắng để hoàn thành đồ án nhưng do mới làm quen với vi điều khiển nên
không thể tránh khỏi sai sót. Chúng em mong thầy có những nhận xét và góp ý để đồ
án được hoàn thiện hơn.
Chúng em xin chân thành cảm ơn!
Sinh viên thực hiện:
Nguyễn Thanh Tùng
Nguyễn Đức Nhân
Nguyễn Thanh Tùng –ĐỒ ÁN I
3
CHƯƠNG I:
TỔNG QUAN VÀ
NHIỆM VỤ
Nguyễn Thanh Tùng –ĐỒ ÁN I
4
I.1.Tổng quan
1.Mục tiêu của đề tài
Thiết kế một mạch dùng để đo nhiệt độ và độ ẩm kết quả đo được hiển thị thông qua
một màn hình hiển thị. Thiết bị đo nhiệt độ và đo độ ẩm của môi trường , hiển thị
thông qua màn hình: hiển thị nhiệt độ đo được, hiển thị độ ẩm đo được.
- Dải đo nhiệt độ là 0ĢC đến 150ĢC với sai số cực đại 1.5ĢC.
- Dải đo độ ẩm từ 0% đến 100%, với sai số tuyệt đối là 2%.
2.Lựa chọn linh kiện
- Vi điều khiển ATmega8
- Cảm biến đo nhiệt độ LM35
- Cảm biến đo độ ẩm HS1101
- Màn hình hiển thị gồm 2 dòng nên lựa chọn LCD 16x2.
3.Ý nghĩa khoa học của đề tài
- Ngày nay với sự phát triển của công nghiệp vi điện tử, kỹ thuật số, các hệ thống điều
khiển dần dần được tự động hóa. Với những kỹ thuật tiên tiến như vi xử lí,vi mạch
số… được ứng dụng vào lĩnh vực điều khiển, thì các hệ thống điều khiển cơ khí thô
sơ,với tốc độ xử lí chậm chạp ít chính xác được thay thế bằng các hệ thống điều khiển
tự dộng với các lệnh chương trình đã được thiết lập trước.
- Trong quá trình sản xuất ở các nhà máy, xí nghiệp hiện nay, vấn đề nhiệt độ độ ẩm
được xem là quan trọng nhất và được đặt lên hàng đầu. Để đảm bảo cho hệ thống làm
việc chính xác hiệu quả vận hành an toàn thì việc đo và hiển thị nhiệt độ độ ẩm là hết
sức quan trọng. Chúng ta cần phải biết giá trị nhiệt độ độ ẩm để có những điều chỉnh
phù hợp, để có thể tránh được những sự cố đáng tiếc và giúp cho hệ thống kiểm soát
một cách tự động và tiết kiệm năng lượng.
- Để đáp ứng những yêu cầu đặt ra đòi chúng ta phải có những biện pháp cụ thể để
tiến hành đo và hiện thị giá trị nhiệt độ độ ẩm cũng như cảnh báo một cách chính xác.
Chính vì thế trong đồ án này chúng em đã dùng vi điều khiển ATmega8 vào việc đo
nhiệt độ độ ẩm vào việc đo và hiển thị, sử dụng LCD 8 bit để hiển thị giá trị của nhiệt
độ độ ẩm.
I.2. Nhiệm vụ
Trong bài báo này chúng em sẽ phải trình bày 1 số vấn đề cơ bản sau đây:
- Chức năng và cấu tạo của vi điều khiển ATmega8.
- Tính chọn linh kiện để tiến hành lắp đặt.
- Cách ghép nối ATmega8 với các thiết bị ngoại vi(cụ thể là: ghép nối với LCD, cảm
biến nhiệt LM35, cảm biến HS1101 để hình thành mạch đo nhiệt độ và độ ẩm).
Nguyễn Thanh Tùng –ĐỒ ÁN I
5
- Cách lập trình cho vi điều khiển, sử dụng ngôn ngữ C và được biên dịch qua phần
mềm biên dịch riêng cho AVR đó là CodeVisionAVR.
- Ứng dụng và hướng phát triển của đề tài.
Nguyễn Thanh Tùng –ĐỒ ÁN I
6
CHƯƠNG II:
GIỚI THIỆU CHUNG
VỀ ATMEGA8 VÀ CÁC
LINH KHIỆN SỬ DỤNG
TRONG ĐỀ TÀI
Nguyễn Thanh Tùng –ĐỒ ÁN I
7
II.1.ATmega8
II.1.1. Tổng quan
ATmega8 là một vi điều khiển thuộc dòng Mega AVR là sản phẩm của hãng
Atmel( Hoa kỳ), đây là một bộ xử lý có kiến trúc kiểu Harvard, nghĩa là đơn vị xử lý
trung tâm có bộ nhớ chương trình và một bộ nhớ dữ liệu tách biệt. Bộ vi điều khiển
AVR có nhiều khả năng để giảm năng lượng tiêu thụ. Đây là một trong những ưư
điểm lớn của họ vi điều khiển này. So với các chip vi điều khiển 8 bits khác, AVR có
nhiều đặc tính hơn hẳn, hơn cả trong tính ứng dụng (dễ sử dụng) và đặc biệt là về
chức năng:
Gần như chúng ta không cần mắc thêm bất kỳ một linh kiện phụ nào khi sử
dụng AVR, thậm chí không cần nguồn tạo xung clock cho chip (thường là khối thạch
anh).
Thiết bị lập trình (mạch nạp) cho AVR rất đơn giản, có loại mạch chỉ cần
vàicon điện trở là có thể làm được. Một số chip còn hỗ trợ lập trình on-chip bằng
bootloader không cần mạch nạp.
Bên cạnh lập trình bằng ASM, cấu trúc AVR được thiết kế tương thích với
ngôn ngữ C.
Nguồn tài nguyên source code, tài liệu trên internet rất lớn. Họ vi điều khiển
AVR gồm nhiều bộ điều khiển với các tài nguyên khác nhau về bộ phận ngoại vi, bộ
nhớ chương trình và kiểu đóng vỏ.
AVR có rất nhiều dòng khác nhau bao gồm dòng Tiny AVR (như AT tiny 12, ATtiny
22…) có kích thước bộ nhớ nhỏ, ít bộ phận ngoại vi, rồi đến dòng AVR ( chăng hạn
AT90S8535, AT90S8515) có kích thước bộ nhớ vào loại trung bình và mạnh hơn là
dòng Mega (như Atmega32, Atmega128,…) với bộ nhớ có kich thước vài Kbyte đến
vài Kb cùng với các bộ ngoại vi đa dạng được tích hợp trên chíp, cũng có dòng tích
hợp cả LCD trên chip (dòng LCD AVR). Tốc độ của dòng mega cũng cao hơn các
dòng khác. Sự khác nhau cơ bản giữa các dòng chính là cấu trúc ngoại vi, còn nhân thì
vẫn như nhau.
•
Tốc độ tối đa: 16MHz.
•
Dung lượng bộ nhớ chương trình: 8 KB.
•
Bộ nhớ EEPROM: 512 Byte.
•
Dung lượng bộ nhớ RAM: 1 KB.
•
Bộ nhớ chương trình có khả năng ghi 10.000 lần, bộ nhớ EEPROM có
thể ghi 100.000 lần. Hỗ trợ bootloader, có khả năng tự ghi vào bộ nhớ chương
trình, cập nhật chương trình cho chip mà không cần mạch nạp.
•
Timer 8 bit: 2.
•
Timer 16 bit: 1.
•
ADC: 6 kênh, 10 bit.
•
Giao tiếp: TWI (I2C), UART, SPI
•
Điện áp hoạt động:
Nguyễn Thanh Tùng –ĐỒ ÁN I
8
•
•
Atmega8L: 2.7V – 5.5V.
Atmega8: 4.5V – 5.5V.
Sơ đồ chân:
Hình 2.1: Sơ đồ chân của ATmega8
•
Hệ thống clock:
Nguồn clock:
Chip có thể hoạt động với các nguồn Clock tương ứng với việc thiết lập
các FUSE tương ứng:
Bảng 1.1
Ta chỉ tập trung vào hai nguồn clock đó là sử dụng thạch anh ngoài và sử dụng mạch
RC tích hợp trong chip (dao động nội).
Sử dụng thạch anh ngoài:
Nguyễn Thanh Tùng –ĐỒ ÁN I
9
Hình 2.2: Thạch anh ngoài
Bảng 2.2
Để chip có thể hoạt động thì cần được FUSE đúng.
Khi xuất xưởng thì mặc định chip được FUSE sử dụng dao động nội với tần số 1MHz.
•
Nguồn RESET:
- Reset khi cấp nguồn.
- Reset ngoài (thông qua chân RESET).
- Watchdog RESET.
- Reset khi nguồn bị sụt áp.
II.1.2 Điều khiển vào ra (IO):
Nguyễn Thanh Tùng –ĐỒ ÁN I
10
Atmega8 có 3 cổng vào ra: cổng B, cổng C, cổng D.
Mỗi cổng được cấu hình, điều khiển thông qua 3 thanh ghi: DDRx, PORTx và
PINx. (x: B, C, D).
Các thanh ghi này có thể truy xuất từng bit để có thể điều khiển từng chân (Pin) của
mỗi cổng.
- DDRx: quy định chiều của chân, DDRx=1: chân được cấu hình làm đầu ra, ngược
lại DDRx=0 quy định chân làm đầu vào.
- PORTx: nếu PORTx=1 khi chân được cấu hình làm đầu vào thì sẽ kích hoạt điện
trở treo dương tại chân tương ứng. Để vô hiệu hóa trở treo này thì PORTx phải được
gán 0 hoặc chân được cấu hình làm đầu ra (DDRx=1).
Nếu chân được cấu hình làm đầu ra (DDRx=1):
Nếu PORTx=1 thì chân tương ứng sẽ được đưa lên cao (1 – VCC), ngược lại nếu
PORTx=0 thì chân tương ứng sẽ được đưa xuống thấp (0 – GND)
- PINx: Đọc dữ liệu từ chân VĐK, độc lập với cấu hình chiều của chân (cả khi
DDRx=0 và DDRx=1) trạng thái của chân có thể được đọc thông qua các bit của
thanh ghi PINx.
Chú ý:
-Nếu bit thứ 2 (PUD) của thanh ghi SFIOR được ghi giá trị 1 thì trở treo sẽ bị vô
hiệu hóa bất chấp các thiết lập thông qua các thanh ghi PORTx, DDRx như đã nói ở
trên.
II.1.3 Timer/Counter
Vi điều khiển Atmega8 gồm có 3 bộ Timer – Counter:
+2 bộ Timer – Counter 8 bit: TIMER0, TIMER2.
+1 bộ Timer – Counter 16 bit: TIMER1.
-Timer – Counter có các chế độ hoạt động chính :
+Chế độ định thời.
+Chế độ đếm sự kiện.
+Chế độ tạo xung điều rộng PWM (chỉ có trong bộ TIMER1 và TIMER2).
+Chế độ Input Capture (trong bộ TIMER1).
-Các thanh ghi dùng để điều khiển các bộ TIMER: TCNTx, TCCRx, TIMSK...
•
CÁC CHẾ ĐỘ HOẠT ĐỘNG CỦA TIMER – COUNTER..
+CHẾ ĐỘ ĐỊNH THỜI.
-Ở chế độ này, TIMER1 hoạt động như sau: khi có tín hiệu kích, thanh ghi đếm
TCNT1 sẽ tăng từ 0 đến 65535 tức là 0xFFFF (TCNT0 tăng từ 0 đến 0xFF), khi xảy
ra tràn TCNT1 quay về 0. Dựa vào cơ chế này ta sẽ tạo ra được những khoảng thời
gian mong muốn.
Nguyễn Thanh Tùng –ĐỒ ÁN I
11
-Bài toán đặt ra: điều khiển nhấp nháy LED với khoảng thời gian 1s được tạo bởi
TIMER1.
Để thực hiện việc này chúng ta phải:
+Thiết lập chế độ bài toán thường (normal) cho TIMER1 bằng 2 thanh ghi
TCCR1A, TCCR1B.
+Thiết lập bộ chia tần số hoạt động cho TIMER1 (chính là tín hiệu kích) bằng
các bit CS1x trên thanh ghi TCCR1B.
Bảng 2.3
Tính toán giá trị cho thanh ghi TCNT1:
Giá trị TCNT1 được thiết lập: TCNT1 = 65535 – T*(F/n).
Trong đó:
·65535 là giá trị lớn nhất mà thanh ghi TCNT1 có được (TCNT0 là 255).
·F: tần số của vi điều khiển.
·N: bộ chia tần số cho Timer.
·T: thời gian cần định thời.
Như vậy, TCNT1 sẽ tăng từ giá trị khởi tạo đến 0xFFFF và tràn về 0, khoảng thời gian
đó chính là thời gian định thời mà các bạn cần. Khi bộ đếm Timer tràn, 1 ngắt tràn sẽ
xảy ra (khi đã được kích hoạt), tại trình phục vụ ngắt các bạn cho trạng thái LED thay
đổi
-Cách thiết lập chế độ định thời của TIMER1 với CodeVisionAVR:
Tạo Project mới và chọn CodewizardAVR và chọn Timers và chọn Timer1
Nguyễn Thanh Tùng –ĐỒ ÁN I
12
Hình 2.3: Tạo Project mới trên CodevisionAVR
Ta chọn:
-Tần số chia ở Clock Value.
-Chế độ ở Mode.
-Kích hoạt ngắt tràn ở Interrupt on.
-Giá trị khởi tạo cho TCNT1 ở Value.
+CHẾ ĐỘ ĐẾM SỰ KIỆN.
Như đã nói ở trên, các bộ Timer còn được sử dụng để đếm “sự kiện”, tức là khi có sự
thay đổi của tín hiệu ngoài trên chân T1 đối với TIMER1 (T0 đối với TIMER0), thanh
ghi TCNT1 sẽ tăng lên 1 đơn vị.
Để sử dụng chế độ này, ta phải thiết lập sử dụng nguồn xung bên ngoài với các bit
CS1x trên thanh ghi TCCR1B .
+Chế độ tạo xung điều rộng PWM
Bộ Timer1 của Atmega8 cung cấp cho ta 2 kênh tạo xung điều rộng PWM:
-Kênh A: tín hiệu ra ở OC1A (PORTB.1)
-Kênh B: tín hiệu ra ở OC1B (PORTB.2)
Cùng nhiều chế độ tạo PWM ,ở đây ta sẽ tìm hiểu chế độ Fast PWM, mode 14 (Kênh
A).
-Ta thiết lập dạng tín hiệu PWM ra trên thanh ghi TCCR1A .
-Khi hoạt động, ban đầu chân OC1A ở mức cao , TCNT1 tăng giá trị từ 0 cho
đến khi bằng giá trị trên thanh ghi OCR1A thì chân OC1A được xóa về 0. TCNT1 vẫn
tiếp tục tăng đến khi bằng giá trị trong thanh ghi ICR1 thì TCNT1 reset về 0 và chân
OC1A được kéo lên mức cao
Nguyễn Thanh Tùng –ĐỒ ÁN I
13
Hình 2.4
Vì vậy ở đây, ta có thể thiết lập:
-Giá trị của ICR1: là chu kỳ xung.
-Giá trị của OCR1A: là thời gian xung ở mức cao.
Như vậy ta đã tạo ra được xung điều rông PWM với hệ số điều chỉnh tùy ý.
Ta có:
-T: chu kỳ của xung.
-T1: là thời gian xung ở mức cao.
Hệ số điều chỉnh D(%): D = T1/T.
-Điện áp lớn nhất cấp cho tải: Udmax
-Điện áp trung bình cấp cho tải khi có PWM: Ud = Udmax.D
+Chế độ input capture
-Input Capture là một module được tích hợp theo các timer-counter 16 bit trong AVR.
Mục đích chính của module này là dùng để đo tín hiệu ví dụ tần số hoặc độ rộng
xung.Hoạt động cơ bản của nó:
- Chân nhận tín hiệu vào là chân ICP1 (chân 20 - Input Capture Pin). Bit ICES (Input
Capture Edge Select) trong thanh ghi TCCRB1 sẽ quyết định loại "cạnh" của tín hiệu
vào kích Input Capture. Khi ICES=0, cạnh xuống của tín hiệu vào sẽ kích Input
Capture, nếu ICES=1 thì cạnh lên sẽ kích. Thanh ghi ICR1 chứa giá trị chính của
Input Capture.
- Giả sử bit ICES=0, Input Capture có thể hoạt động ở bất kỳ mode nào của Timer1
mà trong đó thanh ghi ICR1 không được sử dụng. Khi có 1 tín hiệu cạnh xuống ở
Nguyễn Thanh Tùng –ĐỒ ÁN I
14
chân ICP1, Input Capture xảy ra, trong cùng 1 chu kỳ máy giá trị của thanh ghi
TCNT1 (thanh ghi Timer) sẽ được tự động chép vào thanh ghi ICR1, đồng thời cờ
ICF1 được set, ngắt Input Capture có thể xảy ra nếu được cho enable. Lợi dụng khả
năng thanh ghi TCNT1 được tự động chép vào ICR1, chúng ta có thể tính được
khoảng thời gian giữa 2 lần Input Caprture xảy ra, từ đó suy ra chu kỳ hay tần số tín
hiệu cần đo.
III.1.4 Truyền thông nối tiếp - USART
Bộ truyền thông nối tiếp trên Atmega8 có thể hoạt động ở nhiều chế độ và ở đây ta chỉ
xét chế độ bất đồng bộ.
- Khởi tạo nguồn clock cho bộ truyền thông, khởi tạo tốc độ Baud.
Để khởi tạo tốc độ Baud ta ghi giá trị tương ứng với tốc độ Baud vào thanh ghi
UBRR.
Liên hệ giữa UBRR và tốc độ Baud cho bởi công thức sau:
Bảng 2.4
Ví dụ chúng ta sử dụng xung hệ thống là 3.6864MHz, ta cần dùng tốc độ Baud là
9600
Có 2 trường hợp: nếu ta chọn U2X=0 thì UBRR=3.686.400/9600/16-1=23.
Nếu ta chọn U2X=1 thì UBRR=3.686.400/9600/8-1=47.
- Định dạng khung truyền: ta chỉ xét định dạng khung truyền là 1 bit start, 8 bit dữ
liệu, 1 bit stop, không kiểm tra chẵn lẻ.
* Các thanh ghi cấu hình, điều khiển bộ USART:
- Thanh ghi UDR:
+ Để truyền dữ liệu đi thì ta ghi dữ liệu cần truyền vào thanh ghi này và bộ USART sẽ
gửi dữ liệu cần truyền đi.
+ Sau khi nhận đươc dữ liệu thì thanh ghi này sẽ chứa dữ liệu nhận được.
- Thanh ghi USRCA:
Nguyễn Thanh Tùng –ĐỒ ÁN I
15
Các bit ta quan tâm:
+ bit 7 - RXC: cờ này bằng 1 khi có dữ liệu nhận được và sẽ được xóa thành 0 khi
không có dữ liệu trong bộ đệm (UDR).
+ bit 6 – TXC: cờ này được bật mỗi khi truyền xong dữ liệu. Muốn xóa thì ta ghi giá
trị 1 vào bit này.
+ bit 5 – UDRE: UDRE được set thành 1 khi UDR là rỗng và sẵn sàng cho truyền dữ
liệu.
- Thanh ghi UCSRB:
Tạm thời ta quan tâm các bit sau:
- Bit 3 – TXEN: bit 4 - RXEN: cho phép nhận, ghi giá trị 1 vào bit này cho phép
USART nhận dữ liệu.
cho phép truyền dữ liệu, ghi 1 vào bit này cho phép USART truyền dữ liệu.
- Bit 2 – UCSZ2: kết hợp với các bit UCSZ1..0 trong thanh ghi UCSRC để quy định
số bit dữ liệu trong 1 khung truyền.
- Thanh ghi UCSRC:
Có cùng địa chỉ với thanh ghi UBRRH:
- Bit 7 – URSEL: xác định truy cập UBRRH hay UCSRC, khi URSEL=1: truy cập
UCSRC, khi URSEL=0: truy cập UBRRH.
- Bit 6 – UMSEL: chọn chế độ của USART: =0: truyền bất đồng bộ, =1 truyền đồng
bộ. Và chúng ta chỉ tìm hiểu truyền bất đồng bộ.
- bit 3 – USBS: =1: 2 bit stop; =0: 1 bit stop.
- bit UCSZ1..0: kết hợp với UCSZ2 ở trên quy định số bit dữ liệu, ta chỉ tìm hiểu kiểu
truyền 8 bit dữ liệu UCSZ2=0; UCSZ1=1; UCSZ0=1;
III.1.5 Sử dụng TWI
Nguyễn Thanh Tùng –ĐỒ ÁN I
16
- Cấu hình cho phép TWI hoạt động, chọn tốc độ xung tại chân SCL, chọn chế độ
Master – Slaver.
- Giao tiếp với các ngoại vi.
+ Để gửi START: ghi 1 vào bit TWSTA của thanh ghi TWCR.
+ Để gửi STOP: ghi 1 vào bit TWSTO của thanh ghi TWCR.
+ Để gửi ACK: ghi 1 vào bit TWEA của thanh ghi TWCR.
+ Dữ liệu cần gửi đi hoặc nhận được sẽ được chứa trong thanh ghi TWDR: muốn gửi
1 byte thì ghi byte cần gửi vào TWDR, dữ liệu nhận được sẽ được chứa trên TWDR.
II.1.6 SPI của Atmega8
SPI của Atmega8 có thể hoạt động ở nhiều chế độ ta chỉ tìm hiểu đại diện chế độ
master:
Dữ liệu luôn luôn truyền theo hướng Master tới Slaver thông qua chân MOSI và từ
Slaver tới Master thông qua chân MISO.
Khi ghi muốn truyền dữ liệu ta sẽ ghi dữ liệu cần truyền vào thanh ghi dữ liệu SPI
(SPI Data Register - SPDR).
Mỗi khi gửi xong 1 byte thì bit SPIF sẽ được thiết lập: ta sẽ dùng để kiểm tra xem khi
nào thì gửi xong 1 byte.
SPI Control Register – SPCR:
Ta quan tâm đến các bit:
- Bit 6 – SPE: SPI Enable: ghi 1 vào bit này cho phép SPI hoạt động.
- Bit 5 – DORD: Data Order: khi bit này bằng 1 thì khi truyền SPI sẽ truyền bit thấp
nhất (LSB) trước, ngược lại khi bit bằng 0 thì SPI sẽ truyền bit cao nhất trước (MSB).
- Bit 4 – MSTR: Master – Slaver select: bằng 1 chọn chế độ Master, bằng 0 chọn chế
độ Slaver.
- Bit 1..0: Chọn tốc độ xung SCK:
Nguyễn Thanh Tùng –ĐỒ ÁN I
17
SPI Status Register:
- Bit 7 – SPIF: SPI Interrupt Flag: được đặt bằng 1 khi truyền xong 1 byte và ta sẽ
kiểm tra bit này để xem khi nào truyền xong 1 byte.
- Bit 0 – SPI2X: Nhân đôi tốc độ SCK
Để sử dụng SPI ta qua các bước sau:
- Cấu hình bộ SPI, chế độ master.
- Cho phép bộ SPI hoạt động.
- Truyền, nhận dữ liệu.
III.1.7 Ngắt ngoài
Ngắt là 1 tín hiệu khẩn cấp được gửi đến bộ vi xử lý, yêu cầu bộ vi xử lý dừng các
công việc hiện tại nhẩy đến thực hiện nhiệm vụ khẩn cấp đó nhiệm vụ này được gọi là
trình phục vụ ngắt. Sau khi thực hiện xong nhiệm vụ này thì vi xử lý tiếp tục làm các
công việc tiếp theo.
Khi có 2 tín hiệu ngắt đến cùng 1 lúc thì tín hiệu nào ưu tiên cao hơn sẽ được thực
hiện. Ở atmega8 có 19 tín hiệu ngắt từ mức ưu tiên cao xuống thấp như sau.
Nguyễn Thanh Tùng –ĐỒ ÁN I
18
Bảng 2.5
Ngắt thường được sử dụng để thực hiện các công việc mà không biết trước thời
điểm như trong truyền thông, đếm sự kiện...
Phần này thì chúng ta chỉ nghiên cứu phần ngắt ngoài.
Để cho phép các ngắt hoạt động thì cần set bit I trong thanh ghi SREG lên 1.
Ở chip atmega8 có 2 ngắt ngoài được ký hiệu là INT0 và INT1. Các thanh ghi
điều khiển ngắt ngoài
- Thanh ghi MCUCR:
đây là thanh ghi điều khiển kiểu tác động ngắt theo sườn âm hay sườn dương,
hay mức.
Nguyễn Thanh Tùng –ĐỒ ÁN I
19
4 bit cao thì không cần quan tâm nhiều 4 bit thấp có bit 0 và 1 điều khiển int0, bit 2 3
điều khiển int 1.
Thanh ghi GICR
ở thanh ghi này thì chỉ cần quan tâm đến 2 bit là INT1 tức là cho phép ngắt INT1 hoạt
động và INT0 cho phép ngắt INT0 hoạt động.
Thanh ghi cờ ngắt.
Ở thanh ghi này thì chỉ cần quan tâm đến 2 bit là INTF1 và INTF0. Khi có 1 sự kiện
ngắt trên INT1 thì bit INTF1 bật 1, khi có 1 sự kiện ngắt ở trên INT0 thì INTF0 bật 1.
II.1.8 ADC trên ATmega8
-Atmega 8 có 6 chân của PORTC (PORTC.0 à PORTC.5) sử dụng làm kênh
đầu vào của ADC tương ứng ADC0, ADC1, ADC2, ADC3, ADC4, ADC5.
a. Cấu tạo phần cứng của ADC
Khi sử dụng ADC, có 2 chân quan trọng phải nhớ:
-AVCC: chân cung cấp nguồn riêng cho bộ ADC hoạt động.
-AREF: chân cung cấp điện áp tham chiếu (điện áp lớn nhất mà bộ ADC có thể
chuyển đổi) cho bộ ADC.
Khi thiết kế phần cứng,ta phải đặc biệt lưu ý chống nhiễu cho 2 chân này nhằm giảm
sai số trong quá trình chuyển đổi.
Sơ đồ nguyên lý:
Nguyễn Thanh Tùng –ĐỒ ÁN I
20
b. Các thanh ghi liên quan
-ADMUX (ADC Mutiplexer Selection Register): thanh ghi chọn điện áp tham chiếu
(Vref), kênh, chế độ hoạt động của bộ ADC.
-ADCSRA (ADC Control anh Status Register): thanh ghi điều khiển và chứa trạng
thái của bộ ADC.
-ADCL và ADCH (ADC Data Register): thanh ghi chứa giá trị ADC sau quá trình
chuyển đổi.
c)Bài toán ví dụ
Để hiểu rõ hơn về ADC, ta đưa ra bài toán cụ thể:
-Sử dụng kênh ADC0 của vi điều khiển Atmega8, chuyển đổi giá trị điện áp (thay đổi
được bằng biến trở) và hiển thị lên màn hình LCD1602.
·Các bước cấu hình module ADC hoạt động:
-Chọn điện áp tham chiếu, kênh đọc ADC (ADMUX).
-Cho phép bộ ADC hoạt động (ADCSRA).
-Cho phép quá trình chuyển đổi xảy ra.
-Đọc giá trị ADC sau khi chuyển đổi.
Nguyễn Thanh Tùng –ĐỒ ÁN I
21
·Cấu hình sử dụng bộ ADC với CodeVisionAVR:
Tạo project mới chọn CodeWizardAVR và chọn ADC
-Kích hoạt ADC ở ADC Enabled.
-Nếu không chọn ô 8 bit thì bộ chuyển đổi mặc định độ phân giải 10 bit.
-Chọn điện áp tham chiếu ở Volt. Ref.
-Xung clock cho bộ ADC ở Clock.
•
code mẫu:
#include <main.h>
void main(void)
{
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// KHOI TAO ADC
// ADC Clock frequency: 500.000 kHz
// ADC Voltage Reference: AREF pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;
// KHOI TAO LCD1602
Nguyễn Thanh Tùng –ĐỒ ÁN I
22
// RS - PORTD Bit 4
// RD - PORTD Bit 3
// EN - PORTD Bit 2
// D4 - PORTB Bit 4
// D5 - PORTB Bit 5
// D6 - PORTB Bit 6
// D7 - PORTB Bit 7
lcd_init(16);
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts(" Đồ án 1..");
lcd_gotoxy(0,1);
lcd_puts(" Đồ án 1.");
delay_ms(3000);
lcd_clear();
while (1)
{
adc();
}
}
II.2 Cảm Biến LM35
-LM35 là một dạng cảm biến nhiệt độ analog.
Nhiệt độ được xác định bằng cách đo hiệu điện thế ngõ ra của LM35. Sơ đồ chân của
LM35 như sau:
Nguyễn Thanh Tùng –ĐỒ ÁN I
23
Hình 2.6: Cấu tạo LM35
Chân 1: Chân nguồn Vcc
Chân 2: Đầu ra Vout
Chân 3: GND
Một số thông số chính của Lm35:
Cảm biến Lm35 là bộ cảm biến nhiệt mạch tích hợp chính xác cao mà điện áp đầu ra
của nó tỷ lệ tuyến tính với nhiệt độ theo thang độ Celsius
Đặc điểm chính của cảm biến LM35
+ Điện áp đầu vào từ 4V đến 30V
+ Độ phân giải điện áp đầu ra là 10mV/oC
+ Độ chính xác cao ở 25 C là 0.5 C
+ Trở kháng đầu ra thấp 0.1 cho 1mA tải
Nguyễn Thanh Tùng –ĐỒ ÁN I
24
Dải nhiệt độ đo được của LM35 là từ -55 C - 150 C với các mức điện áp ra khác nhau.
Xét một số mức điện áp sau :
- Nhiệt độ -55 C điện áp đầu ra -550mV
- Nhiệt độ 25 C điện áp đầu ra 250mV
- Nhiệt độ 150 C điện áp đầu ra 1500mV
Tính toán nhiệt độ đầu ra của Lm35.
+Ta có:
U= t.k
u là điện áp đầu ra
t là nhiệt độ môi trường đo k
là hệ số theo nhiệt độ của LM35 10mV/1 độ C
Giả sử điện áp Vcc cấp cho LM35 là 5V ADC 10bit
Vậy bước thay đổi của LM35 sẽ là 5/(2^10) = 5/1024
Giá trị ADC đo được thì điện áp đầu vào của LM35 là
(t*k)/(5/1024) = ((10^-2)*1024*t)/5 = 2.048*t
Vậy nhiệt độ ta đo được t = giá trị ADC/2048
Tương tự với ADC 11bit và Vcc khác ta cũng tính như trên để được công thức lấy
nhiệt độ.
Sai số của Lm35
+ Tại0 độ C thì điện áp của LM35 là 10mV
+ Tại 150 độ C thì điện áp của LM35 là 1.5V
==> Giải điện áp ADC biến đổi là 1.5 - 0.01 = 1.49 (V)
+ ADC 11 bit nên bước thay đổi của ADC là : n = 2.44mV
Vậy sai số của hệ thống đo là : Y = 0.00244/1.49 = 0.164 %
II.3 Cảm biến HS1101
HS1101 là loại cảm biến đo độ ẩm .Độ chính xác +-2%.Dãy nhiệt độ hoạt động từ 400C ->1000C.Cảm biến HS1101 đưuọc sử dụng phổ biên trong cuộc sống,ngoài ra
nó còn dùng kết hớp với cảm biến DS18B20 dùng đo nhiệt độ.
-Nguyên lí làm việc
Cảm biến HS1101 là cảm biến đo điện dung.Khi độ ẩm thay đổi,điện dung của
HS1101 thay đổi.Do vậy, để đo được độ ẩm người ta thiết kế đo điện dung của
HS1101.Trong thực tế,người ta thường ghép nối HS1101 va IC NE555.Khi đó giá trị
điện dung của HS1101 thay đổi thì làm thay đổi tần số đầu ra của IC555.Như vậy chỉ
cần đo tần số đầu ra là có thể đo được điện dung của HS1101
Sơ đồ ghép nối
Nguyễn Thanh Tùng –ĐỒ ÁN I
25