Đồ án đo nhiệt độ độ ẩm hiển thị LCD sử dụng vi điều khiển atmegaTrình bày về các linh kiện sử dụng trong báo cáoPhương thức của cảm biến đo độ ẩm, nhiệt độCách thức lập trình cho ATmegacode và mạch in
Trang 1MỤ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
Trang 2LỜ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
Trang 3Nhó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
Trang 4CHƯƠNG I:
TỔNG QUAN VÀ
NHIỆM VỤ
Trang 5I.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)
Trang 6- 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
Trang 7CHƯƠNG II:
GIỚI THIỆU CHUNG
VỀ ATMEGA8 VÀ CÁC LINH KHIỆN SỬ DỤNG TRONG ĐỀ TÀI
Trang 8II.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:
Trang 9Ta 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:
Trang 10Hì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):
Trang 11Atmega8 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à
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
Trang 12-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
Trang 13Hì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
Trang 14Hì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 ở
Trang 15châ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:
Trang 16Cá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
Trang 17- 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:
Trang 18SPI 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
Trang 19Bả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
Trang 204 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ý:
Trang 21b 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
Trang 22·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
// 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
Trang 23-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:
Trang 24Hì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
Trang 25Dả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 %
Sơ đồ ghép nối
Trang 26Hình 2.7: ghép nối HS1101
NE555
555 là một loại linh kiện khá là phổ biến bây giờ với việc dễ dàng tạo được xung vuông và có thể thay đổi tần số tùy thích, với sơ đồ mạch đơn giản,điều chế được độ rộng xung Nó được ứng dụng hầu hết vào các mạch tạo xung đóng cắt hay là những mạch dao động khác.Đây là linh kiện của hãng CMOS sản xuất Sau đây là bảng thông số của 555 có trên thị trường :
+ Điện áp đầu vào : 2 - 18V ( Tùy từng loại của 555 : LM555, NE555, NE7555 )
+ Dòng điện cung cấp : 6mA - 15mA
+ Điện áp logic ở mức cao : 0.5 - 15V
+ Điều chế được độ rộng xung (PWM)
+ Điều chế vị trí xung (PPM) (Hay dùng trong thu phát hồng ngoại)