LỜI NÓI ĐẦU
Ngày nay, khoa học kỹ thuật luôn không ngừng phát triển và đổi mới
từng ngày, từng giờ, tác động trực tiếp đến đời sống con người. Các hệ
thống điện tử đã tham gia vào công nghiệp làm tăng năng suất lao động,
giảm bớt sức lao động của con người. Có thể nói, điện tử là một trong những
nghành nghề phát triển mũi nhọn, có những bước tiến vượt bậc về công nghệ
cũng như ứng dụng trong cuộc sống.
Trong lĩnh vực sản xuất cũng như trong đời sống hàng ngày , việc đo
lường các đại lượng vật lý luơn đúng một vai trị quan trọng vỡ từ đó người
sử dụng cú thể biết được các thơng số mình đang làm việc và từ đó sẽ khống
chế và điều khiển chúng cho phù hợp với mụch đích của mình.
Hiện là sinh viên năm thứ 4 của trường Đại học Bách Khoa Hà Nội,
chúng em đã có những cái nhìn sâu hơn, tổng quát hơn về ngành mình đã lựa
chọn từ đó đã có thể thiết kế những bo mạch cụ thể có ứng dụng thực tế hơn
trong cuộc sống hàng ngày để sau khi ra trường có thể ứng dụng chúng
nhiều hơn vào thực tế.
Với mục đích tìm hiểu và thiết kệ một hệ thống đo lường, chúng em
đã chọn đề tài: “ Thiết kế một hệ thống đo lường cơ bản gồm đo nhiệt độ
sử dụng cảm biến nhiệt Ds18b20 và đo tốc độ động cơ sử dụng motor –
encoder” làm đề tài cho đồ án môn học của mình.
Mặc dự được sự chỉ dẫn tận tình của giảng viân hướng dẫn , chúng em
đã rất cố gắng nhưng khối lượng kiến thức và thời gian cú hạn , sẽ khụng
tránh khỏi những thiếu sót mong thầy cụ thĩng cảm. Chúng em mong được
đún nhận những ý kiến từ các thầy cơ và các bạn để cú thể tiếp tục mở rộng
hướng nghiân cứu cho đề tài của mình.
CHƯƠNG I
GIỚI THIỆU CHUNG VỀ BỘ VI ĐIỀU KHIỂN
GIỚI THIỆU CHUNG
Bộ vi điều khiển viết tắt là Micro – controller, là mạch tích hợp trờn
một con chip và cú thể lập trình được , dùng để điều khiển hoạt động của
một hệ thống . Theo các tập lệnh của nhà sản xuất , người sử dụng cú thể lập
o Lập trình trong hệ thống bởi chương trình on-chip boot.
o Thao tác đọc ghi trong khi nghỉ.
o 512 Byte EEPROM.
Có thể thực hiện 100.000 lần ghi xóa.
o 1Kbyte SRAM nội.
o Lập trình khóa an toàn phần mềm.
- Ghép nối ngoại vi:
o 2 bộ định thời/bộ đếm 8 bit với bộ chia tần số độc lập và chế độ
so sánh.
o 1 bộ định thời/bộ đếm 16 bit với bộ chia tần số, chế độ so sánh
và chế độ bắt mẫu (Capture).
o Bộ đếm thời gian thực với bộ dao động độc lập.
o Bốn kênh PWM.
o Bộ ADC 8 kênh 10 bit.
o Bộ truyền dữ liệu đồng bộ/bất đồng bộ USART.
o Bộ truyền dữ liệu chuẩn SPI.
o Watchdog timer khả trình với bộ dao động nội riêng biệt.
o Bộ so sánh Analog.
- Các đặc điểm khác:
o Power-on Reset và phát hiện Brown-out khả trình.
o Bộ tạo dao động nội.
o Nguồn ngắt nội và ngoại.
o 6 chế độ ngủ: Idle, ADC noise reduction, Power-save, Power-
down, Standby và Extended Standby.
- Ngõ vào/ra: cú 32 ngõ vào ra.
- Điện áp hoạt động:
o 2.7V – 5.5V đối với ATmega16L.
o 4.5V – 5.5V đối với ATmega16.
- Tần số hoạt động:
o 0 – 8MHz đối với ATmega16L.
cho nhiều ứng dụng điều khiển nhúng. ATmega32 được hỗ trợ đầy đủ với
các công cụ hỗ trợ phát triển cũng như lập trình, bao gồm: trình biên dịch C,
macro assembler, mô phỏng/dò lỗi lập trình, mô phỏng mạch điện và các bộ
kit thí nghiệm.
2.3. Sơ đồ chân của ATmega16:
Hình 2.2 – Sơ đồ chân của ATmega16
- GND: chân nối mass.
- VCC: điện áp nguồn.
- Port A (PA0…PA7): ngõ vào/ra Port A.
Các chân Port A cũng là ngõ vào analog của bộ chuyển đổi A/D
Chân Chức năng
PA7 ADC7 (Ngõ vào ADC 7)
PA6 ADC6 (Ngõ vào ADC 6)
PA5 ADC5 (Ngõ vào ADC 5)
PA4 ADC4 (Ngõ vào ADC 4)
PA3 ADC3 (Ngõ vào ADC 3)
PA2 ADC2 (Ngõ vào ADC 2)
PA1 ADC1 (Ngõ vào ADC 1)
PA0 ADC0 (Ngõ vào ADC 0)
- Port B (PB0…PB7): ngõ vào/ra Port B.
Các chức năng khác của Port B:
Chân Chức năng
PB7 SCK (Chân Clock của SPI)
PB6 MISO (Master Input / Slave Output của SPI)
PB5 MOSI (Master Output / Slave Input của SPI)
PB4 SS (Ngõ vào chọn Slave của SPI)
PB3 AIN1 (Ngõ vào Negative của bộ so sánh analog).
OC0 (Ngõ ra so sánh của Timer/Counter 0).
PB2 AIN0 (Ngõ vào Possitive của bộ so sánh analog).
INT2 (Ngõ vào ngắt ngoài 2)
- XTAL2: ngõ ra của mạch khuếch đại dao động đảo.
- AVCC: là chân nguồn cấp cho Port A và bộ chuyển đổi A/D. Nên nối
chân này với chân VCC ngay cả khi không sử dụng ADC. Nếu dựng
ADC thì nên nối chân này với chân VCC qua 1 tụ lọc thông thấp.
- AREF: chân tham chiếu điện áp analog của bộ chuyển đổi A/D.
2.4. Bộ nhớ của Atmega16:
2.4.1. Bộ nhớ chương trình ISP Flash:
Vi điều khiển ATmega16 có bộ nhớ Flash tới 16Kbyte để lưu giữ
chương trình. Do tất cả các lệnh của AVR đều là 16 hoặc 32 bit nên bộ nhớ
Flash được tổ chức theo kiểu 8K x 16. Nhằm đảm bảo phần mềm được an
toàn, bộ nhớ chương trình Flash được chia thành 2 phần: phần chương trình
Boot (Boot Program Sector) và phần chương trình ứng dụng (Application
Program Sector).
Bộ nhớ Flash có thể ghi xóa được đến 1.000 lần. Bộ đếm chương trình
của ATmega16 có kích thước 13bit để ghi địa chỉ cho bộ nhớ chương trình
8K.
Bảng phân chia 2 phần của bộ nhớ:
Hình 2.3 – Sơ đồ phân chia bộ nhớ
2.4.2. Bộ nhớ dữ liệu SRAM:
Hình 2.4 – Sơ đồ địa chỉ bộ nhớ
Hình trên là địa chỉ của bộ nhớ dữ liệu của các thanh ghi R0 – R31, bộ
nhớ IO và bộ nhớ SRAM. 63 địa chỉ đầu là của các thanh ghi R và IO, còn
bộ nhớ SRAM chiếm 1024 địa chỉ còn lại.
2.4.3.Bộ nhớ dữ liệu EEPROM:
Vi điều khiển ATmega16 có bộ nhớ EEPROM với kích thước 512
byte. Nó được phân chia thành một khu vực riêng và có thể truy cập đến
từng byte. Bộ nhớ EEPROM có thể ghi xóa đến 100.000 lần.
2.5. Xung nhịp của hệ thống và việc lựa chọn xung nhịp:
Vi điều khiển ATmega16 có nhiều lựa chọn trong việc thiết lập xung
nhịp cho hệ thống. Xung nhịp có thể do mạch tạo dao động bên trong vi điều
Trong đề tài này, Timer/Counter0 được dựng để tạo xung PWM. Vì thế,
phần này chỉ đề cập đến chế độ hiệu chỉnh PWM của Timer/Counter0.
Chế độ hiệu chỉnh xung PWM giúp tạo ra dạng xung PWM với độ phân
giải cao. Chế độ này dựa trên hoạt động dual-slope (dạng hai sườn lên xuống
theo giá trị thanh ghi). Bộ đếm đếm liên tục từ giá trị BOTTOM đến MAX
rồi đếm từ MAX xuống BOTTOM. Nếu chọn ngõ ra dạng không đảo (non-
inverting), chân OC0 ở mức 0 tại giá trị so sánh giữa OCR0 với TCNT0 khi
đếm lên, và ở mức 1 tại giá trị so sánh khi đếm xuống. Nếu chọn ngõ ra dạng
đảo (inverting), chân OC0 sẽ hoạt động ngược lại. Chế độ hoạt động dual-
slope có tần số thấp hơn so với chế độ single-slope. Tuy nhiên, do đặc tính
đối xứng nên kiểu dual-slope thích hợp hơn cho các ứng dụng điều khiển
động cơ.
Độ phân giải của chế độ PWM này là 8bit. Bộ đếm sẽ tăng dần đến giá trị
MAX. Khi đạt tới MAX, bộ đếm sẽ đảo chiều và đếm xuống tới BOTTOM.
Như vậy, một chu kỳ của timer bằng thời gian giữa hai lần giá trị TCNT0
đạt MAX.
Hình 2.7 - Giản đồ thời gian của chế độ PWM
Cờ tràn TOV0 được set mỗi lần bộ đếm đạt tới giá trị BOTTOM. Khi
timer đạt tới giá trị này, ta có thể sử dụng để kích hoạt chương trình ngắt qua
cờ báo ngắt.
Xung PWM được đưa ra trên chân OC0. Việc thiết lập ngõ ra dạng đảo
(inverting) hay không đảo (non-inverting) được thực hiện qua hai bit
COM01 và COM00. Giá trị thực sự của OC0 chỉ có thể thấy được khi ta đặt
OC0 là ngõ ra.
Tần số của xung PWM được tính toán dựa vào công thức sau:
Trong đó, N là giá trị của bộ chia tần số (1, 8, 64, 256,1024).
Thanh ghi OCR0 sẽ đạt tới cực trị (cực đại hoặc cực tiểu) thay cho các
trường hợp đặc biệt khi phát ra dạng xung PWM. Trong chế độ không đảo,
nếu OCR0 được đặt giá trị BOTTOM, ngõ ra luôn ở mức thấp và nếu OCR0
được đặt giá trị MAX thì ngõ ra luôn ở mức cao. Đối với chế độ đảo thì hoạt
- Ngắt khi tràn hoặc tại giá trị so sánh.
Hình 2.9 - Sơ đồ khối của timer/counter2
Các chế độ hoạt động của Timer/Counter2:
- Chế độ bình thường.
- Chế độ xóa timer khi đạt tới giá trị so sánh.
- Chế độ Fast PWM.
- Chế độ PWM.
Giới thiệu chế độ xóa giá trị Timer khi đạt tới giá trị so sánh (CTC):
Trong chế độ này, thanh ghi OCR2 được dựng để thiết lập độ phân giải
cho bộ đếm. Khi TCNT đạt tới giá trị bằng với OCR2, bộ đếm được xóa về
0. Thanh ghi OCR2 xác định giá trị lớn nhất và cũng là độ phân giải của
Timer2.
Hình 2.10 - Giản đồ thời gian của chế độ CTC
Khi bộ đếm đạt tới giá trị TOP, cờ OCF2 kích hoạt chương trình ngắt.
Khi đã được kích hoạt, chương trình ngắt có thể được sử dụng để cập nhật
giá trị TOP.
Chu kỳ của Timer trong chế độ CTC có thể tính như sau:
Với công thức trên, ta có thể tính thời gian lấy mẫu như sau: Timer 8bit,
giá trị MaxVal đặt trong OCR = 155, nguồn xung clock 16MHz, chia tần số
1024 thì thời gian lấy mẫu là 10ms.
2.7. Bộ truyền nhận dữ liệu USART:
USART (The Universal Synchronous and Asynchronous serial Receiver
and Transmitter – Bộ truyền nhận nối tiếp tổng hợp đồng bộ và bất đồng bộ)
Đặc điểm:
- Hoạt động song công.
- Cho phép làm việc ở các chế độ : đồng bộ hay bất đồng bộ.
- Bộ phát tốc độ baud (BAUD RATE) với độ phân giải cao.
- Hỗ trợ Format khung truyền nối tiếp : 5,6,7,8, hay 9 Data Bits và 1
hoặc 2 bit Stop.
- Hỗ trợ kiểm tra bit chẵn , lẻ bằng phần cứng.
đó Data được truyền nối tiếp trên chân TxD (PD0) của MCU.
o RXB: Thanh ghi bộ đệm nhận. Khi PC send 1 gói Data đến
MCU thì gói Data đó nằm trong RXB do đó cần phải chuyển
Data trong RXB vào 1 thanh R (vd: R16).
RXB gồm có 2 mức FIFO. FIFO sẽ thay đổi trạng thái của nó
bất cứ khi nào RXB được truy xuất. Vì trạng thái này của RXD mà
không được dựng những lệnh (SBI, CBI) ở đây. Cẩn thận với các
lệnh kiểm tra (SBIC và SBIS), vì chúng cũng sẽ làm thay đổi trạng
thái của FIFO.
- USART Control and Status Register A – UCSRA
(Thanh ghi điều khiển và trạng thái A)
o Bit 7 – RXC: USART Receive Complete
Cờ RXC =[1] khi có data chưa được đọc trong RXB và
RXC =[0] khi RXB rỗng (không còn bất kì data nào trong RXB
chưa đọc).
Cờ RXC có thể được dựng để tạo ra ngắt khi nhận xong (kết
hợp với bit RXCIE).
o Bit 6-TXC: USART Transmit Complete
Cờ TXC =[1] khi toàn bộ data trong thanh ghi dịch truyền
đã dược dịch ra ngoài và không còn data mới nào xuất hiện
trong TXB (UDR). TXC tự động được xóa nếu có 1 ngắt khi
truyền xong được thực thi hay nó cũng có thể được xóa bằng
cách ghi vào vị trí bit của nó.
Cờ TXC có thể được dựng để tạo ra ngắt khi truyền xong
(kết hợp với bit RXCIE).
o Bit 5-UDRE: USART Data Register Empty
Cờ UDRE chỉ thị nếu TXR (UDR) sẵn sàng để nhận dữ liệu
mới. Nếu UDRE=[1] thì bộ đệm trống, vì thế mà bộ đệm sẵn
sàng nhận dữ liệu mới. Cờ UDRE có thể tạo ra 1 ngắt khi data
trong thanh ghi trống rỗng (kết hợp với bit UDRIE).
UDRIE=[1] cho phép ngắt khi Data trong thanh ghi trống.
Ngắt này chỉ được tạo ra khi UDRIE=[1], ngắt toàn cục được
phép và UDRE =[1] (trong UCSRA).
o Bit 4-RXEN: Receive Enable
RXEN=[1]: cho phép nhận.
o Bit 3-TXEN : Transmit Enable
TXEN=[1]: cho phép truyền.
o Bit 2-UCSZ2: character size
UCSZ2 kết hợp với UCSZ1:0 trong thanh ghi UCSRC dựng
để thiết lập khung dữ liệu (số Data_Bit có trong 1 khung
truyền. VD: 5bit, 6bit, 8bit…) truyền và nhận .
o Bit 1-RXB: Receive Data bit 8.
RXB chứa bit thứ 9 nhận về khi hoạt động ở chế độ khung
truyền 9 bit. Nó phải được đọc trước khi đọc những bit thấp từ
UDR.
o Bit 0-TXB: Transmit Data bit 8.
TXB chứa bit thứ 9 sẽ được truyền đi khi hoạt động ở chế
độ khung truyền 9 bit. Nó phải được ghi trước khi ghi những
bit thấp vào UDR.
- SART Control and Status Register C – UCSRC
o Bit 7 – URSEL: Register Select
Bit nay dựng để lựa chọn thanh ghi UCSRC hay UBRRH.
URSEL=[1]: UCSRC
URSEL=[0]: UBBRH
o Bit 6 – UMSEL: USART Mode Select (lựa chọn truyền đồng
bộ hay bất đồng bộ)
o Bit 5:4 – UPM 1:0: Parity Mode (lựa chọn bit chẵn – lẻ)
o Bit 3 – USBS: stop bit select
o Bit 2:1-UCSZ 1:0: character size (Format khung truyền)
o Bit 0 – UCPOL: Clock Polarity