Thiết kế, xây dựng hệ thống phun sương làm mát tự động
- 68 trang
- file .pdf
BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG……………..
Luận văn
Thiết kế, xây dựng hệ thống
phun sương làm mát tự động
LỜI MỞ ĐẦU
Theo xu hướng phát triển của xã hội ngày nay, ngành tự động hóa là
một trong những ngành không thể thiếu, kĩ thuật ngày càng phát triển con
người lại mong muốn tìm đến những thiết bị hoạt động theo hướng tự động
hóa với mục đích nâng cao chất lượng cuộc sống. Hiện nay nhiệt độ trái đất
đang tăng cao do đó người ta sử dụng nhiều phương pháp chống nóng khác
nhau. Biện pháp thường hay được sử dụng là quạt điện chỉ sử dụng được cho
một diện tích nhỏ, khi nhiệt độ trong phòng tăng cao dễ khiến cho cơ thể mất
nước và mệt mỏi. Sử dụng điều hòa thì cần chi phí lớn. Trong khi phương
pháp ít được mọi người sử dụng đến là phun sương làm mát cho tòa nhà,
trong chăn nuôi hoặc nhà xưởng có diện tích lớn…, với giá thành rẻ, chi phí
hoạt động thấp.
Xuất phát từ những thực tế đó, em đã mạnh dạn nêu ra ý tưởng của
mình và được thầy, cô chấp nhận đề tài “Thiết kế, xây dựng hệ thống phun
sƣơng làm mát tự động”. Trong đề tài này em đã sử dụng vi điều khiển
AVR với những tính năng mạnh mẽ và giá thành rẻ. Một cảm biến nhiệt độ để
đo nhiệt độ môi trường.
Đồ án gồm các nội dung sau:
Chƣơng 1: Tổng quan về vi điều khiển ATmega8
Chƣơng 2: Ngôn ngữ lập trình C và phần mềm lập trình CodevisionAVR
Chƣơng 3: Thiết kế và xây dựng hệ thống phun sương làm mát tự động
Sinh viên thực hiện
Trịnh Minh Đồng
1
CHƢƠNG 1:
TỔNG QUAN VỀ VI ĐIỀU KHIỂN ATMEGA8
1.1. GIỚI THIỆU VỀ AVR
AVR là các vi điều khiển 8 bits với cấu trúc tập lệnh đơn giản hóa
RISC (Reduced Instruction Set Computer) có cấu trúc Harvard được phát
triển bởi Atmel năm 1996. AVR là một trong những họ vi điều khiển đầu tiên
dùng bộ nhớ flash tích hợp trên chip để chứa chương trình, khác với ROM
(chỉ có thể lập trình một lần), EPROM, hay EEPROM được dùng cho các họ
vi điều khiển khác cùng thời điểm đó.
Hình 1.1: Atmel AVR ATmega8.
Lịch sử phát triển AVR:
Mọi người vẫn tin rằng kiến trúc cơ bản của AVR được hình thành từ
hai sinh viên của trường đại học Norwegian Institure of Technology tên là
Alf-BgilBogen và Vegard Wollan.
Ban đầu AVR MCU (Micro Controller Unit) được phát triển tại một
phòng ASIC (Application Specific IC) ở Trondheim Nauy, đó là nơi mà 2
người sáng lập của Atmel Nauy làm việc như là sinh viên. Và nó được biết
đến với tên µRISC (Micro RISC). Khi công nghệ này được bán cho Atmel,
2
cấu trúc bên trong AVR được phát triển xa hơn bởi Alf và Vegard tại Atmel
Nauy, một công ty con của Atmel được thành lập bởi 2 thành viên trên.
Một sản phẩm đầu tiên của AVR là AT90S8515, cũng có đóng gói DIP
40 chân giống như 8051, nó bao gồm phức hợp địa chỉ các thành phần bên
ngoài và data bus. Điều khác biệt là chân RESET (8051 RESET tích cực mức
cao, AVR lại tích cực mức thấp), ngoại trừ điểm này, các ngõ ra đều giống
nhau.
AVRs thường được chia thành 6 nhóm lớn:
TinyAVRs :
- 1-8 kB bộ nhớ chương trình.
- 8-32 chân.
- Hạn chế các thiết bị ngoại vi.
MegaAVRs:
- 4-256 kB bộ nhớ chương trình.
- 28-100 chân.
- Mở rộng tập lệnh.
- Nhiều thiết bị ngoại vi.
XmegaAVRs:
- 16-256 kB bộ nhớ chương trình.
- 44-64-100 chân.
- Mở rộng các thiết bị như DMA, "Event System", và hỗ trợ mã hóa .
- Mở rộng thiết bị ngoại vi với DACs.
Ứng dụng cụ thể của AVR:
MegaAVRs với các tính năng đặc biệt không tìm thấy trên các thành
viên khác của họ AVR, chẳng hạn như màn hình LCD controller, USB
controller, advanced PWM, CAN…
FPSLIC (AVR với FPGA):
- FPGA 5K đến 40K cổng.
3
- SRAM cho mã chương trình AVR, không giống như tất cả các AVRs
khác.
- AVR cốt lõi có thể chạy lên đến 50 MHz.
32-bit AVRs:
Năm 2006, Atmel phát hành vi điều khiển dựa trên, kiến trúc 32-bit,
AVR. Chúng bao gồm các hướng dẫn SIND và DSP , cùng với âm thanh và
các tính năng xử lý video. Họ 32-bit của các thiết bị này được thiết kế để cạnh
tranh với các bộ vi xử lý dựa trên ARM. Các tập lệnh tương tự như các lõi
RISC khác, nhưng không tương thích với AVR ban đầu hoặc bất kỳ các lõi
ARM khác nhau.
1.2. CHI TIẾT VỀ CHIP ATMEGA8
1.2.1. Tổng quan
Những tính năng chính của Atmega8:
- Rom: 8 Kbyte bộ nhớ flash
- Sram: 1 Kbytes nội
- EEPROM: 512 bytes
- Có thể xóa lập trình được và có thể chịu được 10000 lần ghi xóa
- Có 28 chân, trong đó có 23 cổng vào/ra
- 160 thanh ghi vào ra mở rộng
- 32 thanh ghi đa mục đích 8 bit
- 2 bộ định thời 8 bit
- 1 bộ định thời 16 bit
- Bộ định thời watchdog
- Bộ dao động nội RC tần số 1 MHz, 2 MHz, 4 MHz, 8 MHz
- ADC 6 kênh với độ phân giải 10 bit (Ở dòng Xmega lên tới 12 bit)
- 3 kênh PWM 8 bit
- Bộ so sánh tương tự có thể lựa chọn ngõ vào
- Khối USART lập trình được
4
- Khối truyền nhận nối tiếp SPI
- Hỗ trợ Boot loader
- 5 chế độ tiết kiệm năng lượng
- Lựa chọn tần số hoạt động bằng phần mềm
- Tần số tối đa 16MHz
- Nguồn nuôi từ 2,7 – 5,5 đối với ATmega8L và từ 4,5V – 5,5V đối với
ATmega8
- Dòng làm việc 3,6 mA
Hình 1.2: Hình ảnh các loại AVR.
Sơ đồ bố trí chân của ATmega8 gồm 2 kiểu:
5
Hình 1.3: Sơ đồ bố trí chân của các dạng ATmega8.
6
Hình 1.4: Cấu tạo bên trong của ATmega8.
7
1.2.2. Cấu trúc cơ bản của ATmega8
Hình 1.5: Sơ đồ khối cấu trúc vi điều khiển AVR.
1.2.2.1. Cấu trúc bộ nhớ
Bộ nhớ vi điều khiển AVR có cấu trúc Harvard là cấu trúc có đường
Bus riêng cho bộ nhớ chương trình và bộ nhớ dữ liệu. Bộ nhớ AVR được
chia làm 2 phần chính: Bộ nhớ chương trình (program memory) và bộ nhớ dữ
liệu (Data memory).
Bộ nhớ chương trình:
Bộ nhớ chương trình của AVR là bộ nhớ Flash có dung lượng 128K
bytes. Bộ nhớ chương trình có độ rộng Bus là 16 bit. Những địa chỉ đầu tiên
của bộ nhớ chương trình được dùng trong bảng vecto ngắt. Đối với Atmega 8
bộ nhớ chương trình có thể chia làm 2 phần: phần boot loader (Boot loader
program section) và phần ứng dụng (Application program section).
8
Bộ nhớ dữ liệu:
Bộ nhớ dữ liệu của AVR được chia làm hai phần chính là bộ nhớ
SRAM và bộ nhớ EEPROM. Tuy cùng là bộ nhớ dữ liệu nhưng hai bộ nhớ
này lại tách biệt nhau và được đánh địa chỉ riêng:
- Bộ nhớ SRAM: Có dung lượng 1 Kbytes, bộ nhớ SRAM có hai
chế độ hoạt động là chế độ thông thường và chế độ tương thích với
ATmega8.
- Bộ nhớ EEPROM: Đây là bộ nhớ dữ liệu có thể ghi xóa ngay trong
lúc vi điều khiển đang hoạt động và không bị mất dữ liệu khi nguồn cung cấp
bị mất. Với vi điều khiển AT mega8, bộ nhớ EEPROM có kích thước là 512
byte. EEPROM được xem như là một bộ nhớ vào ra được đánh địa chỉ độc
lập với SRAM. Để điều khiển vào ra dữ liệu với EEPROM ta sử dụng ba
thanh ghi:
+ Thanh ghi EEAR (EEARL):
Đây là thanh ghi 16 bit lưu giữ địa chỉ các ô nhớ của EEPROM,
thanh ghi EEAR được kết hợp từ 2 thanh ghi 8 bit là EEARH và thanh ghi
EEARL.
+ Thanh ghi EEDR:
Đây là thanh ghi dữ liệu của EEPROM, là nơi chứa dữ liệu ghi vào
hay lấy ra từ EEPROM.
9
+ Thanh ghi EECR:
Đây là thanh ghi điều khiển EEPROM, ta chỉ sử dụng 4 bit đầu của
thanh ghi này, bốn bit cuối là dự trữ.
Hình 1.6: Tóm tắt bản đồ bộ nhớ bên trong ATmega8.
1.2.2.2. Cổng vào/ra (I/O)
Có thể thấy chip này gồm 28 chân , bao gồm 4 PORT vào ra. Cổng vào
ra là một trong số các phương tiện để vi điều khiển giao tiếp với các thiết bị
ngoại vi. Ở ATmega8 có tất cả các cổng vào ra 8 bit là: PORTB, PORTC,
PORTD Các cổng vào ra của AVR là cổng vào hai chiều có thể định hướng,
tức có thể chọn hướng của cổng là hướng vào (input) hay hướng ra
(output). Tất cả các cổng vào ra của AVR đều có chức năng Đọc – Chỉnh
sửa – Ghi (Read – Modify – Write) khi sử dụng chúng như là các cổng vào
ra số thông thường. Điều này có nghĩa là khi ta thay đổi hướng một chân nào
10
đó thì nó không làm ảnh hướng tới hướng của các chân khác. Tất cả các chân
của các PORT đều có điện trở kéo lên (pull-up) riêng, ta có thể cho phép hay
không cho phép điện trở kéo lên này hoạt động.
Điện trở kéo lên là một điện trở được dùng khi thiết kế các mạch điện tử
logic. Nó có một đầu được nối với nguồn điện áp dương (VCC – Vdd) và đầu
còn lại được nối với tín hiệu lối vào/ra của một mạch logic chức năng.
Thanh ghi DDRx:
Đây là thanh ghi 8 bit (có thể đọc/ghi) có khả năng điều khiển hướng
của cổng (lối vào hay lối ra). Khi một bit của thanh ghi này được set lên 1
thì chân tương ứng với nó được cấu hình thành ngõ ra. Ngược lại, nếu bit
của thanh ghi DDRx là 0 thì chân tương ứng với nó được thiết lập thành ngõ
vào.
Thanh ghi PORTx:
PORTx là thanh ghi 8 bit có thể đọc ghi. Đây là thanh ghi dữ liệu của
PORTx. Nếu thanh ghi DDRx thiết lập cổng là lối ra, khi đó giá trị của thanh
ghi PORTx cũng là giá trị của các chân tương ứng của PORTx, nói cách khác,
khi ta ghi một giá trị logic lên 1 bit của thanh ghi này thì chân tương ứng
với bit đó cũng có cùng mức logic. Khi thanh ghi DDRx thiết lập cổng thành
lối vào thì thanh ghi PORTx đóng vai trò như một thanh ghi điều khiển cổng.
Thanh ghi PINx:
PINx không phải là một thanh ghi thật sự, đây là địa chỉ trong bộ nhớ
I/O kết nối trực tiếp với các chân của cổng. Khi ta đọc PORTx tức ta đọc dữ
liệu được chốt trong PORTx, còn khi đọc PINx thì giá trị logic hiện thời ở
chân của cổng tương ứng được đọc. Vì thế đối với thanh ghi PINx ta có thể
đọc mà không thể ghi.
1.2.3. Bộ định thời của ATmega8
Timer/Counter (T/C) là các module độc lập với CPU. Chức năng chính
của các bộ T/C, như tên gọi của chúng, là định thời (tạo ra một khoảng thời
11
gian, đếm thời gian…) và đếm sự kiện. Trên các chip AVR, các bộ T/C còn
có thêm chức năng tạo ra các xung điều rộng PWM (Pulse Width
Modulation), ở một số dòng AVR, một số T/C còn được dùng như các bộ
canh chỉnh thời gian (calibration) trong các ứng dụng thời gian thực. Các bộ
T/C được chia theo độ rộng thanh ghi chứa giá trị định thời hay giá trị đếm
của chúng, cụ thể trên chip Atmega8 có 2 bộ Timer 8 bit (Timer/Counter0 và
Timer/Counter2) và 1 bộ 16 bit (Timer/Counter1). Chế độ hoạt động và
phương pháp điều khiển của từng T/C cũng không hoàn toàn giống nhau.
1.2.4. Bộ định thời 0:
Hình 1.7: Sơ đồ khối bộ định thời 0.
Bộ định thời 0 là bộ định thời 8 bit, bộ định thời 0 liên quan tới 7 thanh
ghi với nhiều chế độ thực thi khác nhau.
Các định nghĩa sau sẽ đƣợc sử dụng cho bộ định thời 0 và 2:
- BOTTOM: Bộ đếm đạt tới giá trị BOTTOM khi nó có giá trị 00h.
- MAX: Bộ đếm đạt tới giá trị Max khi nó bằng FFh.
12
- TOP: Bộ đếm đạt giá trị TOP khi nó bằng với giá trị cao nhất trong
chuỗi đếm, giá trị cao nhất trong chuỗi đếm không nhất thiết là FFh mà có thể
là bất kỳ giá trị nào được qui định trong thanh ghi OCRn (n=0,2), tùy theo chế
độ thực thi.
Các thanh ghi trong bộ định thời 0 bao gồm:
- Thanh ghi Timer/Counter Control Register – TCCR0
- Thanh ghi Timer/Counter Register - TCNT0
- Thanh ghi Output Compare Register – OCR0
- Thanh ghi Timer/Counter Interrupt Mask Register – TIMSK
- Thanh ghi Timer/Counter Interrupt Flag Register – TIFR
- Thanh ghi Special Function IO Register – SFIOR
- Thanh ghi Asynchronous Status Register – ASSR
1.2.5. Bộ định thời 2
Hình 1.8: Sơ đồ khối bộ định thời 2.
Bộ định thời 2 là bộ định thời 8 bit, bộ định thời 2 liên quan tới 5
thanh ghi với nhiều chế độ thực thi khác nhau. Thuộc tính chính của bộ định
13
thời 2 gồm: Bộ đếm đơn kênh, xóa bộ định thời khi có sự kiện “so sánh
khớp” và tự động nạp lại, PWM hiệu chỉnh pha, đếm sự kiện bên ngoài.
Các thanh ghi trong bộ dịnh thời 2:
- Thanh ghi Timer/Counter Control Register – TCCR2
- Thanh ghi Timer/Counter Register – TCNT2
- Thanh ghi Output Compare Register – OCR2
- Thanh ghi Timer/Counter Interrupt Mask Register – TIMSK
- Thanh ghi Timer/Counter Interrupt Flag Register – TIFR
1.2.6. Bộ định thời 1:
Hình 1.9: Sơ đồ khối bộ định thời 1.
14
Các định nghĩa sau sẽ đƣợc sử dụng trong bộ định thời 1:
- BOTTOM: Bộ đếm đạt đến giá trị BOTTOM khi nó có giá trị 0000h.
- MAX: Bộ đếm có giá trị MAX khi nó bằng FFFFh.
- TOP: Bộ đếm đạt giá trị TOP khi nó bằng với giá trị cao nhất trong
chuỗi đếm, giá trị cao nhất trong chuỗi đếm không nhất thiết là FFFFh mà có
thể là bất cứ giá trị nào được qui định trong thanh ghi OCRnX (X=A,B) hay
ICRn, tùy theo chế độ thực thi.
Ngõ ra khối Compare Match Output Unit:
Hình 1.10: Sơ đồ ngõ ra khối.
Nhìn hình ta thấy Pin OCnX (chẳn hạn pin 15 của IC tương ứng với
OC1A), là ngõ ra của khối Compare Match Output Unit, có thể được nối với
3 thanh ghi là OCnX, PortX và DDRX. Thanh ghi nào được nối với OCn là
phụ thuộc vào các bit COMn1:0 (tức là tùy theo chế độ hoạt động của bộ
định thời). Nếu ta thiết lập bộ định thời hoạt động ở chế độ thường (tức
không sử dụng chức năng so sánh khớp) thì chân OCn trở thành chân vào ra
số thông thường.
15
Bộ định thời 1 bao gồm các thanh ghi:
TCNT1H và TCNT1L (Timer/Counter Register): là 2 thanh ghi
8 bit tạo thành thanh ghi 16 bits (TCNT1) chứa giá trị vận hành của T/C1. Cả
2 thanh ghi này cho phép đọc và ghi giá trị một cách trực tiếp.
TCCR1A và TCCR1B (Timer/Counter Control Register): là 2
thanh ghi điều khiển hoạt động của T/C1. Tất cả các chế độ hoạt động của
T/C1 đều được xác định thông qua các bit trong 2 thanh ghi này. Tuy nhiên,
đây không phải là 2 byte cao và thấp của một thanh ghi mà là 2 thanh ghi
hoàn toàn độc lập. Các bit trong 2 thanh ghi này bao gồm các bit chọn mode
hay chọn dạng sóng (Waveform Generating Mode – WGM), các bit quy định
dạng ngõ ra (Compare Output Match – COM), các bit chọn giá trị chia
prescaler cho xung nhịp (Clock Select – CS)…Cấu trúc của 2 thanh ghi:
Nhìn chung để “thuộc” hết cách phối hợp các bit trong 2 thanh ghi
TCCR1A và TCCR1B là tương đối phức tạp vì T/C1 có rất nhiều mode hoạt
động. Ở đây, trong thanh ghi TCCR1B có 3 bit khá quen thuộc là CS10, CS11
và CS12. Đây là các bit chọn xung nhịp cho T/C1 như truong T/C0.
16
Bảng 1.1: Tóm tắt các chế độ chọn xung nhịp trong T/C1.
OCR1A và OCR1B (Ouput Compare Register A và B): có một
số khái niệm mới mà chúng ta cần biết khi làm việc với T/C1, một trong số đó
là Ouput Compare (ngõ so sánh ra). Trong lúc T/C hoạt động, giá trị thanh ghi
TCNT1 tăng, giá trị này được liên tục so sánh với các thanh ghi OCR1A và
OCR1B (so sánh độc lập với từng thanh ghi), việc so sánh này trên AVR gọi
là gọi là Ouput Compare. Khi giá trị so sánh bằng nhau thì 1 “Match” xảy ra,
khi đó một ngắt hoặc 1 sự thay đổi trên chân OC1A (hoặc/và chân OC1B) xảy
ra (đây là cách tạo PWM bởi T/C1). A và B đại diện cho 2 kênh (channel).
Cũng vì điều này mà chúng ta có thể tạo 2 kênh PWM bằng T/C1. Tóm lại,
cơ bản 2 thanh ghi này chứa các giá trị để so sánh.
17
ICR1 (InputCapture Register 1): khái niệm mới thứ 2 của T/C1
là Input Capture. Khi có 1 sự kiện trên chân ICP1 (chân 14), thanh ghi ICR1
sẽ “capture” giá trị của thanh ghi đếm TCNT1. Một ngắt có thể xảy ra trong
trường hợp này, vì thế Input Capture có thể được dùng để cập nhật giá trị
“TOP” của T/C1.
TIMSK (Timer/Counter Interrupt Mask Register): các bộ T/C
trên AVR dùng chung thanh ghi mặt nạ ngắt, vì thế TIMSK cũng được dùng
để quy định ngắt cho T/C1. Có điều lúc này ta chỉ quan tâm đến các bit từ 2
đến 5 của TIMSK. Có tất cả 4 loại ngắt trên T/C1 (nhớ lại T/C0 chỉ có 1 loại
ngắt tràn).
- Bit 2 trong TIMSK là TOIE1, bit quy định ngắt tràn cho thanh T/C1
(tương tự trường hợp của T/C0).
- Bit 3, OCIE1B là bit cho phép ngắt khi có 1 “Match” xảy ra trong việc
so sánh TCNT1 với OCR1B.
- Bit 4, OCIE1A là bit cho phép ngắt khi có 1 “Match” xảy ra trong việc
so sánh TCNT1 với OCR1A.
- Bit 5, TICIE1 là bit cho phép ngắt trong trường hợp Input Capture
được dùng.
Cùng với việc set các bit trên, bit I trong thanh ghi trạng thái phải được
set nếu muốn sử dụng ngắt.
- TIFR (Timer/Counter Interrupt Flag Register): là thanh ghi cờ nhớ cho
tất cả các bộ T/C. Các bit từ 2 đến 5 trong thanh ghi này là các cờ trạng thái
của T/C1.
18
Các chế độ hoạt động: có tất cả 5 chế độ hoạt động chính trên T/C1.
Các chế độ (mode) hoạt động cơ bản được quy định bởi 4 bit Waveform
Generation Mode (WGM13, WGM12, WGM11, WGM10) và một số bit phụ
khác. 4 bit WGM lại được bố trí nằm trong 2 thanh ghi TCCR1A và TCCR1B
(WGM13 là bit 4, WGM12 là bit 3 trong TCCR1B trong khi WGM11 là bit 1
và WGM10 là bit 0 trong thanh ghi TCCR1A) vì thế cần phối hợp 2 thanh ghi
TCCR1 trong lúc điều khiển T/C1.
Các chế độ hoạt động của T/C1:
Bảng 1.2: Các bit WGM và các chế độ hoạt động của T/C1.
19
TRƯỜNG……………..
Luận văn
Thiết kế, xây dựng hệ thống
phun sương làm mát tự động
LỜI MỞ ĐẦU
Theo xu hướng phát triển của xã hội ngày nay, ngành tự động hóa là
một trong những ngành không thể thiếu, kĩ thuật ngày càng phát triển con
người lại mong muốn tìm đến những thiết bị hoạt động theo hướng tự động
hóa với mục đích nâng cao chất lượng cuộc sống. Hiện nay nhiệt độ trái đất
đang tăng cao do đó người ta sử dụng nhiều phương pháp chống nóng khác
nhau. Biện pháp thường hay được sử dụng là quạt điện chỉ sử dụng được cho
một diện tích nhỏ, khi nhiệt độ trong phòng tăng cao dễ khiến cho cơ thể mất
nước và mệt mỏi. Sử dụng điều hòa thì cần chi phí lớn. Trong khi phương
pháp ít được mọi người sử dụng đến là phun sương làm mát cho tòa nhà,
trong chăn nuôi hoặc nhà xưởng có diện tích lớn…, với giá thành rẻ, chi phí
hoạt động thấp.
Xuất phát từ những thực tế đó, em đã mạnh dạn nêu ra ý tưởng của
mình và được thầy, cô chấp nhận đề tài “Thiết kế, xây dựng hệ thống phun
sƣơng làm mát tự động”. Trong đề tài này em đã sử dụng vi điều khiển
AVR với những tính năng mạnh mẽ và giá thành rẻ. Một cảm biến nhiệt độ để
đo nhiệt độ môi trường.
Đồ án gồm các nội dung sau:
Chƣơng 1: Tổng quan về vi điều khiển ATmega8
Chƣơng 2: Ngôn ngữ lập trình C và phần mềm lập trình CodevisionAVR
Chƣơng 3: Thiết kế và xây dựng hệ thống phun sương làm mát tự động
Sinh viên thực hiện
Trịnh Minh Đồng
1
CHƢƠNG 1:
TỔNG QUAN VỀ VI ĐIỀU KHIỂN ATMEGA8
1.1. GIỚI THIỆU VỀ AVR
AVR là các vi điều khiển 8 bits với cấu trúc tập lệnh đơn giản hóa
RISC (Reduced Instruction Set Computer) có cấu trúc Harvard được phát
triển bởi Atmel năm 1996. AVR là một trong những họ vi điều khiển đầu tiên
dùng bộ nhớ flash tích hợp trên chip để chứa chương trình, khác với ROM
(chỉ có thể lập trình một lần), EPROM, hay EEPROM được dùng cho các họ
vi điều khiển khác cùng thời điểm đó.
Hình 1.1: Atmel AVR ATmega8.
Lịch sử phát triển AVR:
Mọi người vẫn tin rằng kiến trúc cơ bản của AVR được hình thành từ
hai sinh viên của trường đại học Norwegian Institure of Technology tên là
Alf-BgilBogen và Vegard Wollan.
Ban đầu AVR MCU (Micro Controller Unit) được phát triển tại một
phòng ASIC (Application Specific IC) ở Trondheim Nauy, đó là nơi mà 2
người sáng lập của Atmel Nauy làm việc như là sinh viên. Và nó được biết
đến với tên µRISC (Micro RISC). Khi công nghệ này được bán cho Atmel,
2
cấu trúc bên trong AVR được phát triển xa hơn bởi Alf và Vegard tại Atmel
Nauy, một công ty con của Atmel được thành lập bởi 2 thành viên trên.
Một sản phẩm đầu tiên của AVR là AT90S8515, cũng có đóng gói DIP
40 chân giống như 8051, nó bao gồm phức hợp địa chỉ các thành phần bên
ngoài và data bus. Điều khác biệt là chân RESET (8051 RESET tích cực mức
cao, AVR lại tích cực mức thấp), ngoại trừ điểm này, các ngõ ra đều giống
nhau.
AVRs thường được chia thành 6 nhóm lớn:
TinyAVRs :
- 1-8 kB bộ nhớ chương trình.
- 8-32 chân.
- Hạn chế các thiết bị ngoại vi.
MegaAVRs:
- 4-256 kB bộ nhớ chương trình.
- 28-100 chân.
- Mở rộng tập lệnh.
- Nhiều thiết bị ngoại vi.
XmegaAVRs:
- 16-256 kB bộ nhớ chương trình.
- 44-64-100 chân.
- Mở rộng các thiết bị như DMA, "Event System", và hỗ trợ mã hóa .
- Mở rộng thiết bị ngoại vi với DACs.
Ứng dụng cụ thể của AVR:
MegaAVRs với các tính năng đặc biệt không tìm thấy trên các thành
viên khác của họ AVR, chẳng hạn như màn hình LCD controller, USB
controller, advanced PWM, CAN…
FPSLIC (AVR với FPGA):
- FPGA 5K đến 40K cổng.
3
- SRAM cho mã chương trình AVR, không giống như tất cả các AVRs
khác.
- AVR cốt lõi có thể chạy lên đến 50 MHz.
32-bit AVRs:
Năm 2006, Atmel phát hành vi điều khiển dựa trên, kiến trúc 32-bit,
AVR. Chúng bao gồm các hướng dẫn SIND và DSP , cùng với âm thanh và
các tính năng xử lý video. Họ 32-bit của các thiết bị này được thiết kế để cạnh
tranh với các bộ vi xử lý dựa trên ARM. Các tập lệnh tương tự như các lõi
RISC khác, nhưng không tương thích với AVR ban đầu hoặc bất kỳ các lõi
ARM khác nhau.
1.2. CHI TIẾT VỀ CHIP ATMEGA8
1.2.1. Tổng quan
Những tính năng chính của Atmega8:
- Rom: 8 Kbyte bộ nhớ flash
- Sram: 1 Kbytes nội
- EEPROM: 512 bytes
- Có thể xóa lập trình được và có thể chịu được 10000 lần ghi xóa
- Có 28 chân, trong đó có 23 cổng vào/ra
- 160 thanh ghi vào ra mở rộng
- 32 thanh ghi đa mục đích 8 bit
- 2 bộ định thời 8 bit
- 1 bộ định thời 16 bit
- Bộ định thời watchdog
- Bộ dao động nội RC tần số 1 MHz, 2 MHz, 4 MHz, 8 MHz
- ADC 6 kênh với độ phân giải 10 bit (Ở dòng Xmega lên tới 12 bit)
- 3 kênh PWM 8 bit
- Bộ so sánh tương tự có thể lựa chọn ngõ vào
- Khối USART lập trình được
4
- Khối truyền nhận nối tiếp SPI
- Hỗ trợ Boot loader
- 5 chế độ tiết kiệm năng lượng
- Lựa chọn tần số hoạt động bằng phần mềm
- Tần số tối đa 16MHz
- Nguồn nuôi từ 2,7 – 5,5 đối với ATmega8L và từ 4,5V – 5,5V đối với
ATmega8
- Dòng làm việc 3,6 mA
Hình 1.2: Hình ảnh các loại AVR.
Sơ đồ bố trí chân của ATmega8 gồm 2 kiểu:
5
Hình 1.3: Sơ đồ bố trí chân của các dạng ATmega8.
6
Hình 1.4: Cấu tạo bên trong của ATmega8.
7
1.2.2. Cấu trúc cơ bản của ATmega8
Hình 1.5: Sơ đồ khối cấu trúc vi điều khiển AVR.
1.2.2.1. Cấu trúc bộ nhớ
Bộ nhớ vi điều khiển AVR có cấu trúc Harvard là cấu trúc có đường
Bus riêng cho bộ nhớ chương trình và bộ nhớ dữ liệu. Bộ nhớ AVR được
chia làm 2 phần chính: Bộ nhớ chương trình (program memory) và bộ nhớ dữ
liệu (Data memory).
Bộ nhớ chương trình:
Bộ nhớ chương trình của AVR là bộ nhớ Flash có dung lượng 128K
bytes. Bộ nhớ chương trình có độ rộng Bus là 16 bit. Những địa chỉ đầu tiên
của bộ nhớ chương trình được dùng trong bảng vecto ngắt. Đối với Atmega 8
bộ nhớ chương trình có thể chia làm 2 phần: phần boot loader (Boot loader
program section) và phần ứng dụng (Application program section).
8
Bộ nhớ dữ liệu:
Bộ nhớ dữ liệu của AVR được chia làm hai phần chính là bộ nhớ
SRAM và bộ nhớ EEPROM. Tuy cùng là bộ nhớ dữ liệu nhưng hai bộ nhớ
này lại tách biệt nhau và được đánh địa chỉ riêng:
- Bộ nhớ SRAM: Có dung lượng 1 Kbytes, bộ nhớ SRAM có hai
chế độ hoạt động là chế độ thông thường và chế độ tương thích với
ATmega8.
- Bộ nhớ EEPROM: Đây là bộ nhớ dữ liệu có thể ghi xóa ngay trong
lúc vi điều khiển đang hoạt động và không bị mất dữ liệu khi nguồn cung cấp
bị mất. Với vi điều khiển AT mega8, bộ nhớ EEPROM có kích thước là 512
byte. EEPROM được xem như là một bộ nhớ vào ra được đánh địa chỉ độc
lập với SRAM. Để điều khiển vào ra dữ liệu với EEPROM ta sử dụng ba
thanh ghi:
+ Thanh ghi EEAR (EEARL):
Đây là thanh ghi 16 bit lưu giữ địa chỉ các ô nhớ của EEPROM,
thanh ghi EEAR được kết hợp từ 2 thanh ghi 8 bit là EEARH và thanh ghi
EEARL.
+ Thanh ghi EEDR:
Đây là thanh ghi dữ liệu của EEPROM, là nơi chứa dữ liệu ghi vào
hay lấy ra từ EEPROM.
9
+ Thanh ghi EECR:
Đây là thanh ghi điều khiển EEPROM, ta chỉ sử dụng 4 bit đầu của
thanh ghi này, bốn bit cuối là dự trữ.
Hình 1.6: Tóm tắt bản đồ bộ nhớ bên trong ATmega8.
1.2.2.2. Cổng vào/ra (I/O)
Có thể thấy chip này gồm 28 chân , bao gồm 4 PORT vào ra. Cổng vào
ra là một trong số các phương tiện để vi điều khiển giao tiếp với các thiết bị
ngoại vi. Ở ATmega8 có tất cả các cổng vào ra 8 bit là: PORTB, PORTC,
PORTD Các cổng vào ra của AVR là cổng vào hai chiều có thể định hướng,
tức có thể chọn hướng của cổng là hướng vào (input) hay hướng ra
(output). Tất cả các cổng vào ra của AVR đều có chức năng Đọc – Chỉnh
sửa – Ghi (Read – Modify – Write) khi sử dụng chúng như là các cổng vào
ra số thông thường. Điều này có nghĩa là khi ta thay đổi hướng một chân nào
10
đó thì nó không làm ảnh hướng tới hướng của các chân khác. Tất cả các chân
của các PORT đều có điện trở kéo lên (pull-up) riêng, ta có thể cho phép hay
không cho phép điện trở kéo lên này hoạt động.
Điện trở kéo lên là một điện trở được dùng khi thiết kế các mạch điện tử
logic. Nó có một đầu được nối với nguồn điện áp dương (VCC – Vdd) và đầu
còn lại được nối với tín hiệu lối vào/ra của một mạch logic chức năng.
Thanh ghi DDRx:
Đây là thanh ghi 8 bit (có thể đọc/ghi) có khả năng điều khiển hướng
của cổng (lối vào hay lối ra). Khi một bit của thanh ghi này được set lên 1
thì chân tương ứng với nó được cấu hình thành ngõ ra. Ngược lại, nếu bit
của thanh ghi DDRx là 0 thì chân tương ứng với nó được thiết lập thành ngõ
vào.
Thanh ghi PORTx:
PORTx là thanh ghi 8 bit có thể đọc ghi. Đây là thanh ghi dữ liệu của
PORTx. Nếu thanh ghi DDRx thiết lập cổng là lối ra, khi đó giá trị của thanh
ghi PORTx cũng là giá trị của các chân tương ứng của PORTx, nói cách khác,
khi ta ghi một giá trị logic lên 1 bit của thanh ghi này thì chân tương ứng
với bit đó cũng có cùng mức logic. Khi thanh ghi DDRx thiết lập cổng thành
lối vào thì thanh ghi PORTx đóng vai trò như một thanh ghi điều khiển cổng.
Thanh ghi PINx:
PINx không phải là một thanh ghi thật sự, đây là địa chỉ trong bộ nhớ
I/O kết nối trực tiếp với các chân của cổng. Khi ta đọc PORTx tức ta đọc dữ
liệu được chốt trong PORTx, còn khi đọc PINx thì giá trị logic hiện thời ở
chân của cổng tương ứng được đọc. Vì thế đối với thanh ghi PINx ta có thể
đọc mà không thể ghi.
1.2.3. Bộ định thời của ATmega8
Timer/Counter (T/C) là các module độc lập với CPU. Chức năng chính
của các bộ T/C, như tên gọi của chúng, là định thời (tạo ra một khoảng thời
11
gian, đếm thời gian…) và đếm sự kiện. Trên các chip AVR, các bộ T/C còn
có thêm chức năng tạo ra các xung điều rộng PWM (Pulse Width
Modulation), ở một số dòng AVR, một số T/C còn được dùng như các bộ
canh chỉnh thời gian (calibration) trong các ứng dụng thời gian thực. Các bộ
T/C được chia theo độ rộng thanh ghi chứa giá trị định thời hay giá trị đếm
của chúng, cụ thể trên chip Atmega8 có 2 bộ Timer 8 bit (Timer/Counter0 và
Timer/Counter2) và 1 bộ 16 bit (Timer/Counter1). Chế độ hoạt động và
phương pháp điều khiển của từng T/C cũng không hoàn toàn giống nhau.
1.2.4. Bộ định thời 0:
Hình 1.7: Sơ đồ khối bộ định thời 0.
Bộ định thời 0 là bộ định thời 8 bit, bộ định thời 0 liên quan tới 7 thanh
ghi với nhiều chế độ thực thi khác nhau.
Các định nghĩa sau sẽ đƣợc sử dụng cho bộ định thời 0 và 2:
- BOTTOM: Bộ đếm đạt tới giá trị BOTTOM khi nó có giá trị 00h.
- MAX: Bộ đếm đạt tới giá trị Max khi nó bằng FFh.
12
- TOP: Bộ đếm đạt giá trị TOP khi nó bằng với giá trị cao nhất trong
chuỗi đếm, giá trị cao nhất trong chuỗi đếm không nhất thiết là FFh mà có thể
là bất kỳ giá trị nào được qui định trong thanh ghi OCRn (n=0,2), tùy theo chế
độ thực thi.
Các thanh ghi trong bộ định thời 0 bao gồm:
- Thanh ghi Timer/Counter Control Register – TCCR0
- Thanh ghi Timer/Counter Register - TCNT0
- Thanh ghi Output Compare Register – OCR0
- Thanh ghi Timer/Counter Interrupt Mask Register – TIMSK
- Thanh ghi Timer/Counter Interrupt Flag Register – TIFR
- Thanh ghi Special Function IO Register – SFIOR
- Thanh ghi Asynchronous Status Register – ASSR
1.2.5. Bộ định thời 2
Hình 1.8: Sơ đồ khối bộ định thời 2.
Bộ định thời 2 là bộ định thời 8 bit, bộ định thời 2 liên quan tới 5
thanh ghi với nhiều chế độ thực thi khác nhau. Thuộc tính chính của bộ định
13
thời 2 gồm: Bộ đếm đơn kênh, xóa bộ định thời khi có sự kiện “so sánh
khớp” và tự động nạp lại, PWM hiệu chỉnh pha, đếm sự kiện bên ngoài.
Các thanh ghi trong bộ dịnh thời 2:
- Thanh ghi Timer/Counter Control Register – TCCR2
- Thanh ghi Timer/Counter Register – TCNT2
- Thanh ghi Output Compare Register – OCR2
- Thanh ghi Timer/Counter Interrupt Mask Register – TIMSK
- Thanh ghi Timer/Counter Interrupt Flag Register – TIFR
1.2.6. Bộ định thời 1:
Hình 1.9: Sơ đồ khối bộ định thời 1.
14
Các định nghĩa sau sẽ đƣợc sử dụng trong bộ định thời 1:
- BOTTOM: Bộ đếm đạt đến giá trị BOTTOM khi nó có giá trị 0000h.
- MAX: Bộ đếm có giá trị MAX khi nó bằng FFFFh.
- TOP: Bộ đếm đạt giá trị TOP khi nó bằng với giá trị cao nhất trong
chuỗi đếm, giá trị cao nhất trong chuỗi đếm không nhất thiết là FFFFh mà có
thể là bất cứ giá trị nào được qui định trong thanh ghi OCRnX (X=A,B) hay
ICRn, tùy theo chế độ thực thi.
Ngõ ra khối Compare Match Output Unit:
Hình 1.10: Sơ đồ ngõ ra khối.
Nhìn hình ta thấy Pin OCnX (chẳn hạn pin 15 của IC tương ứng với
OC1A), là ngõ ra của khối Compare Match Output Unit, có thể được nối với
3 thanh ghi là OCnX, PortX và DDRX. Thanh ghi nào được nối với OCn là
phụ thuộc vào các bit COMn1:0 (tức là tùy theo chế độ hoạt động của bộ
định thời). Nếu ta thiết lập bộ định thời hoạt động ở chế độ thường (tức
không sử dụng chức năng so sánh khớp) thì chân OCn trở thành chân vào ra
số thông thường.
15
Bộ định thời 1 bao gồm các thanh ghi:
TCNT1H và TCNT1L (Timer/Counter Register): là 2 thanh ghi
8 bit tạo thành thanh ghi 16 bits (TCNT1) chứa giá trị vận hành của T/C1. Cả
2 thanh ghi này cho phép đọc và ghi giá trị một cách trực tiếp.
TCCR1A và TCCR1B (Timer/Counter Control Register): là 2
thanh ghi điều khiển hoạt động của T/C1. Tất cả các chế độ hoạt động của
T/C1 đều được xác định thông qua các bit trong 2 thanh ghi này. Tuy nhiên,
đây không phải là 2 byte cao và thấp của một thanh ghi mà là 2 thanh ghi
hoàn toàn độc lập. Các bit trong 2 thanh ghi này bao gồm các bit chọn mode
hay chọn dạng sóng (Waveform Generating Mode – WGM), các bit quy định
dạng ngõ ra (Compare Output Match – COM), các bit chọn giá trị chia
prescaler cho xung nhịp (Clock Select – CS)…Cấu trúc của 2 thanh ghi:
Nhìn chung để “thuộc” hết cách phối hợp các bit trong 2 thanh ghi
TCCR1A và TCCR1B là tương đối phức tạp vì T/C1 có rất nhiều mode hoạt
động. Ở đây, trong thanh ghi TCCR1B có 3 bit khá quen thuộc là CS10, CS11
và CS12. Đây là các bit chọn xung nhịp cho T/C1 như truong T/C0.
16
Bảng 1.1: Tóm tắt các chế độ chọn xung nhịp trong T/C1.
OCR1A và OCR1B (Ouput Compare Register A và B): có một
số khái niệm mới mà chúng ta cần biết khi làm việc với T/C1, một trong số đó
là Ouput Compare (ngõ so sánh ra). Trong lúc T/C hoạt động, giá trị thanh ghi
TCNT1 tăng, giá trị này được liên tục so sánh với các thanh ghi OCR1A và
OCR1B (so sánh độc lập với từng thanh ghi), việc so sánh này trên AVR gọi
là gọi là Ouput Compare. Khi giá trị so sánh bằng nhau thì 1 “Match” xảy ra,
khi đó một ngắt hoặc 1 sự thay đổi trên chân OC1A (hoặc/và chân OC1B) xảy
ra (đây là cách tạo PWM bởi T/C1). A và B đại diện cho 2 kênh (channel).
Cũng vì điều này mà chúng ta có thể tạo 2 kênh PWM bằng T/C1. Tóm lại,
cơ bản 2 thanh ghi này chứa các giá trị để so sánh.
17
ICR1 (InputCapture Register 1): khái niệm mới thứ 2 của T/C1
là Input Capture. Khi có 1 sự kiện trên chân ICP1 (chân 14), thanh ghi ICR1
sẽ “capture” giá trị của thanh ghi đếm TCNT1. Một ngắt có thể xảy ra trong
trường hợp này, vì thế Input Capture có thể được dùng để cập nhật giá trị
“TOP” của T/C1.
TIMSK (Timer/Counter Interrupt Mask Register): các bộ T/C
trên AVR dùng chung thanh ghi mặt nạ ngắt, vì thế TIMSK cũng được dùng
để quy định ngắt cho T/C1. Có điều lúc này ta chỉ quan tâm đến các bit từ 2
đến 5 của TIMSK. Có tất cả 4 loại ngắt trên T/C1 (nhớ lại T/C0 chỉ có 1 loại
ngắt tràn).
- Bit 2 trong TIMSK là TOIE1, bit quy định ngắt tràn cho thanh T/C1
(tương tự trường hợp của T/C0).
- Bit 3, OCIE1B là bit cho phép ngắt khi có 1 “Match” xảy ra trong việc
so sánh TCNT1 với OCR1B.
- Bit 4, OCIE1A là bit cho phép ngắt khi có 1 “Match” xảy ra trong việc
so sánh TCNT1 với OCR1A.
- Bit 5, TICIE1 là bit cho phép ngắt trong trường hợp Input Capture
được dùng.
Cùng với việc set các bit trên, bit I trong thanh ghi trạng thái phải được
set nếu muốn sử dụng ngắt.
- TIFR (Timer/Counter Interrupt Flag Register): là thanh ghi cờ nhớ cho
tất cả các bộ T/C. Các bit từ 2 đến 5 trong thanh ghi này là các cờ trạng thái
của T/C1.
18
Các chế độ hoạt động: có tất cả 5 chế độ hoạt động chính trên T/C1.
Các chế độ (mode) hoạt động cơ bản được quy định bởi 4 bit Waveform
Generation Mode (WGM13, WGM12, WGM11, WGM10) và một số bit phụ
khác. 4 bit WGM lại được bố trí nằm trong 2 thanh ghi TCCR1A và TCCR1B
(WGM13 là bit 4, WGM12 là bit 3 trong TCCR1B trong khi WGM11 là bit 1
và WGM10 là bit 0 trong thanh ghi TCCR1A) vì thế cần phối hợp 2 thanh ghi
TCCR1 trong lúc điều khiển T/C1.
Các chế độ hoạt động của T/C1:
Bảng 1.2: Các bit WGM và các chế độ hoạt động của T/C1.
19