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.
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.
.
55 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 3796 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Đề 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, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
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 trình để vi điều khiển tiến hành đọc, giải mã, lưu trữ thông tin, xử lý thông tin, và từ đó sẽ thực hiện một công việc của một cơ cấu nào đó.
Trong thiết bị điện , điện tử dân dụng , các bộ vi điều khiển điều khiển hoạt động của TV, đầu đọc laser, điện thoại, lò vi song . Trong hệ thống công nghiệp tự động, chúng được sử dụng trong Robot, dây truyền băng tự động. Các hệ thống càng thông minh thì bộ vi điều khiển càng đóng vai trò quan trọng.
I. GIỚI THIỆU TỔNG QUAN VỀ VI ĐIỀU KHIỂN ATMEGA 16
ATmega16 là vi điều khiển chuẩn CMOS 8 bit tiết kiệm năng lượng, được chế tạo dựa trên cấu trúc AVR RISC (Reduced Instruction Set Computer), đây là cấu trúc có tốc độ xử lý cao hơn nhiều so với cấu trúc CISC (Complex Instruction Set Computer). Tần số hoạt động của vi điều khiển AVR bằng với tần số của thạch anh, trong khi với họ vi điều khiển theo cấu trúc CISC như họ 8051 thì tần số hoạt động bằng tần số thạch anh chia cho 12. Hầu hết các lệnh được thực thi trong một chu kỳ xung nhịp, do đó ATmega16 có thể đạt được tốc độ xử lý đến một triệu lệnh mỗi giây (với tần số 1MHz). Đặc điểm này cho phép người thiết kế có thể tiết kiệm tối đa mức độ tiêu thụ năng lượng mà vẫn đảm bảo tốc độ xử lý.
Sau đây là các đặc tính của ATmega16:
Hiệu năng cao, tiêu thụ ít năng lượng.
Kiến trúc RISC:
131 lệnh – hầu hết các lệnh thực thi trong một chu kỳ máy.
32 thanh ghi 8 bit đa năng.
Tốc độ thực hiện lên tới 16 triệu lệnh trong 1 giây (tần số 16MHz).
Các bộ nhớ chương trình và bộ nhớ dữ liệu:
16Kbyte bộ nhớ Flash có khả năng tự lập trình trong hệ thống.
Có thể thực hiện được 1.000 lần ghi xóa.
Vùng mã Boot tùy chọn với những bit khóa độc lập.
Lập trình trong hệ thống bởi chương trình on-chip boot.
Thao tác đọc ghi trong khi nghỉ.
512 Byte EEPROM.
Có thể thực hiện 100.000 lần ghi xóa.
1Kbyte SRAM nội.
Lập trình khóa an toàn phần mềm.
Ghép nối ngoại vi:
2 bộ định thời/bộ đếm 8 bit với bộ chia tần số độc lập và chế độ so sánh.
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).
Bộ đếm thời gian thực với bộ dao động độc lập.
Bốn kênh PWM.
Bộ ADC 8 kênh 10 bit.
Bộ truyền dữ liệu đồng bộ/bất đồng bộ USART.
Bộ truyền dữ liệu chuẩn SPI.
Watchdog timer khả trình với bộ dao động nội riêng biệt.
Bộ so sánh Analog.
Các đặc điểm khác:
Power-on Reset và phát hiện Brown-out khả trình.
Bộ tạo dao động nội.
Nguồn ngắt nội và ngoại.
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:
2.7V – 5.5V đối với ATmega16L.
4.5V – 5.5V đối với ATmega16.
Tần số hoạt động:
0 – 8MHz đối với ATmega16L.
0 – 16MHz đối với ATmega16.
2.2. Cấu trúc bên trong ATmega16:
Hình 2.1 – Sơ đồ cấu trúc bên trong Atnega16
Phần lõi AVR kết hợp tập lệnh phong phú với 32 thanh ghi đa dụng. Toàn bộ 32 thanh ghi này đều kết nối trực tiếp với ALU (Arithmetic Logic Unit), cho phép truy cập 2 thanh ghi độc lập với 1 lệnh thực thi trong 1 chu kỳ xung nhịp. Cấu trúc đạt được có tốc độ xử lý nhanh gấp 10 lần so với vi điều khiển CISC thông thường.
Với các tính năng đã nêu trên, khi ở chế độ nghỉ (Idle), CPU vẫn cho phép các chức năng khác hoạt động như: USART, giao tiếp 2 dây, chuyển đổi A/D, SRAM, bộ đếm/bộ định thời, cổng SPI và các chế độ ngắt. Chế độ Power-down lưu giữ nội dung các thanh ghi nhưng làm ngừng bộ tạo dao động, thoát khỏi các chức năng của chip cho đến khi có ngắt ngoài hoặc reset phần cứng. Trong chế độ Power-save, đồng hồ đồng bộ tiếp tục chạy cho phép chương trình có thể giữ được sự đồng bộ về thời gian nhưng các thiết bị còn lại ở trong trạng thái ngủ. Chế độ ADC Noise Reduction dừng CPU và tất cả các thiết bị còn lại ngoại trừ đồng hồ đồng bộ và ADC, giảm thiểu nhiễu khi ADC hoạt động. Ở chế độ Standby, bộ tạo dao động chạy trong khi các thiết bị còn lại ở trạng thái ngủ. Những đặc điểm này cho phép bộ vi điều khiển khởi động rất nhanh trong chế độ tiêu thụ công suất thấp.
AVR được sản xuất sử dụng công nghệ bộ nhớ cố định mật độ cao của Atmel. Bộ nhớ On-chip ISP Flash cho phép lập trình lại vào hệ thống thông qua giao diện SPI bởi bộ lập trình bộ nhớ cố định truyền thống hoặc bởi chương trình On-chip Boot chạy trên lõi AVR. Chương trình Boot có thể sử dụng bất cứ giao diện nào để download chương trình ứng dụng trong bộ nhớ Flash. Phần mềm trong vùng Boot Flash sẽ tiếp tục chạy trong khi vùng Application Flash được cập nhật, giúp tạo ra thao tác Read-While-Write thực sự. Nhờ việc kết hợp một bộ 8bit RISC CPU với In-System Self-Programmable Flash chỉ trong một chip, ATmega32 là một vi điều khiển mạnh có thể cung cấp những giải pháp có tính linh động cao, giá thành rẻ 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)
PB1
T1 (Ngõ vào của bộ đếm ngoài counter 1)
PB0
T0 (Ngõ vào của bộ đếm ngoài counter 0)
XCK (Chân I/O Clock của USART)
Port C (PC0…PC7): ngõ vào/ra Port C.
Các chức năng khác của Port C:
Chân
Chức năng
PC7
TOSC2 (Chân 2 bộ dao động của Timer)
PC6
TOSC1 (Chân 1 bộ dao động của Timer)
PC5
TDI (Chân data in Test JTAG)
PC4
TDO (Chân data out Test JTAG)
PC3
TMS (Chân chọn Mode Test JTAG)
PC2
TCK (Chân Clock Test JTAG)
PC1
SDA (Chân data I/O của giao thức Two-wire)
PC0
SCL (Chân clock của giao thức Two-wire)
Port D (PD0…PD7): ngõ vào/ra Port D.
Các chức năng khác của Port D:
Chân
Chức năng
PD7
OC2 (Ngõ ra so sánh của Timer/Counter2)
PD6
ICP1 (Chân bắt mẫu của Timer/Counter1)
PD5
OC1A (Ngõ ra so sánh A của Timer/Counter1)
PD4
OC1B (Ngõ ra so sánh B của Timer/Counter1)
PD3
INT1 (Ngõ vào ngắt ngoài 1)
PD2
INT0 (Ngõ vào ngắt ngoài 0)
PD1
TXD (Ngõ ra USART)
PD0
RXD (Ngõ vào USART)
Reset: Chân ngõ vào. Khi đặt vào chân này điện áp mức thấp trong thời gian xác định (xem trong datasheet) thì sẽ reset chương trình. Nếu thời gian ngắn hơn thì việc reset không thành công.
XTAL1: ngõ vào khuếch đại dao động đảo và cũng là ngõ vào mạch tạo xung nội.
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 khiển, cũng có thể do mạch dao động bên ngoài.
Hình 2.5 – Sơ đồ khối hệ thống xung nhịp
Việc lựa chọn nguồn xung nhịp được thực hiện thông qua quá trình thiết lập các bit CKSEL3…0 (lựa chọn nguồn xung cũng như cả tần số của nguồn xung).
Các nguồn xung
CKSEL3…0
Extenal Crystal / Ceramic Resonator
1111 – 1010
External Low-frequency Crystal
1001
External RC Oscillator
1000 – 0101
Calibrated Internal RC Oscillator
0100 – 0001
External Clock
0000
Sau đây là một số cách kết nối với nguồn xung nhịp bên ngoài:
Kết nối với thạch anh
Nguồn RC bên ngoài
Nguồn xung clock bên ngoài
Bảng 2.1 – Kết nối với nguồn xung bên ngoài
2.6. Giới thiệu về Timer/Counter của ATmega16:
2.6.1. Timer/Counter0:
Các chức năng chính:
Kênh đếm so sánh đơn.
Xóa giá trị timer khi đạt tới giá trị so sánh (Auto Reload).
Chế độ PWM.
Đếm sự kiện bên ngoài.
Bộ chia tần số 10bit.
Ngắt khi tràn hoặc tại giá trị so sánh.
Hình 2.6 – Sơ đồ khối của Timer/Counter0
Các chế độ hoạt động của Timer/Counter0:
Chế độ bình thường.
Chế độ xóa giá trị Timer khi đạt tới giá trị so sánh.
Chế độ Fast PWM.
Chế độ PWM.
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 ngược lại.
2.6.2. Timer/Counter1:
Các chức năng chính:
Thiết kế 16bit thực sự (cho phép tạo ra xung PWM 16bit).
2 bộ so sánh ngõ ra độc lập.
1 bộ bắt mẫu từ ngõ vào.
1 bộ giảm nhiễu ngõ vào.
Chế độ xóa timer khi đạt tới giá trị so sánh.
Tạo tần số.
Tạo xung PWM có thể thay đổi giá trị.
Đếm sự kiện ngoài.
4 nguồn ngắt độc lập (TOV1, OCF1A, OCF1B và ICF1).
Hình 2.8 - Sơ đồ khối của timer/counter1
Các chế độ hoạt động:
Chế độ bình thường.
Chế độ xóa timer khi đạt tới giá trị so sánh.
Chế độ Fast PWM.
Chế độ PWM (Phase Correct PWM).
Chế độ Phase and Frequency Correct PWM.
Giới thiệu về chế độ đếm sự kiện ngoài:
Chân ngõ vào T1: tác động cạnh lên hoặc xuống (tùy lựa chọn).
Trong chế độ này, bộ đếm luôn đếm lên, khi đạt tới giá trị MAX (0xFFFF) thì tự động reset về BOTTOM (0x0000).
2.6.3. Giới thiệu timer/counter2:
Các chức năng chính:
Kênh đếm so sánh đơn.
Xóa timer khi đạt tới giá trị so sánh (Auto Reload).
Chế độ PWM.
Đếm sự kiện bên ngoài.
Bộ chia tần số 10bit.
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.
Có thể phát hiện Data bị tràn , khung truyền bị lỗi.
Có 3 cờ báo ngắt : TX complete, TX Data Register Empty và RX complete.
Có chế độ truyền thông đa xử lý.
Double speed (chỉ áp dụng cho chế độ truyền thông bất đồng bộ).
Hình 2.11 - Sơ đồ khối USART
Trong sơ đồ trên, có ba khối nằm trong phần khung vuông là ba phần chính của USART: bộ phát xung, bộ truyền và bộ nhận. Thanh ghi điều khiển được sử dụng chung cho các thành phần. Bộ phát xung tạo ra xung nhịp cho bộ phát tốc độ baud (khi truyền nhận bất đồng bộ), hoặc điều khiển để nhận xung clock bên ngoài khi truyền nhận đồng bộ. Bộ truyền bao gồm một bộ đệm ghi đơn (single write buffer), thanh ghi dịch nối tiếp (serial Shift Register), bộ phát parity và bit điều khiển sử dụng cho nhiều khung truyền khác nhau. Bộ nhận phức tạp hơn do có phần phục hồi xung và dữ liệu (clock and data recovery). Thành phần phục hồi này sử dụng trong khi nhận dữ liệu bất đồng bộ. Ngoài hai phần phục hồi, bộ nhận còn có phần kiểm tra parity, bit điều khiển, thanh ghi dịch và bộ đệm nhận hai mức thấp (UDR). Bộ nhận hỗ trợ các chuẩn khung truyền giống như bộ phát, và có thể phát hiện lỗi khung truyền, tràn dữ liệu hoặc lỗi parity.
Các thanh ghi của USART:
USART I/O Data Register –UDR
UDR là thanh ghi bộ đệm truyền(TXB) và nhận(RXB) (chúng có cùng 1 địa chỉ vật lý) có chức năng lưu trữ Data.
TXB: Thanh ghi bộ đệm truyền. Khi ta muốn send data đến PC thì trước hết data đó phải được nạp vào TXB.
Muốn ghi DATA vào TXB thì bit UDRE trong thanh ghi UCSRA phải được set (UDRE=[1]: cho phép ghi vào TXB). Data đó được ghi vào UDR cho đến khi UDRE=[0]. Khi Data đang được vào TXB, và Transmitter được phép thì Transmitter sẽ Load Data đó vào thanh ghi dịch khi thanh ghi dịch bị trống (rỗng). Sau đó Data được truyền nối tiếp trên chân TxD (PD0) của MCU.
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)
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).
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).
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).
UDRE = [1] sau khi reset để chỉ thị rằng bộ truyền đã sẵn sàng.
Bit 4-FE: Frame Error
FE =[1] nếu có lỗi khung truyền khi nhận.
Bit3-DOR: Data OverRun
DOR=[1] nếu dữ liệu bị tràn.
Bit 2-PE: Parity Error
PE=[1] nếu có lỗi kiểm tra chẵn, lẻ.
Bit 1-U2X: Double the USART Transmission Speed
Chú ý : U2X chỉ có tác dụng đối với chế độ truyền bất đồng bộ.
U2X=[0] khi sử dụng chế độ truyền đồng bộ.
U2X=[1] sẽ làm giảm ước số của bộ chia tốc độ baud từ 16 xuống còn 8 có tác dụng tăng tốc độ truyền đối với hoạt động bất đồng bộ.
Bit 0-MPCM: Multi-processor Communication Mode
Bit này cho phép chế độ truyền thông đa xử lý.
Khi MPCM=[1] thì tất cả các dữ liệu được nhận vào bởi bộ nhận USART mà không có địa chỉ sẽ được bỏ qua. Việc set bit MPCM không ảnh hưởng đến bộ truyền.
USART Control and Status Register B – UCSRB
Bit 7-RXCIE: RX complete Interrupt Enable
RXCIE=[1] cho phép nhận xảy ra ngắt (bằng cờ RXC). USART nhận hoàn tất sẽ tạo ra 1 ngắt khi chỉ khi RXCIE=[1], ngắt toàn cục được phép và RXC =[1] (trong UCSRA).
Bit 6-TXCIE: TX complete Interrupt Enable
TXCIE=[1] cho phép truyền xảy ra ngắt (bằng cờ TXC). USART truyền hoàn tất sẽ tạo ra 1 ngắt khi chỉ khi TXCIE=[1], ngắt toàn cục được phép và TXC =[1] (trong UCSRA).
Bit 5-UDRIE: USART Data Register Empty Interrupt Enable
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).
Bit 4-RXEN: Receive Enable
RXEN=[1]: cho phép nhận.
Bit 3-TXEN : Transmit Enable
TXEN=[1]: cho phép truyền.
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 .
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.
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
Bit 7 – URSEL: Register Select
Bit nay dùng để lựa chọn thanh ghi UCSRC hay UBRRH.
URSEL=[1]: UCSRC
URSEL=[0]: UBBRH
Bit 6 – UMSEL: USART Mode Select (lựa chọn truyền đồng bộ hay bất đồng bộ)
Bit 5:4 – UPM 1:0: Parity Mode (lựa chọn bit chẵn – lẻ)
Bit 3 – USBS: stop bit select
Bit 2:1-UCSZ 1:0: character size (Format khung truyền)
Bit 0 – UCPOL: Clock Polarity
Bit này chỉ dùng cho chế độ truyền đồng bộ.
UCPOL = [0]: chọn chế độ truyền bất đồng bộ.
UCPOL được thiết lập liên quan đến giữa dữ liệu đầu ra thay đổi và mẫu dữ liệu vào và xung đồng bộ (XCK).
USART Baud Rate Registers – UBRRL and UBRRH
Bit 15 - URSEL: Register Select
Bit nay dùng để lựa chọn thanh ghi UCSRC hay UBRRH.
URSEL=[1]: UCSRC
URSEL=[0]: UBBRH
Bit 14:12: Reserved Bits
Bit 11:0: UBRR 11:0: USART Baud Rate Register
Dùng để chọn tốc độ BAUD
Ví dụ:
Giới thiệu tổng quan về cảm biến nhiệt độ DS18B20
Sơ đồ chân của IC DS18B20
Một số đặc tính cơ bản của cảm biến nhiệt IC DS18B20:
Sử dụng giao diện một dây nên chỉ cần một dây ra để truyền thông
Dải đo nhiệt độ từ -55oC đến 1250C, từng bậc 0.50C , có thể đạt độ chính xác đến 0.06250C bằng cách hiệu chỉnh qua phần mềm.
Rất thích hợp cho các ứng dụng đo lường đa điểm vì nhiều đầu đo có thể đi chung trên cùng một bus.
Đóng gói theo dạng 3 chân vỏ TO-92
Điện áp nguồn nuôi có thể thay đổi trong khoảng rộng, từ 0.3V đến 5.5V một chiều và có thể được cấp thong qua đường dẫn dữ liệu.
Độ phân giải từ 9 -12 bit do người dùng lựa chọn
Độ chính xác 0.50C trong khoảng nhiệt từ -100C đến 850C
Dòng tiêu thụ tại chế độ nghỉ nhỏ.
Thời gian lấy mẫu và biến đổi sang số nhanh, nhỏ hơn 200ms.
Mỗi cảm biến có một mã định danh duy nhất 64 bit chứa trong bộ nhớ Rom trên chip, giá trị nhị phân được khắc bằng tia laser.
Cảm biến nhiệt độ DS18B20 còn gọi là cảm biến một dây vì đường dẫn tín hiệu lối ra và đường dẫn điện áp nguồn nuôi có thể dung chung trên một dây dẫn và không chỉ chung cho một cảm biến mà nhiều cảm biến có thể sử dụng trên một đường dẫn. Điều này rất có lợi vì giảm chi phí dây cũng như giảm sự phức tạp cho hệ thống nhiều đầu đo trong công nghiệp.
Mỗi vi mạch đo nhiệt độ DS28B20 có một mã số định danh duy nhất, được khắc bằng laser trong quá trình chế tạo nên nhiều vi mạch DS18B20 có thể kết nối vào cùng một bus 1- wire mà không có sự nhầm lẫn khi tiến hành đo. Đặc điểm này làm cho việc lắp đặt nhiều cảm biến nhiệt độ tại nhiều vị trí khác nhau trở nên dễ dàng hơn với chi phí thấp hơn. Theo tiêu chuẩn 1-wire thì độ dài tối đa của một bus là 300m và số lượng cảm biến nối vào bus cũng không hạn chế.
Cách kết nối IC DS18B20 với vi điều khiển:
Kết nối “1 dây”
Kết nối dùng nguồn ngoài
Tổng quan về motor – encoder.
Encoder là một trong những thiết bị biến đổi vòng quay thành xung. Nó là một thiết bị dùng để đo tốc độ của động cơ hay một thiết bị nào khác
Bộ encoder này được cấu tạo đơn giản chỉ gồm hệ thống Opto và đĩa tròn quay được xẻ rãnh. Nguyên lý hoạt động của nó cũng khá là đơn giản ánh sáng chiếu qua đĩa.qua khe đĩa ta thu được 1 xung.
Optical encoder
Một số đặc tính của motor – encoder:
Xung vuông đầu ra.
Tín hiệu đầu ra: kênh A, kênh B, kênh Z
Dòng điện tổng : nhỏ hơn 120mA
Điện áp nguồn nuôi 5V DC, 5 -12V DC, 12-24V DC
Tần số đáp ứng 0~100 kHz
Encoder thường có 3 kênh (3 ngõ ra) bao gồm kênh A, kênh B và kênh I (Index). Trong hình 2 bạn thấy hãy chú ý một lỗ nhỏ bên phía trong của đĩa quay và một cặp phat-thu dành riêng cho lỗ nhỏ này. Đó là kênh I của encoder. Cữ mỗi lần motor quay được một vòng, lỗ nhỏ xuất hiện tại vị trí của cặp phát-thu, hồng ngoại từ nguồn phát sẽ xuyên qua lỗ nhỏ đến cảm biến quang, một tín hiệu xuất hiện trên cảm biến. Như thế kênh I xuất hiện một “xung” mỗi vòng quay của motor. Bên ngoài đĩa quay được chia thành các rãnh nhỏ và một cặp thu-phát khác dành cho các rãnh này. Đây là kênh A của encoder, hoạt động của kênh A cũng tương tự kênh I, điểm khác nhau là trong 1 vòng quay của motor, có N “xung” xuất hiện trên kênh A. N là số rãnh trên đĩa và được gọi là độ phân giải (resolution) của encoder. Mỗi loại encoder có độ phân giải khác nhau, có khi trên mỗi đĩa chĩ có vài rãnh nhưng cũng có trường hợp đến hàng nghìn rãnh được chia. Để điều khiển động cơ, bạn phải biết độ phân giải của encoder đang dùng. Độ phân giải ảnh hưởng đến độ chính xác điều khiển và cả phương pháp điều khiển. Không được vẽ trong hình 2, tuy nhiên trên các encoder còn có một cặp thu phát khác được đặt trên cùng đường tròn với kênh A nhưng lệch một chút (lệch M+0,5 rãnh), đây là kênh B của encoder. Tín hiệu xung từ kênh B có cùng tần số với kênh A nhưng lệch pha 900. Bằng cách phối hợp kênh A và B người đọc sẽ biết chiều quay của động cơ.
Giới thiệu về LCD
§óng nh tªn gäi cña nã, LCD (Liquid Crystals Display ) - Mµn h×nh tinh thÓ láng - , c¬ së vËt lý ®Ó LCD cã thÓ hiÓn thÞ ®îc th«ng tin , h×nh ¶nh chÝnh lµ do ®Æc tÝnh cña vËt liÖu chÕ t¹o nªn LCD, tøc lµ Liquid Crystals (th¹ch anh láng).
_ §Æc tÝnh cña Liquid Crystals :Thø nhÊt:
Liquid Crystals lµ vËt liÖu trong suèt võa cã tÝnh chÊt cña chÊ r¾n,l¹i võa cã tÝnh chÊt cña chÊt láng (chÝnh ®iÖu nµy ®· lam nªn sù kh¸c biÖt): + ¸nh s¸ng truyÒn qua Liquid Crystals theo gãc nghiªng cña c¸c ph©n tö , vµ ¸nh s¸ng bÞ ph¶n x¹ trë l¹i. §©y chÝnh lµ tÝnh chÊt cña chÊt r¾n. + Khi Liquid Crystals ®îc tÝch ®iÖn, nã sÏ bÞ thay ®æi gãc nghiªng cña c¸c phÇn tö, vµ kÕt qu¶ lµ ¸nh s¸ng cã thÓ truyÒn xuyªn qua. §©y chÝnh lµ tÝnh chÊt cña chÊt láng.Thø hai :
LCD gåm 2 bÒ mÆt d¹ng r·nh , gi÷a 2 bÒ mÆt nµy lµ 1 líp Th¹ch Anh láng (Liquid Crystal).
Tríc hÕt nãi vÒ ®Æc tÝnh 2 bÒ mÆt r·nh : trªn mâi bÒ mÆt cã c¸c r·nh . C¸c r·nh trªn 1 mÆt song song víi nhau vµ vu«ng gãc víi c¸c r·nh trªn mÆt cßn l¹i (theo híng b¾c-nam/ t©y-®«ng).
B©y giê nãi vÒ ®Æc tÝnh cña líp Liquid Cristal (ë gi÷a) : ¸nh s¸ng truyÒn qua líp nµy theo gãc cña c¸c phÇn tö, vµ v× thÕ ¸nh s¸ng bÞ xo¾n 90 ®é khi xuyªn qua líp Liquid Cristal nµy. Nhng khi ph©n cùc cho líp Liquid Cristal, c¸c ph©n tö ®îc s¾p xÕp l¹i theo ph¬ng ngang, vµ v× thÕ mµ ¸nh s¸ng cã thÓ truyÒn qua líp Liquid Cristal mµ kh«ng bÞ xo¾n. (H×nh 2)
Thø ba :
VÒ tÝnh chÊt cña líp läc ¸nh s¸ng ®¬n cùc. Chóng ta ®Òu biÕt r»ng ¸nh s¸ng lµ sãng truyÒn theo nhiÒu ph¬ng kh¸c nhau. Líp läc ®¬n cùc thùc ra chØ lµ tËp hîp c¸c ®êng th¼ng trong suèt song song – ChÝnh lµ 2 bÒ mÆt r·nh cña LCD ®· nãi ë trªn-. Sau khi ®i qua líp läc ®¬n cùc, ¸nh s¸ng chØ cßn thµnh phÇn sãng cã ph¬ng trïng víi ph¬ng c¸c ®êng th¼ng trªn líp läc cùc. LCD cã 2 líp läc ®¬n cùc cã ph¬ng läc vu«ng gãc nhau. V× vËy, sau khi ra khái c¶ 2 líp läc ®¬n cùc ¸nh s¸ng bÞ chÆn l¹i hoµn toµn. ¸nh s¸ng chØ cã thÓ truyÒn qua c¶ 2 líp läc ®¬n cùc nÕu sau khi qua líp läc thø nhÊt ¸nh s¸ng ®îc xo¾n 1 gãc 90 ®é råi míi ®i qua líp läc thø 2. ThËt may, viÖc xo¾n ¸nh s¸ng hoµn toµn cã thÓ thùc hiÖn ®îc theo tÝnh chÊt líp Liquid Cristal ®· nãi ë trªn.
àCã thÓ tæng kÕt ®êng ®i cña ¸nh s¸ng nh sau:
§Ó cã 1 ®iÓm tèi trªn LCD: ¸nh s¸ng ph¸t ra tõ bªn trong LCD sÏ ®i qua bÒ mÆt r·nh thø nhÊt (líp läc ®¬n cùc),à sau ®ã ¸nh s¸ng ®i qua líp Liquid Cristal (líp nµy ®îc ph©n cùc nªn ¸nh s¸ng qua nã mµ kh«ng bÞ xo¾n), à sau ®ã ¸nh s¸ng qua bÒ mÆt r·nh thø 2líp ph©n cùc thø 2 (líp läc ®¬n cùc), ¸nh s¸ng kh«ng lã ra ®îc khái líp nµy(bÞ chÆn l¹i hoµn toµn) à ta thÊy 1 ®iÓm tèi trªn mµn h×nh LCD. (H×nh 3) §Ó cã 1 ®iÓm s¸ng trªn LCD: qu¸ tr×nh ®i t¬ng tù nhng kh¸c ë chç ¸nh s¸ng qua líp Liquid Cristal kh«ng ®îc ph©n cùc nªn ¸nh s¸ng bÞ xo¾n 90 ®é, nhê thÕ mµ ®i qua ®îc bÒ mÆt r·nh thø 2 (líp läc ®¬n cùc) à Ta thÊy 1 ®iÓm s¸ng trªn LCD. (H×nh 3)
H×nh 2
H×nh 3
II. XÐt LCD cô thÓ Hitachi HD44780
LCD hiÓn thÞ ®îc 2 hµng mçi hµng hiÓn thÞ ®îc 16 ký tù (LCD cã 14 ch©n) nh ®îc minh ho¹ trªn h×nh.
Th«ng sè cña LCD :
+KÝch thíc hiÓn thÞ : 16 ký tù x 2 dßng.
+Mµu hiÓn thÞ: ®en/tr¾ng
+ChÕ ®é giao tiÕp : 8 bÝt vµ 4 bÝt
+Cì ch÷ hiÓn thÞ : 5x7 hoÆc 5x10
1. CÊu tróc cña LCD
1a. Giíi thiÖu s¬ ®å ch©n LCD .
_ LCD cã tæng sè 14 ch©n chia lµm 3 nhãm:
Nhãm 1: (3 ch©n) CÊp nguån VDD, VSS : cÊp 5V, 0V VEE: thay ®æi ®iÖn ¸p ®Ó thay ®æi ®é t¬ng ph¶nNhãm 2: (8 ch©n) Vµo ra th«ng tin víi V§K : Tõ ch©n D0-D7
Nhãm 3 : (3 ch©n) §iÒu khiÓn viÖc vµo ra th«ng tin : E,RS,R/W
E :(bËt /t¾t ) (cho phÐp/ kh«ng cho phÐp trao ®æi th«ng tin víi V§K )
RS :(lo¹i th«ng tin trao ®æi)Th«ng tin trao ®æi lµ lÖnh ®iÒu khiÓn hay µ d÷ liÖu ®Ó hiÓn thÞ
R/W : (híng truyÒn cña th«ng tin) ®äc tr¹ng th¸i tõ LCD hay th«ng tin do V§K göi vµo LCD ®Ó hiÓn thÞ
Cô thÓ tªn gäi vµ m« t¶ chøc n¨ng c¸c ch©n ®îc tæng kÕt trong b¶ng sau:
Interface Pin Connections
Ch©n sè
Ký hiÖu
Tªn
M« t¶ chøc n¨ng
1
VSS
CÊp nguån
0V (GND)
2
VDD
CÊp nguån
Nèi víi d¬ng nguån (+4.5V~+5.5V)
3
VEE
Contrast
®iÒu chØnh ®iÖn ¸p ch©n nµy sÏ t¨ng gi¶m ®é t¬ng ph¶n cña LCD. cho nªn nã thêng ®îc nèi víi biÕn trë.
4
RS
Chän thanh ghi
NÕu RS=0 : LCD nhËn lÖnh tõ V§K
NÕu RS=1: LCD nhËn d÷ liÖu tõ V§K ®Ó hiÓn thÞ
5
RW
Read/Write
Chän chøc n¨ng ghi/ ®äc
RS=1 : chän chøc n¨ng ®äc d÷ liÖu tõ LCD vµo V§K
RS=0 : chän chøc n¨ng ghi d÷ liÖu tõ V§Kvµo LCD ®Ó hiÓnt thÞ
6
E
Read Write enable
Cho phÐp/ ko cho phÐp LCD trao ®æi th«ng tin víi V§K.ChØ khi E chuyÓn tõ 1à0 th× tÝn hiÖu ë c¸c ch©n D0-D7 míi ®îc ®a vµo LCD.
7
D0
Data bus 0-7
8 ch©n nµy ®îc nèi víi V§K ®Ó vµo/ra th«ng tin
8
D1
9
D2
10
D3
11
D4
12
D5
13
D6
14
D7
_ Tõ nh÷ng ®Æc ®iÓm vµ chøc n¨ng ®· ®îc ®Ò cËp ë trªn ta cã thÓ ®i tíi viÖc h×nh thµnh viÖc ghÐp nèi cña LCD víi vi ®iÒu khiÓn nh sau:
Nh trªn h×nh minh ho¹ ta cã thÓ thÊy c¸c ch©n D0-D3 lµ ®êng tÝn hiÖu 2 chiÒu (®Ó trao ®æi th«ng tin Vi ®iÒu khiÓn vµ LCD). 3 ch©n ®iÒu khiÓn RS, R/W, E lµ ch©n ®a tÝn hiÖu ®iÒu khiÓn tõ Vi ®iÒu khiÓn tíi LCD nªn nã chØ lµ ®êng tÝn hiÖu 1 chiÒu th«i.
V× ch©n Contrast (VEE) ®iÒu chØnh ®é t¬ng ph¶n cña LCD nªn ta cÊp nguån cho nã th«ng qua biÕn trë (nh h×nh vÏ)
1b. CÊu tróc bé nhí trong LCD.
Mµn hiÓn thÞ cña LCD nãi chung cã thÓ lªn tíi h¬n 40 ký tù trªn mét dßng vµ mét mµn cã thÓ cã tíi 4 dßng.Trong ®ã cã mét bé RAM ®Ó chøa m· 80 ký tù gäi lµ bé nhí DDRAM(display data ram),mµn hiÓn thÞ cã thÓ dÞch c¶ mµn ®Ó quan s¸t ®îc c¸c ký tù kh¸c.
Bé ký tù hiÓn thÞ : Bé hiÓn thÞ cã thÓ hiÓn thÞ ®îc c¸c ký tù ®· ®îc lËp tr×nh tríc hoÆc c¸c ký tù do ngêi dïng ®Þnh nghÜa.Trong bé ®iÒu khiÓn hiÓn thÞ cã mét bé nhí ROM dïng ®Ó ph¸t ký tù, trong Rom nµy chøa 192 ký tù,khi cÇn chän nh÷ng ký tù nµy th× nã ®îc chän th«ng qua tõng m· cña nã, cã tíi 96 m· ký tù ASCII, 64 m· ký tù tiÕng NhËt, 32 ký tù ®Æc biÖt kh¸c. Trong bé ®iÒu khiÓn LCD còng cã mét bé RAM gäi lµ CGRAM(character generator ram) trong bé nhí nµy lu 8 ký tù do ngêi dïng ®Þnh nghÜa, c¸c ký tù ®Çu tiªn ph¶i viÕt vµo CGRAM tríc råi sau ®ã míi hiÓn thÞ ra mµn hiÓn thÞ ®îc.
Ký tự hiển thị lên LCD
PHẦN II. PHẦN THỰC HIỆN VÀ THIẾT KẾ
Sau khi đã nghiên cứu, chúng em đã tìm ra được hướng đi cho đề tài của mình:
Nhiệm vụ thiết kế:
“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.”
Đưa ra những phương án giải quyết:
Chọn vi điều khiển avr atmega 16
Cảm biến nhiệt độ DS18B20 để đo nhiệt độ
Sử dụng motor – encoder với độ phân giải 200xung/vòng
Sử dụng phím bấm để lựa chọn những chức năng cụ thể
Truyền và nhận tin với máy tính qua cổng RS232
SƠ ĐỒ KHỐI CỦA HỆ THỐNG
CẢM BIẾN
CẢM BIẾN
CẢM BIẾN
AVR
ADC
KHỐI HIỂN THỊ LCD
MAX232
MÁY TÍNH
MẠCH CHUẨN HOÁ (khuyếch đại tín hiệu)
BÀN PHÍM
Các khối chi tiết
Khối đo nhiệt độ
Khối đo tốc độ động cơ
Khối hiển thị
Khối truyền thông nối tiếp
Khối bàn phím
Khối đo nhiệt độ
Theo dạng vỏ TO-92. Sơ đồ ghép nối được thể hiện như hình vẽ
Do ds18b20 có thể lấy trực tiếp nguồn cung cấp từ nguồn nên phải cần có thêm một nguồn ngoài để cung cấp cho chân dữ liệu.
Chân số 1: nối GND
Chân số 2: chân vào /ra của dữ liệu, được nối với điện trở treo có giá trị R=4.7KΩ
Chân số 3 : nối với nguồn VCC=+5V.
Khối đo tốc độ động cơ
Sơ đồ ghép nối được thể hiện như hình vẽ:
Ta nối đầu ra của tín hiệu vào chân INT0 của vi điều khiển atmega16 để báo ngắt mỗi khi có xung.
Nguyên lý đo tốc độ động cơ trong thiết kế:
Khi có xung ở đầu ra, mỗi khi xung chuyển trạng thái từ cao xuống thấp, ngắt ngoài INT0 sẽ bị tác động,mỗi khi bị tác động thì số xung lại được tăng lên, đếm trong 1 khoảng thời gian cho trước ta sẽ có tổng số xung trong thời gian đó. Từ đó sẽ tính được tốc độ của động cơ.
Do tín hiệu đầu ra của encoder thường hay bị méo chứ không phải xung vuông, vì vậy ta cần đưa tín hiệu ra của kênh encoder vào một IC 74HC14 để tạo đầu ra là xung vuông.
Sơ đồ chân của IC 74HC14
Sơ đồ ghép nối, chức năng của IC 74HC14:
Khối hiển thị
Khối hiển thị LCD
Ta chọn chế độ truyền 4 bit lên cho LCD.
Khối truyền thông nối tiếp
Max 232 có hai bộ điều khiển đường truyền là nhận và truyền tín hiệu. Các bộ điều khiển đường truyền dùng cho TxD được gọi là T1 và T2. Trong trường hợp này ta sử dụng T1 và R1 được dùng với nhau cho 2 chân TxD và RxD của atmega 16.
Max 232 cần có 4 tụ điện có giá trị từ 1 đến 22F. Giá trị thường dùng là 10F.
Khối bàn phím
Có chức năng lựa chọn khi người sử dụng ấn phím để lựa chọn các chế độ đo, kênh đo sao cho phù hợp với yêu cầu.
Trong thiết kế ta sử dụng phím để tạo ra ngắt, vì vậy ta sẽ ghép nối các chân của 4 phím qua một cổng logic AND_4 ( IC 74HC21 ) để tạo ra mức logic thấp mỗi khi ta tiến hành nhấn một phím.
Đầu ra của IC 74HC21 được nối với chân INT1 của vi điều khiển atmega16 để tạo ra ngắt.
LƯU ĐỒ THUẬT TOÁN CHO CHƯƠNG TRÌNH
Chương trình chính:
END
THỰC HIỆN CÁC CÔNG VIỆC PHỤC VỤ SAU NGẮT
CÓ NGẮT
HIỆN DÒNG CHỮ: “ LOADING….”
“ TRƯỜNG ĐHBK HÀ NỘI
ĐỒ ÁN ĐO LƯỜNG”
START
KHAI BÁO CỔNG VÀO RA CHO CÁC PORT
KHỞI TẠO BAN ĐẦU CHO CÁC NGẮT, BIẾN
KHỞI TẠO BAN ĐẦU CHO CỔNG TRUYỀNTHÔNG NỐI TIẾP.
KHỞI TẠO BAN ĐẦU CHO LCD
CHƯƠNG TRÌNH PHỤC VỤ NGẮT NGOÀI:
RETI
X=3
PHÍM 4
Y++
PHÍM 3
X=1
X=2
PHÍM 2
PHÍM 1
NGẮT NGOÀI
THỰC HIỆN CHƯƠNG TRÌNH QUÉT PHÍM
Y
N
Y
N
Y
Y
N
LƯU ĐỒ THỰC HIỆN CÁC CHƯƠNG TRÌNH SAU NGẮT:
END
THỰC HIỆN CHƯƠNG TRÌNH ĐO TỐC ĐỘ ĐỘNG CƠ
X=3
TRUYỀN TIN LÊN MÁY TÍNH
NHẬN TIN TỪ MÁY TÍNH
Y=2
Y=1
START
X=1
X=2
THỰC HIỆN CHƯƠNG TRÌNH ĐO NHIỆT ĐỘ KÊNH 1
THỰC HIỆN CHƯƠNG TRÌNH ĐO NHIỆT ĐỘ KÊNH 2
CHƯƠNG TRÌNH NHẬN TIN TỪ MÁY TÍNH:
UDR=0X31
ĐO TỐC ĐỘ ĐỘNG CƠ
ĐO NHIỆT ĐỘ KÊNH 1
ĐO NHIỆT ĐỘ KÊNH 2
Y=2
THIẾT LẬP UART
Y
N
UDR=0X32
Y
N
UDR=0X33
Y
N
RETI
LƯU ĐỒ THUẬT TOÁN ĐO TỐC ĐỘNG CƠ
END
T=10MS
SỐ XUNG ++
T++
CHƯƠNG TRÌNH TÍNH TỐC ĐỘ ĐỘNG CƠ
HIỂN THỊ LÊN LCD
START
KHỞI TẠO BỘ TIMER1
KHỞI TẠO BỘ ĐẾM COUNTER 0
SỐ XUNG =0
T=0
CÓ NGĂT COUNTER0
N
Y
Chương trình :
Sử dụng trình dịch MikroC pro for AVR bản 1.45
Code:
/*==============================================================================
Project: Do nhiet do va toc do dong co
MCU : ATmega16
Frequency: 8Mhz
Author: dl1_team
Email :xxxxxxx@yahoo.com
Ofiice: Department of Instmentation and Industrial Informatic
==============================================================================*/
// Khai bao cac bien
unsigned int soxung=0,t=0;
unsigned int toc_do,temp=0;
unsigned int a_huy=0;
const unsigned short TEMP_RESOLUTION = 12;
unsigned temp1;
char text1[] = "Loading........";
char *text = "0000";
char *text2 = "000.0000";
unsigned char _data;
int x=0;
int y=0;
int i=0;
//==============Ket noi LCD va Atmega 16 =======================================
sbit LCD_RS at PORTC2_bit;
sbit LCD_EN at PORTC3_bit;
sbit LCD_D4 at PORTC4_bit;
sbit LCD_D5 at PORTC5_bit;
sbit LCD_D6 at PORTC6_bit;
sbit LCD_D7 at PORTC7_bit;
sbit LCD_RS_Direction at DDC2_bit;
sbit LCD_EN_Direction at DDC3_bit;
sbit LCD_D4_Direction at DDC4_bit;
sbit LCD_D5_Direction at DDC5_bit;
sbit LCD_D6_Direction at DDC6_bit;
sbit LCD_D7_Direction at DDC7_bit;
//================Trinh phuc vu ngat Timer 1====================================
void Timer1_OV_ISR() org 0x10
{
TCNT1H=0xD8 ; //Nap lai gia tri vao TCNT1 sau moi lan ngat
TCNT1L=0xF0 ;
t++ ;
}
//=================Trinh phuc vu ngat ngoai 0===================================
void ISR_EXT1() org 0x02
{
soxung++;
}
//==============================================================================
//============================= chuong trinh doc phim==========================
// trinh phuc vu ngat
void ISR_EXT0() org 0x04
{
x=0 ;
if (PIND4_bit==0)
{
x=1;
}
else if (PIND5_bit==0)
{
x=2;
}
else if (PIND6_bit==0)
{
x=3;
}
else if (PIND7_bit==0)
{
y=++y;
if (y==3) { y=0;}
}
}
//===================Chuong trinh con Hien thi toc do dong co==============
void Display_Speed()
{
temp=toc_do;
//PORTB=temp;
if (temp/1000)
text[0]=temp/1000+48;
else
text[0]='0';
text[1]=(temp/100)%100+48;
text[2]=(temp/10)%10+48;
text[3]=temp%10+48;
Lcd_Out(1,8,text);
}
//======Chuong trinh con hien thi nhiet do ==============================
void Display_Temperature(unsigned int temp2write)
{
const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
char temp_whole;
unsigned int temp_fraction;
if (temp2write & 0x8000) //Kiem tra neu nhiet do la am
{
text2[0] = '-';
temp2write = ~temp2write + 1; // Doi sang ma bu 2
}
temp_whole = temp2write >> RES_SHIFT ; // Tach rieng ra phan nguyen de xu ly
if (temp_whole/100) // neu phan nguyen >=100
text2[0] = temp_whole/100 + 48; // gan ket qua phep chia cho tex[0]
else
text2[0] = '0'; // neu phan nguyen nho hon 100 thi gan
// text[0]=0
text2[1] = (temp_whole/10)%10 + 48; // so hang chuc
text2[2] = temp_whole%10 + 48; // so hang don vi
temp_fraction = temp2write << (4-RES_SHIFT);// Xu li so lieu phan sau dau phay
temp_fraction &= 0x000F;
temp_fraction *= 625;
// Doi phan so sau dau phay sang ma ASCII
text2[4] = temp_fraction/1000 + 48; // so hang nghin
text2[5] = (temp_fraction/100)%10 + 48; // so hang tram
text2[6] = (temp_fraction/10)%10 + 48; // so hang chuc
text2[7] = temp_fraction%10 + 48; // so hang don vi
// Hien thi gia tri chuyen doi ra
Lcd_Out(2, 3, text2) ;
}
//==========Chuong trinh con doc nhiet do tu cac kenh =====================
void Read_Temperature(unsigned kenh)
{
Ow_Reset(&PORTA, kenh); // Onewire reset
Ow_Write(&PORTA, kenh, 0xCC); // SKIP_ROM
Ow_Write(&PORTA, kenh, 0x44); // CONVERT_T
Delay_us(120);
Ow_Reset(&PORTA, kenh);
Ow_Write(&PORTA, kenh, 0xCC); // SKIP_ROM
Ow_Write(&PORTA, kenh, 0xBE); // READ_SCRATCHPAD
Delay_ms(400);
temp1 = Ow_Read(&PORTA, kenh);
temp1 = (Ow_Read(&PORTA, kenh) << 8) + temp1;
// hien thi nhiet do
Display_Temperature(temp1);
Delay_ms(1000);
}
//==============Chuong trinh con khoi tao he thong======================
void Init_System()
{
Lcd_Init();
Lcd_Out(1,1,text1);
Delay_ms(2000);
//Khoi tao ngat tran Timer 1
TIMSK=(1<<TOIE1); //cho phep ngat tran Timer 1
TCCR1B=(1<<CS11); //Chon ti le 1:8
//Khoi tao ngat ngoai so 0 ,1
MCUCR=(1<<ISC00)|(1<<ISC11); //Che do ngat ngoai theo suon xuong
GICR=(1<<INT0)|(1<<INT1); //Cho phep ngat ngoai so 0
// Khoi tao cong truyen noi tiep
UART1_Init(9600); // Initialize UART module at 9600 bps
// Cho phep ngat toan cuc
SREG_I_bit = 1; //Cho phep ngat toan cuc
}
//============Chuong trinh chinh ==============================
void main()
{ DDRB=0X00;
PORTB=0XFF;
DDRD=0X02;
PORTD=0XFF;
Init_System(); //Khoi tao he thong
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"BO MON KTD&THCN") ;
Lcd_Out(2,1,"DO AN DO LUONG");
Delay_ms(2000) ;
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"xin moi ban") ;
Lcd_Out(2,3,"chon che do");
Delay_ms(500) ;
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"1 : T1 , 2 : T2") ;
Lcd_Out(2,3,"3 : do td");
Delay_ms(2000) ;
while(1) //Vong lap chuong trinh chinh
{
if (y==2)
{
while (y==2){
if (UART1_Data_Ready()==1)
{
switch (UART1_Read())
{
case 0X31:
Lcd_Cmd(_LCD_CLEAR); // Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
Lcd_Out(1, 1, " Temperature1: ");
Lcd_Chr(2,13,223);
Lcd_Chr(2,14,'C');
Read_Temperature(0);
Delay_ms(1000);
break;
case 0X32:
Lcd_Cmd(_LCD_CLEAR); // Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
Lcd_Out(1, 1, " Temperature2: ");
Lcd_Chr(2,13,223);
Lcd_Chr(2,14,'C');
Read_Temperature(1);
Delay_ms(1000);
break;
case 0X33:
Lcd_Cmd(_LCD_CLEAR); // Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
TCNT1H=0xD8 ; //Nap lai gia tri vao TCNT1 sau moi lan ngat
TCNT1L=0xF0 ;
Lcd_Out(1, 1, " Td: ");
if(t++>=10) //Lay mau toc do sau 1s
{
toc_do=(soxung*300/110);// Doi toc do ra vong/Phut
Display_Speed();
Delay_ms(100);
t=0;
soxung=0;
}
break;
}
}
}
}
else if (x==1)
{
Lcd_Cmd(_LCD_CLEAR); // Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
Lcd_Out(1, 1, " Temperature1: ");
// Print degree character, 'C' for Centigrades
Lcd_Chr(2,13,223); // different LCD displays have different char code for degree
// if you see greek alpha letter try typing 178 instead of 223
Lcd_Chr(2,14,'C');
Read_Temperature(0);
if (y==1)
{
UART1_Init(9600); // Initialize UART module at 9600 bps
Delay_ms(100); // Wait for UART module to stabilize
UART1_Write_Text(" Nhiet do hien tai la: ");
for(i=0;i<8;i++)
{
_data=text2[i];
UART1_Write(_data);
}
}
}
else if (x==2)
{
Lcd_Cmd(_LCD_CLEAR); // Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
Lcd_Out(1, 1, " Temperature2: ");
// Print degree character, 'C' for Centigrades
Lcd_Chr(2,13,223); // different LCD displays have different char code for degree
// if you see greek alpha letter try typing 178 instead of 223
Lcd_Chr(2,14,'C');
Read_Temperature(1);
if (y==1)
{
Delay_ms(100); // Wait for UART module to stabilize
UART1_Write_Text(" nhiet do hien tai la: ");
Delay_ms(100);
for(i=0;i<8;i++)
{
_data=text2[i];
UART1_Write(_data);
}
}
}
else if (x==3)
{
Lcd_Cmd(_LCD_CLEAR); // Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
TCNT1H=0xD8 ; //Nap lai gia tri vao TCNT1 sau moi lan ngat
TCNT1L=0xF0 ;
Lcd_Out(1, 1, " Td: ");
if(t++>=10) //Lay mau toc do sau 1s
{
toc_do=(soxung*300/110);// Doi toc do ra vong/Phut
Display_Speed();
Delay_ms(100);
t=0;
soxung=0;
}
if (y==1)
{
Delay_ms(100); // Wait for UART module to stabilize
UART1_Write_Text(" Toc do hien tai la: ");
for(i=0;i<4;i++)
{
_data=text[i];
UART1_Write(_data);
}
}
}
}
}
Các file đính kèm theo tài liệu này:
- 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 (55trang).doc