Với tốc độ xung nhịp tới 16Mhz, bộ nhớ chương trình tối đa đến 256 kB, và rất nhiều chức năng ngoại vi tích hợp sẵn, vi điều khiển học AVR có thể đáp ứng tốt nhiều ứng dụng trong thực tế
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN ĐIỆN TỬ - VIỄN THÔNG
Giảng viên hướng dẫn: Phan Văn Phương
Sinh viên: Đào Duy Khiêm MSSV: 20172627
Hà Nội, 12-2020
Trang 2MỤC LỤC
MỤC LỤC i
DANH SÁCH HÌNH ẢNH ii
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT 1
1.1 Tổng quan về Atmel AVR 1
1.1.1 Vi điều khiển Atmel AVR 1
1.1.2 Sơ đồ chân ATmega16A 3
1.1.3 Mô tả các chân của Atmega16A 3
1.1.4 Các module của ATmega16A 5
1.1.5 Ứng dụng 13
1.2 Kết luận 13
CHƯƠNG 2: THIẾT KẾ 14
2.1 Yêu cầu 14
2.2 Sơ đồ khối của mạch 14
2.3 Phân tích thiết kế từng khối 14
2.3.1 Khối cảm biến 14
2.3.2 Khối vi điều khiển 15
2.3.3 Khối hiển thị 16
2.3.5 Khối nguồn 18 CHƯƠNG 3: Code a
1 Chương trình chính a
2 Thư viện “LCD_16x2_H.h” b
3 Ảnh mạch thực tế d CHƯƠNG 4: Kết Luận f
i
Trang 3DANH SÁCH HÌNH ẢNH
Hình 1.1 Sơ đồ khối của Atmega16A 2
Hình 1.2 Sơ đồ các chân của ATmega16A 3
Hình 1.3 Sơ đồ cấu trúc CPU của Atmega16A 6
Hình 1.4 Thanh ghi trạng thái SREG 6
Hình 1.5 Thanh ghi con trỏ ngăn xếp 7
Hình 1.6 Thanh ghi DDRA 8
Hình 1.7 Thanh ghi PORTA 9
Hình 1.8 Thanh ghi PINA 9
Hình 1.9 Bộ nhớ SRAM 10
Hình 1.10 Sơ đồ cấu trúc của bộ định thời 11
Hình 1.11 Sơ đồ khối bộ chuyển đổi A/D 12
Hình 2.1 Sơ đồ khối 14
Hình 2.2 LM35 15
Hình 2.3 Atmega16A 16
Hình 2.4 LCD 1602A 19
Hình 2.5 Sơ đồ chân LCD 19
Hình 2.6 Khối nguồn 20
Hình 3.1 Mạch thực tế 23
ii
Trang 4CHƯƠNG 1: CƠ SỞ LÝ THUYẾT
1.1 Tổng quan về Atmel AVR
1.1.1 Vi điều khiển Atmel AVR
1.1.1.1 Khái niệm
Vi điều khiển AVR do hãng Atmel sản xuất được giới thiệu lần đầu năm 1996 AVR có rất nhiều dòng khác nhau bao gồm dòng Tiny AVR (như AT tiny 13, AT tiny 22…) có kích thước bộ nhớ nhỏ, ít bộ phận ngoại vi, rồi đến dòng AVR (chẳn 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ó kích thước vài Kbyte đến vài trăm Kb cùng với các bộ ngoại vi đa dạng được tích hợp trên chip, cũng có dòng tích hợp cả bộ LCD trên chip (dòng LCD AVR) Tốc độ của dòng Mega cũng cao hơn
so với 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
Năm 2008, Atmel lại tiếp tục cho ra đời dòng AVR mới là megaAVR, với những tính năng mạnh mẽ chưa từng có ở các dòng AVR trước đó Có thể nói XXmegaAVR
là dòng MCU 8 bit mạnh mẽ nhất hiện nay
AVR là một dòng vi điều khiển 8 bit khá mạnh và thông dụng tại thị trường Việt Nam Với tốc độ xung nhịp tới 16Mhz, bộ nhớ chương trình tối đa đến 256 kB, và rất nhiều chức năng ngoại vi tích hợp sẵn, vi điều khiển học AVR có thể đáp ứng tốt nhiều ứng dụng trong thực tế, từ đơn giản đến phức tạp
1.1.1.2 Sơ đồ khối của vi điều khiển AVR Atmega16A
Vi điều khiển AVT Atmega16A gồm 6 phần chính:
CPU của AVR
Trang 5Hình 1.1 Sơ đồ khối của Atmega16A
2
Trang 61.1.2 Sơ đồ chân ATmega16A
Hình 1.2 Sơ đồ các chân của ATmega16A
1.1.3 Mô tả các chân của Atmega16A
Chân VCC: là chân cấp nguồn cho VĐK, nguồn cấp khoảng 5V
Chân GND: là chân nối đất
PortA (từ chân PA7(33) → PA0(40)): Cổng A đóng vai trò đầu vào tương tự cho bộ chuyển đổi A/D, nó cũng có thể là cổng I/O 8 bit nếu không dùng đến
bộ chuyển đổi A/D
PortB (từ chân PB7(8) → PB0(1)): là cổng I/O 8 bit với các các tính năng đặc biệt như sau:
Chân Chức năng đặc biệt
PB7 SCK (SPI Bus Serial Clock)
PB6 MISO (SPI Bus Master Input/Slave Output)
PB5 MOSI (SPI Bus Master Output/Slave Input)
PB4 (SPI Slave Select Input)
3
Trang 7PB3 AIN1 (Analog Comparator Negative Input)
OC0 (Timer/Counter0 Output Compare Match Output)PB2 AIN0 (Analog Comparator Positive Input)
INT2 (External Interrupt 2 Input)
PB1 T1 (Timer/Counter1 External Counter Input)
PB0 T0 (Timer/Counter0 External Counter Input)
XCK (USART External Clock Input/Output)
PortC (từ chân PC7(29) → PC0(22)): là cổng I/O 8 bit với các các tính năng đặc biệt như sau:
Chân Chức năng đặc biệt
PC7 TOSC2 (Timer Oscillator Pin 2)
PC6 TOSC1 (Timer Oscillator Pin 1)
PC5 TDI (JTAG Test Data In)
PC4 TDO (JTAG Test Data Out)
PC3 TMS (JTAG Test Mode Select)
PC1 SDA (Two-wire Serial Bus Data Input/Output Line)
PC0 SCL (Two-wire Serial Bus Clock Line)
PortD (từ chân PD7(21) → PD0(14)): là cổng I/O 8 bit với các các tính năng đặc biệt như sau:
Chân Chức năng đặc biệt
PD7 OC2 (Timer/Counter2 Output Compare Match Output)PD6 ICP (Timer/Counter1 Input Capture Pin)
PD5 OC1A (Timer/Counter1 Output Compare A Match Output)PD4 OC1B (Timer/Counter1 Output Compare B Match Output)PD3 INT1 (External Interrupt 1 Input)
PD2 INT0 (External Interrupt 0 Input)
Chân : là chân dùng để thiết lập trạng thái ban đầu cho vi đầu khiển
4
Trang 8Chân XTAL1 và XTAL2: được sử dụng để nhận nguồn xung clock bên ngoài để hoạt động, thường được nối với thạch anh và các tụ để tạo nguồnxung clock ổn định.
Chân AVCC: là chân điện áp cung cấp nguồn cho Port A và bộ chuyển đổiA/D
Chân AREF: là chân tham chiếu tương tự cho bộ chuyển đổi A/D
1.1.4 Các module của ATmega16A
1.1.4.1 Cấu trúc CPU của ATmega16A
CPU có chức năng đảm bảo sự hoạt động chính xác của các chương trình Do đó
nó phải có khả năng truy cập bộ nhớ, thực hiện các quá trình tính toán, điều khiển các thiết bị ngoại vi và quản lý ngắt
ALU
ALU làm việc trực tiếp với các thanh ghi chức năng chung Các phép toán được thực hiện trong 1 chu kì xung clk Hoạt động của ALU chia làm 3 loại là đại số, logic, bit
Cấu trúc của CPU ATmega16A:
5
Trang 9Hình 1.3 Sơ đồ cấu trúc CPU của Atmega16A
Thanh ghi trạng thái:
Đây là thanh ghi trạng thái có 8 bit lưu trữ trạng thái của ALU sau các phép tính
số học và logic
Hình 1.4 Thanh ghi trạng thái SREG
o C (Carry Flag): Cờ nhớ
o Z (Zero Flag): Cờ zero
o N (Negative Flag): Cờ âm
6
Trang 10o V: Cờ này được set khi tràn số bù 2
o H (Half Carry Flag): được sử dụng ở một số toán hạng
o T (Transfer bit used by BLD and BST instruction): được sử dụng là nơi trung gian giữa BLD và BST
o I (Global Interrupt Enable/Disable Flag): đây là bit cho phép toàn cục ngắt Nếu bit này ở trạng thái logic 0 thì không có một ngắt nào được phục vụCon trỏ ngăn xếp:
Là một thanh ghi 16 bit nhưng có thể xem như là 2 thanh ghi 8 bit với chức năng đặc biệt Có địa chỉ trong các thanh ghi chức năng đặc biệt là $3E (trong bộ nhớ RAM
là $5E) Có nhiệm vụ trỏ tới vùng nhớ trong RAM chứa ngăn xếp
Hình 1.5 Thanh ghi con trỏ ngăn xếp
Khi chương trình phục vụ ngắt hoặc chương trình con thì con trỏ PC được lưu vàongăn xếp trong khi con trỏ ngăn xếp giảm hai vị trí, con trỏ ngăn xếp giảm 1 sau khi thực hiện lệnh PUSH Ngược lại khi thực hiện lệnh POP thì con trỏ ngăn xếp sẽ tăng lên 1 và khi thực hiện lệnh RET hoặc RETI thì con trỏ sẽ tăng lên 2 Như vậy con trỏ ngăn xếp cần được đặt trước chương trình giá trị khởi tạo ngăn xếp trước khi mội chương trình con được gọi hoặc các ngắt cho phép phục vụ và các giá trị ngăn xếp cũng phải lớn hơn hoặc bằng 60H (0x60) vì 5FH trỏ lại các vùng thanh ghi
1.1.4.2 Cổng vào ra I/O
Vi điều khiển ATmega16A có 32 đường vào ra chia làm bốn nhóm 8 bit một Các cổng vào ra của AVR là cổng vào ra 2 chiều có thể định hướng, tức có thể chọn hướng
7
Trang 11củ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ó tính 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 tắt hay đổi hướng của 1 chân nào đó nó không ả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 các cổng (Portx) đề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ở léo lên này hoat động.
Điện trở kéo lên (pull-up): là 1 điện trở được dùng khi thiết kế các mạch điện tử logic Nó có 1 đầu được nói với nguồn điện áp dương ( thường là Vcc hoặc Vdd) và đầu còn lại được nối với tín hiệu lối vào/ra của 1 mạch logic chức năng Điện trở kéo lên có thể được lắp đặt tại các lối vào ra của các khối mạch logic để thiết lập mức logic của khối mạch khi không có thiết bị ngoài nối với lối vào Điện trở kéo lên cũng
có thể lắp đặt tại các giao diện giữa 2 khối mạch logic không cùng loại logic, đặc biệt
là khi 2 khối mạch này được cấp nguồn khác nhau
Khi khảo sát các cổng như là các cổng vào ra số thông thường thì tính chất của các cổng (Port A, PortB, PortC, PortD) là tương tự nhau, nên ta chỉ cần khảo sát 1 cổng nào đó trong 4 cổng của vi điều khiển là đủ Mỗi 1 cổng vào ra của vi điều khiển được liên kết với 3 thanh ghi: PORTx, DDRx, PINx (ở đây x là thay thế cho A,
B, C, D) Ba thanh ghi này sẽ được phối hợp với nhau để điều khiển hoạt động của cổng sau đây là vai trò của 3 thanh ghi trên:
Thanh ghi DDRx
Đây là thanh ghi 8 bit (ta có đọc và ghi ở đây) có tác dụng điều khiển hướng cổng PORTx (làm việc ở chế độ vào hay ra) Nếu như một bit trong thanh ghi này được thiết lập thì bit tương ứng đó trên PORTx được định nghĩa như một cổng ra, còn nếu như bit đó không được thiết lập thì sẽ được hiểu là cổng vào
Hình 1.6 Thanh ghi DDRA
Thanh ghi PORTx
Đây cũng là thanh ghi 8 bit (các bit có thể đọc và ghi) Nó là thanh ghi dữ liệu củacổng PORTx và trong trường hợp nếu cổng được định nghĩa là cổng ra thì khi ta ghi một bit lên thanh ghi này thì chân tương ứng trên port đó cùng có mức logic Trong trường hợp đó mà cổng được định nghĩa là cổng vào thì thanh ghi này mang dữ liệu điều khiển cổng Cụ thể là nếu bit nào đó của thanh ghi này được thiết lập (đưa lên mức 1) thì điện trở kéo lên pull up của chân tương ứng của port đó sẽ được kích hoạt Thanh ghi này sau khi khởi động vi điều khiển sẽ có giá trị là 0x00
8
Trang 12Hình 1.7 Thanh ghi PORTA
Thanh ghi PINx:
Đây là thanh ghi 8 bit chứa dữ liệu vào của PORTx (trong trường hợp PORTx được thiết lập là cổng vào) và nó chỉ có thể đọc mà không ghi vào được
Hình 1.8 Thanh ghi PINA
Bộ nhớ SRAM:
Bộ nhớ SRAM có 1120 ô nhớ dữ liệu đánh địa chỉ cho file thanh ghi, bộ nhớ I/O
và bộ nhớ dữ liệu trong SRAM Trong đó có 96 ô nhớ đầu tiên đánh địa chỉ cho file thanh ghi và bộ nhớ I/O và 1024 ô nhớ tiếp theo đánh địa chỉ cho bộ nhớ trong SRAM
9
Trang 13Hình 1.9 Bộ nhớ SRAM
Bộ nhớ dữ liệu EEPROM:
Đây là bộ nhớ dữ liệu có thể ghi xoá ngay trong lúc vi điều khiẻn hoạt động và không bị mất dữ liệu khi nguồn điện cung cấp bị mất Có thể ví bộ nhớ dữ liệu EEPROM giống như ổ cứng của máy tính Với vi điều khiển ATmega16 chứa bộ nhớ
dữ liệu EEPROM dung lượng 512byte, và được sắp xếp theo từng byte, cho phép các thao tác đọc/ghi từng byte một EEPROM được xem như là 1 bộ nhớ vào ra được đánh địa chỉ độc lập với SRAM, điều này có nghĩa ta cần sử dụng cá lệnh in, out… khi muốn truy xuất tới EEPROM Để điều khiển vào ra dữ liệu với EEPROM ta sử dụng 3 thanh ghi: Thanh ghi địa chỉ (EEARH và EEARL), thanh ghi dữ liệu (EEDR)
và thanh ghi điều khiển (EECR)
Trang 14Bộ chia tần 10 bit
Ngắt nguồn tràn bộ đếm và so sánh
Bộ định thời có thể sử dụng xung clk thông qua bộ chia hoặc xung clk trên chân T0 Khối chọn xung clk điều khiển việc bộ định thời/đếm sẽ dùng nguồn xung nào để tăng giá trị của nó Ngõ ra của khối chọn xung clk được xem là clk của bộ định thời Các thanh ghi TCNT0 và OCR0 là các thanh ghi 8 bit Các tín hiệu yêu cầu ngắt đều nằm trong các thanh ghi TIFR Các ngắt có thể che bởi thanh ghi TIMSK Thanh ghi OCR0 luôn được so sánh với giá trị của bộ định thời/bộ đếm Kết quả so sánh có thể sử dụng để tạo ra PWM hoặc biến đổi tần số ngõ ra tại chân OC0
Hình 1.10 Sơ đồ cấu trúc của bộ định thời
11
Trang 151.1.4.5 Bộ chuyển đổi A/D
Hình 1.11 Sơ đồ khối bộ chuyển đổi A/D
Vi điều khiển ATmega16 có một bộ biến đổi ADC được tích hợp trong chip với các đặc điểm:
Độ phân giải 10bit
Sai số tuyến tính 0.5LSB
Độ chính xác 2LSB
12
Trang 16Thời gian chuyển đổi: 65-260
Có thể lựa chọn 8 kênh đầu vào
Có 2 chế độ chuyển đổi là free running và single conversion
Có nguồn báo ngắt khi hoàn thành việc chuyển đổi
Loại bỏ nhiễu trong chế độ ngủ
Các đầu vào của ADC là 8 chân của PORT A và chúng được thông qua bởi 1 bộ MUX
Để điều khiển vào ra dữ liệu của ADC và CPU chúng ta có 3 thanh ghi: ADMUX
là thanh ghi điều khiển lựa chọn kênh đầu vào cho ADC, ADCSRA là thanh ghi điều khiển và thanh ghi trạng thái của ADC, ADCH và ADCL là thanh ghi dữ liệu
1.1.5 Ứng dụng
Điều khiển cổng ra số
Đọc logic trạng thái đầu vào số, từ bàn phím và jack cắm mở rộng
Đo điện áp tương tự với biến trở vi chỉnh và bộ ADC 10 bit
Điều khiển màn hình tinh thể lỏng với màn hình LCD dạng text
Giao tiếp với máy tính qua chuẩn UART ↔ USB
Thử nghiệm ngắt ngoài, thử khả năng điều chế độ rộng xung
Nhiều ứng dụng điều khiển các chức năng tích hợp sẵn trong vi điều khiển như:vận hành các bộ định thời (Timer) và bộ đếm (Counter), đọc ghi EEPROM, lập trình các ngắt chương trình
mà không thể giải thích hết được trong môn này, do đó em chỉ tập trung vào những khía cạnh mà đề tài yêu cầu như chương tiếp theo dưới đây
13
Trang 17CHƯƠNG 2: THIẾT KẾ
2.1 Yêu cầu
Chế tạo một mạch điện có khả năng đo nhiệt độ trong dải 0 - 100 sử dụng cảm℃biến LM35 Kết quả đo được hiển thị bằng màn hình LCD
2.2 Sơ đồ khối của mạch
Mạch hoàn chỉnh sẽ chia thành 4 khối chính đó là khối nguồn, khối cảm biến, vi điều khiển và LCD Các khối này thực hiện các chức năng khác nhau:
Khối nguồn: cung cấp nguồn đầu vào cho mạch
Khối cảm biến: lấy thông số nghiệt độ đo đầu vào từ bên ngoài.Khối khuếch đại: khuếch đại tín hiệu từ khối cảm biến để đưa sang khối
vi điều khiển:
Khối vi điều khiển: xử lý các thông số đo
Khối hiển thị: hiển thị kết quả ra màn hình
Trang 18- Nếu đo nhiệt độ âm ta phải cấp nguồn âm –Vs cho LM35 vào chân Vout
- Độ chính xác: 1/4 ở nhiệt độ phòng và 3/4 ở nhiệt độ ngoài trời
2.3.2 Khối vi điều khiển
Khối vi điều khiển sử dụng Atmega16A vì đã có sẵn Kit đáp ứng gần đủ chức năng của mạch Hướng đi khác là tự thiết kế mạch riêng và sử dụng VĐK 89S52 vì giá thành rẻ hơn (khoảng 20.000 VNĐ) và vẫn đáp ứng đủ cho việc điều khiển mạch
- 10 bit A/D chuyển đổi 8 kênh
- Chân XTAL1 và XTAL2 được mắc với bộ tạo dao động để ổn địnhxung clock
- Port C và Port D được sử dụng để gửi bit ra LCD 1602
15
Trang 19- IC ATmega có nhiệm vụ chuyển tín hiệu từ LM35 phản hồi cho vi điều khiển dưới dạng điện áp Qua bộ ADC chuyển tín hiệu tương
tự thành số rồi tính toán nhiệt độ gửi cho LCD theo dạng 4 bit
Có rất nhiều loại LCD có hình dáng và kích thước khác nhau, một trong số các loại LCD thông dụng là LCD1602A (16x2) có khả năng hiển thị 2 dòng, mỗi dòng
Trang 20Chân số 3 - VEE: Điều chỉnh độ tương phản của LCD.
Chân số 4 - RS: Chân chọn thanh ghi Nối chân RS với logic "0" hoặc logic "1"
để chọn thanh ghi
• Logic “0”: Bus DB0-DB7 sẽ nối với thanh ghi lệnh IR của LCD (ở chế độ
“ghi” - write) hoặc nối với bộ đếm địa chỉ của LCD (ở chế độ “đọc” - read)
• Logic “1”: Bus DB0-DB7 sẽ nối với thanh ghi dữ liệu DR bên trong LCD.Chân sô 5 - R/W: Chân chọn chế độ đọc/ghi (Read/Write) Nối chân R/W với logic “0” để LCD hoạt động ở chế độ ghi, hoặc nối với logic “1” để LCD ở chế độ đọc
17
Trang 21Chân số 6 - E: Chân cho phép (Enable) Sau khi các tín hiệu được đặt lên bus DB0-DB7, các lệnh chỉ được chấp nhận khi có 1 xung cho phép của chân E.
• Ở chế độ ghi: Dữ liệu ở bus sẽ được LCD chuyển vào (chấp nhận) thanh ghi bên trong nó khi phát hiện một xung (high-to-low transition) của tín hiệu chân E
• Ở chế độ đọc: Dữ liệu sẽ được LCD xuất ra DB0-DB7 khi phát hiện cạnh lên (low-to-high transition) ở chân E và được LCD giữ ở bus đến khi nào chân E xuống mức thấp
Chân số 7 đến Chân sô 14 - D0 đến D7: Tám đường của bus dữ liệu dùng để traođổi thông tin với MPU Có 2 chế độ sử dụng 8 đường bus này:
• Chế độ 8 bit: Dữ liệu được truyền trên cả 8 đường, với bit MSB là bit DB7
• Chế độ 4 bit: Dữ liệu được truyền trên 4 đường từ DB4 tới DB7, bit MSB là DB7
Ở đây nhóm chọn chế độ 8 bit để thuật tiện việc giao tiếp giữa màn hình LCD và
vi xử lí
Chân số 15 - A: Nguồn dương cho đèn nền
Chân số 16 - K: Nguồn âm cho đèn nền