Thiết kế hệ thống đo nhiệt độ sử dụng LM335

MỞ ĐẦU [IMG]file:///C:/Users/ADMINI%7E1/AppData/Local/Temp/msohtml1/01/clip_image001.gif[/IMG]ỹ thuật vi điều khiển hiện nay rất phát triển rất mạnh mẽ, nó được ứng dụng vào rất rất nhiều lĩnh vực từ trong đời sống sinh hoạt hàng ngày(khóa số, tủ lạnh, ti vi, .) cho tới các lĩnh vực trong công nghiệp cũng như trong quân sự. Do có nhiều ưu điểm như nhỏ gọn, khả năng lập trình để điều khiển theo ý muốn, giá thành thấp, có khả năng xử lí được nhiều công việc lên vi điều khiển trở thành linh kiện không thể thiếu được trong các thiết bị phục vụ con người chúng ta. AVR là một trong rất nhiều dòng vi điều khiển 8bit hiện nay. Nó được ứng dụng rộng rãi trong lĩnh vực điều khiển ứng dụng, lĩnh vực điều khiển đo lường, lĩnh vực điều khiển tự động, lĩnh vực điều khiển quảng cáo .v.v Với những kiến thức đã có được về dòng vi điều khiển AVR em đã chọn đề tài tốt nghiêp: ”Thiết kế hệ thống đo nhiệt độ sử dụng LM335”. Mục tiêu của đề tài là kết hợp vi điều khiển AVR kết hợp với IC cảm biến nhiệt độ thành hệ thống đo nhiệt độ .IC LM335 sẽ cảm biến nhiệt độ bên ngoài môi trường ( chuyển nhiệt độ thành tín hiệu điện áp) đưa đến vi điều khiển AVR xử lý rồi hiển thị trên LCD 16x2. Nội dung của đồ án chia làm 3 chương : -, Chương 1: Tìm hiểu về một số loại cảm biến nhiệt thông dụng và LM335 -, Chương 2: Tìm hiểu về vi điều khiển AVR ,ngôn ngữ C , phần mềm WINavr và LCD 16x2. -, Chương 3: Thiết kế hệ thống đo nhiệt độ xử dụng LM335. Chương 1 Tìm hiểu về một số loại cảm biến thông dụng và LM335 Trước tiên ta cần biết cảm biến là gì: Cảm biến là thiết bị dùng để đo, đếm, cảm nhận, các đại lượng vật lý không điện thành các tín hiệu điện. Ví dụ: Nhiệt độ là 1 đại lượng không liên quan đến điện chúng ta phải chuyển nó về 1 đại lượng khác ( điện trở, điện áp ) để phù hợp với các cơ cấu điện tử. Nguyên lý hoạt động của cảm biến nhiệt độ : Nhiệt độ từ môi trường sẽ được cảm biến hấp thu, tại đây tùy theo cơ cấu của cảm biến sẽ biến đại lượng nhiệt này thành một đại lượng điện nào đó ( điện áp, dòng điện ). Như thế một yếu tố hết sức quan trọng đó là “ nhiệt độ môi trường cần đo” và “nhiệt độ cảm nhận của cảm biến”. Cụ thể điều này là: Các loại cảm biến mà ta trông thấy nó đều là cái vỏ bảo vệ, phần tử cảm biến nằm bên trong cái vỏ này ( bán dẫn, lưỡng kim .) do đó việc đo có chính xác hay không tùy thuộc vào việc truyền nhiệt từ môi trường vào đến phần tử cảm biến tổn thất bao nhiêu ( 1 trong những yếu tố quyết định giá cảm biến nhiệt ). . PHÂN LOẠI CẢM BIẾN NHIỆT. - Cặp nhiệt điện ( Thermocouple ). - Nhiệt điện trở ( RTD-resitance temperature detector ) - PT100. - Thermistor. - Bán dẫn ( Diode, IC , .). - Ngoài ra còn có loại đo nhiệt không tiếp xúc ( hỏa kế- Pyrometer ). Dùng hồng ngoại hay lazer.

docx42 trang | Chia sẻ: lvcdongnoi | Lượt xem: 8545 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Thiết kế hệ thống đo nhiệt độ sử dụng LM335, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
t độ thành tín hiệu điện áp) đưa đến vi điều khiển AVR xử lý rồi hiển thị trên LCD 16x2. Nội dung của đồ án chia làm 3 chương : -, Chương 1: Tìm hiểu về một số loại cảm biến nhiệt thông dụng và LM335 -, Chương 2: Tìm hiểu về vi điều khiển AVR ,ngôn ngữ C , phần mềm WINavr và LCD 16x2. -, Chương 3: Thiết kế hệ thống đo nhiệt độ xử dụng LM335. Chương 1 Tìm hiểu về một số loại cảm biến thông dụng và LM335 Trước tiên ta cần biết cảm biến là gì: Cảm biến là thiết bị dùng để đo, đếm, cảm nhận,…các đại lượng vật lý không điện thành các tín hiệu điện. Ví dụ: Nhiệt độ là 1 đại lượng không liên quan đến điện chúng ta phải chuyển nó về 1 đại lượng khác ( điện trở, điện áp ) để phù hợp với các cơ cấu điện tử. Nguyên lý hoạt động của cảm biến nhiệt độ : Nhiệt độ từ môi trường sẽ được cảm biến hấp thu, tại đây tùy theo cơ cấu của cảm biến sẽ biến đại lượng nhiệt này thành một đại lượng điện nào đó ( điện áp, dòng điện..). Như thế một yếu tố hết sức quan trọng đó là “ nhiệt độ môi trường cần đo” và “nhiệt độ cảm nhận của cảm biến”. Cụ thể điều này là: Các loại cảm biến mà ta trông thấy nó đều là cái vỏ bảo vệ, phần tử cảm biến nằm bên trong cái vỏ này ( bán dẫn, lưỡng kim….) do đó việc đo có chính xác hay không tùy thuộc vào việc truyền nhiệt từ môi trường vào đến phần tử cảm biến tổn thất bao nhiêu ( 1 trong những yếu tố quyết định giá cảm biến nhiệt ). .   PHÂN LOẠI CẢM BIẾN NHIỆT. -         Cặp nhiệt điện ( Thermocouple ). -         Nhiệt điện trở ( RTD-resitance temperature detector ) - PT100. -         Thermistor. -         Bán dẫn ( Diode, IC ,….). -         Ngoài ra còn có loại đo nhiệt không tiếp xúc ( hỏa kế- Pyrometer ). Dùng hồng ngoại hay lazer. 1. CẶP NHIỆT ĐIỆN ( Thermocouples ). - Cấu tạo: Gồm 2 chất liệu kim loại khác nhau, hàn dính một đầu. - Nguyên lý: Nhiệt độ thay đổi cho ra sức điện động thay đổi ( mV). - Ưu điểm: Bền, đo nhiệt độ cao. - Khuyết điểm: Nhiều yếu tố ảnh hưởng làm sai số. Độ nhạy không cao. - Thường dùng: Lò nhiệt, môi trường khắt nghiệt, đo nhiệt nhớt máy nén,… - Tầm đo: -100 D.C <1400 D.C -         Gồm 2 dây kim loại khác nhau được hàn dính 1 đầu gọi là đầu nóng ( hay đầu đo), đầu còn lại gọi là đầu lạnh ( hay là đầu chuẩn ). Khi có sự chênh lệch nhiệt độ giữa đầu nóng và đầu lạnh thì sẽ phát sinh 1 sức điện động V tại đầu lạnh. Một vấn đề đặt ra là phải ổn định và đo được nhiệt độ ở đầu lạnh, điều này tùy thuộc rất lớn vào chất liệu. Do vậy mới cho ra các chủng loại cặp nhiệt độ, mỗi loại cho ra 1 sức điện động khác nhau: E, J, K, R, S, T. Vì thế cần lưu ý điều này để chọn đầu dò và bộ điều khiển cho thích hợp. -         Dây của cặp nhiệt điện thì không dài để nối đến bộ điều khiển, yếu tố dẫn đến không chính xác là chổ này, để giải quyết điều này chúng ta phải bù trừ cho nó ( offset trên bộ điều khiển ). Lưu ý khi sử dụng: -         Từ những yếu tố trên khi sử dụng loại cảm biến này chúng ta lưu ý là không nên nối thêm dây ( vì tín hiệu cho ra là mV nối sẽ suy hao rất nhiều ). Cọng dây của cảm biến nên để thông thoáng ( đừng cho cọng dây này dính vào môi trường đo ). -         Lưu ý: Vì tín hiệu cho ra là điện áp ( có cực âm và dương ) do vậy cần chú ý kí hiệu để lắp đặt vào bộ khuếch đại cho đúng. Hình cặp nhiệt điện 2. NHIỆT ĐIỆN TRỞ ( RTD-resistane temperature detector ) - PT100 Cấu tạo của nhiệt điện trở RTD -         Cấu tạo của RTD gồm có dây kim loại làm từ: Đồng, Nikel, Platinum,…được quấn tùy theo hình dáng của đầu đo. Khi nhiệt độ thay đổi điện trở giữa hai đầu dây kim loại này sẽ thay đổi, và tùy chất liệu kim loại sẽ có độ tuyến tính trong một khoảng nhiệt độ nhất định.Phổ biến nhất của RTD là loại cảm biến Pt, được làm từ Platinum. Platinum có điện trở suất cao, chống oxy hóa, độ nhạy cao, dải nhiệt đo được dài. Thường có các loại: 100, 200, 500,1000 ohm tại 0 D.C. Điện trở càng cao thì độ nhạy nhiệt càng cao.RTD thường có loại 2 dây, 3 dây và 4 dây. Lưu ý khi sử dụng: -         Loại RTD 4 dây giảm điện trở dây dẫn đi 1/2, giúp hạn chế sai số. -         Cách sử dụng của RTD khá dễ chịu hơn so với Thermocouple. Chúng ta có thể nối thêm dây cho loại cảm biến này ( hàn kĩ, chất lượng dây tốt, có chống nhiễu ) . -         Vì là biến thiên điện trở nên không quan tâm đến chiều đấu dây. Ta sẽ tìm hiểu kỹ hơn nguyên lý đo nhiệt độ của Pt100 : Thiết bị đo nhiệt độ Pt100 hay còn gọi là can nhiệt Pt có cấu tạo là một điện trở nhiệt (điện trở thay đổi khi nhiệt độ thay đổi).Điện trở này là một dây kim loại có bọc các đoạn sứ bao quanh toàn bộ dây kim loại.Phần bao bọc này lại được đặt trong một ống bảo vệ(thermowell) thường có dạng hình tròn,chỉ đưa 2 đầu dây kim loại ra để kết nối với thiết bị chuyển đổi.Phần ống bảo vệ sẽ được đặt ở nơi cần đo nhiệt độ,thông thường can nhiệt Pt100 chỉ đo được nhiệt độ tối đa là 600độC. Hai đầu dây kim loại để chừa ra ở phần ống bảo vệ được kết nối tới một thiết bị gọi là bộ chuyển đổi tín hiệu nhiệt thành tín hiệu điện phục vụ cho việc truyền tới phòng điều khiển giám sát.Thiết bị chuyển đổi có cấu tạo chẳng qua là một cầu điện trở có một nhánh chính là Pt100(có điện trở là 100 ôm ở 0 độ C) 3. THERMISTOR - Cấu tạo: Làm từ hổn hợp các oxid kim loại: mangan, nickel, cobalt,… - Nguyên lý: Thay đổi điện trở khi nhiệt độ thay đổi. - Ưu điểm: Bền, rẽ tiền, dễ chế tạo. - Khuyết điểm: Dãy tuyến tính hẹp. - Thường dùng: Làm các chức năng bảo vệ, ép vào cuộn dây động cơ, mạch điện tử. - Tầm đo: 50 <150 D.C. Cấu tạo Thermistor. -         Thermistor được cấu tạo từ hổn hợp các bột ocid. Các bột này được hòa trộn theo tỉ lệ và khối lượng nhất định sau đó được nén chặt và nung ở nhiệt độ cao. Và mức độ dẫn điện của hổn hợp này sẽ thay đổi khi nhiệt độ thay đổi. -         Có hai loại thermistor: Hệ số nhiệt dương PTC- điện trở tăng theo nhiệt độ; Hệ số nhiệt âm NTC – điện trở giảm theo nhiệt độ. Thường dùng nhất là loại NTC. -         Thermistor chỉ tuyển tính trong khoảng nhiệt độ nhất định 50-150độ C do vậy người ta ít dùng để dùng làm cảm biến đo nhiệt. Chỉ sử dụng trong các mục đích bảo vệ, ngắt nhiệt, các bác nhà ta thường gọi là Tẹt-mít. Cái Block lạnh nào cũng có một vài bộ gắn chặt vào cuộn dây động cơ. Lưu ý khi sử dụng: -         Tùy vào nhiệt độ môi trường nào mà chọn Thermistor cho thích hợp, lưu ý hai loại PTC và NTC .Có thể test dễ dàng với đồng hồ VOM. -         Nên ép chặt vào bề mặt cần đo. -         Tránh làm hỏng vỏ bảo vệ. -         Vì biến thiên điện trở nên không quan tâm chiều đấu dây. Hình thermistor. 4. IC BÁN DẪN - Cấu tạo: Làm từ các loại chất bán dẫn. - Nguyên lý: Sự phân cực của các chất bán dẫn bị ảnh hưởng bởi nhiệt độ. - Ưu điểm: Rẻ tiền, dễ chế tạo, độ nhạy cao, chống nhiễu tốt, mạch xử lý đơn giản. - Khuyết điểm: Không chịu nhiệt độ cao, kém bền. - Thường dùng: Đo nhiệt độ không khí, dùng trong các thiết bị đo, bảo vệ các mạch điện tử. - Tầm đo: -50 <150 D.C. -         Cảm biến nhiệt Bán Dẫn là những loại cảm biến được chế tạo từ những chất bán dẫn. Có các loại như Diode, Transistor, IC. Nguyên lý của chúng là dựa trên mức độ phân cực của các lớp P-N tuyến tính với nhiệt độ môi trường. Ngày nay với sự phát triển của ngành công nghệ bán dẫn đã cho ra đời rất nhiều loại cảm biến nhiệt với sự tích hợp của nhiều ưu điểm: Độ chính xác cao, chống nhiễu tốt, hoạt động ổn định, mạch điện xử lý đơn giản, rẽ tiền,…. -         Ta dễ dàng bắt gặp các cảm biến loại này dưới dạng diode ( hình dáng tương tự Pt100), các loại IC như: LM35, LM335, LM45. Nguyên lý của chúng là nhiệt độ thay đổi sẽ cho ra điện áp thay đổi. Điện áp này được phân áp từ một điện áp chuẩn có trong mạch. IC cảm biến nhiệt LM35                      Cảm biến nhiệt dạng Diode Gần đây có cho ra đời IC cảm biến nhiệt cao cấp, chúng hổ trợ luôn cả chuẩn truyền thông I2C ( DS18B20 ) mở ra một xu hướng mới trong “ thế giới cảm biến”. IC cảm biến nhiệt DS18B20 Lưu ý khi sử dụng: -          Vì được chế tạo từ các thành phần bán dẫn nên cảm biến nhiệt Bán Dẫn kém bền, không chịu nhiệt độ cao. Nếu vượt ngưỡng bảo vệ có thể làm hỏng cảm biến. -         Cảm biến bán dẫn mỗi loại chỉ tuyến tính trong một giới hạn nào đó, ngoài dải này cảm biến sẽ mất tác dụng. Hết sức quan tâm đến tầm đo của loại cảm biến này để đạt được sự chính xác. -         Loại cảm biến này kém chịu đựng trong môi trường khắc nghiệt: Ẩm cao, hóa chất có tính ăn mòn, rung sốc va chạm mạnh. *, Trong phần này ta sẽ tìm hiểu kỹ hơn về IC LM335: .a, Temperature accuracy ( sự chính xác của nhiệt độ đo). Thông số Điều kiện LM335A LM335 Đơn vị Min Typ Max Min typ Max Điên áp ra TC=250C, IR=1.5mA 2.95 2.98 3.01 2.92 2.98 3.04 V Sai số nhiệt độ Tc=250C, IR=1mA 1 3 2 6 0C Sai số nhiệt độ Tc=250C, IR=1mA 2 5 4 9 0C Sai số với 250C TMin≤TC≤TMax, IR=1mA 0.5 1 1 2 0C Sai số ở mức nhiệt độ max Tc=TMax 2 2 0C Tính không tuyến tính IR=1mA 0.3 1.5 0.3 1.5 0C .b, Thông số điện Thông số Điều kiện LM335 Đơn vị Min Typ Max Điện áp ra với dòng thay đổi 400µA≤IR≤5mA Tại 1 nhiệt độ cố định. 3 14 mV Trở kháng IR=1mA 0.6 Ω Hệ số đầu ra +10 mV/0C Thời gian ổn định Tc=1250C 0.2 0C/khr .c. Các cách kết nối LM335 trong mạch H1 H2 H3 H4 -, Trong H1: đây là cách ghép nối cơ bản của LM335 trong mạch, LM335 sẽ được mắc nối tiếp với nguồn (5V) qua 1 điện trở R. Khi mắc kiểu này ta sẽ thu được điện áp đầu ra biến thiên 10mV/0K. -, Trong H2: ta có thể mắc nối tiếp 3 IC LM335 với nhau ,nối tiếp với điện trở 6K và nguồn 15V. Với cách này điện áp đầu ra biến thiên trung bình 30mV/0K. -,Trong H3 : ta có thể mắc nối tiếp LM335 với điện trở và nguồn, ta có thể điều chỉnh nấc thang đo của LM335 để lấy chuẩn điện áp biến thiên đầu ra là 10mV/0K thông qua việc điều chỉnh biến trở 10K ở chân ADJ. -, Trong H4 : ta mắc song song 3 IC LM335 với nhau, rồi mắc nối tiếp với nguồn 15V qua điện trở 6K. Với cách này ta thu được điện áp ở đầu ra biến thiên 10mV/0K. *, Hình dạng của LM335 thường thấy trong thực tế : Nó có 3 chân chính : 2 chân cấp nguồn và 1 chân out tín hiệu Analog Khi ta cấp điện áp 5V cho LM335 thì nhiệt độ đo được từ cảm biến sẽ chuyển thành điện áp tương ứng tại chân số 2 (Vout). Điện áp này được tỉ lệ với giải nhiệt độ mà nó đo được. Với độ giải của nhiệt độ đầu ra là 10mV/K. Hoạt động trong giải điện áp từ 0 cho đến 5V và giải nhiệt độ đo được từ 0 oC đến 100oC. Và cần chú ý đến những thông số chính sau : + Hoạt động chính xác ở dòng điện đầu vào từ 0.4mA đến 5mA. Dòng điện đầu vào ngoài khoảng này kết quả đo sẽ sai + Điện áp cấp vào ổn định là 5V + Trở kháng đầu ra thấp 1 ôm + Giải nhiệt độ môi trường là từ 0 đến 100 C Như vậy LM335 nó cho chúng ta tín hiệu tương tự (Analog) và chúng phải xử lý tín hiệu này thành nhiệt độ. Chương 2 Tìm hiểu về vi điều khiển AVR ,ngôn ngữ C,phần mềm WINavr và LCD 16x2 1, Tìm hiểu về vi điều khiển AVR. 1.1. Tổng quan về dòng vi điều khiển AVR - Vi điều khiển AVR do hãng Atmel (Hoa Kì) sản xuất được gớ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 Kbye 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 ATmega 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 (hình 1.1). Đặt biệt, năm 2008, Atmel lại tiếp tục cho ra đời dòng AVR mới là XmegaAVR, 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 AVR là dòng MCU 8 bit mạnh mẽ nhất hiện nay. Các đặc điểm chính: 1-Kiến trúc RISC với hầu hết các lệnh có chiều dài cố định, truy nhập bộ nhớ nạp – lưu trữ và 32 thanh nghi đa năng. 2- Có nhiều bộ phận ngoại vi ngay trên chip, bao gồm: Cổng và/ra số, bộ biến đổi ADC, bộ nhớ EEFROM, bộ định thời, bộ điều chế độ rộng xung (PWM),giao tiếp CAN, … 3- Hầu hết các lệnh đều thực hiện trong một chu kỳ xung nhịp. 4- Hoạt động với chu kỳ xung nhịp cao, có thể lên đến 20 MHz tuỳ thuộc từng loại chíp cụ thể. 5- Bộ nhớ chương trình va bộ nhớ dữ liệu được tích hợp ngay trên chip. 6- Khả năng lập trình được trong hệ thống, có thể lập trình được ngay khi đang được cấp nguồn trên bản mạch không cần phải nhấc chíp ra khỏi bản mạch. 7- Hỗ trợ cho việc lập trình bằng ngôn ngữ bậc cao – ngôn ngữ C. Hình 1.1. Cấu trúc dòng AVR 1.2. Vi điều khiển Atmega16 1.2.1. Đặc điểm 16Kbytes bộ nhớ chương trình dạng flash có thể Read-While-Write 512 bytes EEPROM. 1 Kbyte RAM tĩnh (SRAM). 32 đường kết nối I/O mục đích chung. 32 thanh ghi làm việc mục đích chung được nối trực tiếp với đơn vị xử lý số học và logic (ALU). Một giao diện JATG cho quét ngoại vi. Lập trình và hỗ trợ gỡ rối trên chip. 3 Timer/Counter linh hoạt với các chế độ so sánh. Các ngắt ngoài và ngắt trong (21 nguyên nhân ngắt). Chuẩn truyền dữ liệu nối tiếp USART có thể lập trình. Một ADC 10 bit, 8 kênh với các kênh đầu vào ADC có thể lựa chọn bằng cách lập trình. Một Watchdog Timer có thể lập trình với bộ tạo dao động bên trong. Một cổng nối tiếp SPI ( serial peripheral interface). 6 chế độ tiết kiệm năng lượng có thể lựa chọn bằng phần mềm. Lựa chọn tần số hoạt động bằng phần mềm. Đóng gói 40 chân kiểu PDIP. Tần số tối đa 16MHz. Điện thế 4,5 – 5,5V. Vi điều khiển ATmega16 được hỗ trợ lập trình với ngôn ngữ lập trình bậc cao như ngôn ngữ lập trình C. Điều này giúp cho người sử dụng rất tiện lợi trong việc lập trình cho vi điều khiển.1.2.2. Sơ đồ khối và cấu trúc của ATMEGA16. 1.2.2. Sơ đồ khối và cấu trúc của vi điều khiển ATMEGA 16. Hình 1.2. Sơ đồ khối của Atmega16. Hình 1.3. Sơ đồ cấu trúc của ATMEGA16. - Phần cốt lõi là AVR kết hợp với các tập lệnh đa dạng với 32 thanh ghi đa năng. 32 thanh ghi được kết nối trực tiếp với bộ số học ALU (Arthmetic Logic Unit), cho phép truy cập 2 thanh ghi độc lập trong một lệnh đơn được thực thi trong một xung nhịp. Cấu trúc này mang lại nhiều khả năng lập trình có hiệu quả cao đạt trên 10 lần nhanh hơn bộ vi xử lý CISC (Complex Instruction Set Computer: máy tính có tập lệnh phức tạp) thông thường. - Atmega16 cung cấp các thông số đặc trưng sau: bộ nhớ Flash 16kbyte lập trình được ngay trên hệ thống với khả năng đọc và ghi, EEPPROM 512byte, SRAM 1kbyte, 32 đường vào/ra đa năng, 32 thanh ghi làm việc đa năng, 1 giao diện JTAG, việc lập trình và đáp ứng bộ dò sai trên chip, 3 bộ Timer/Counter làm việc linh hoạt với chế độ so sánh, các ngắt ngoài và trong, 1 bộ USART lập trình nối tiếp, 1 giao diện nối tiếp 2 dây byte định hướng, 1 bộ chuyển ADC 8 kênh 10 bit với trạng thái đầu vào vi sai với độ lợi có thể lập trình, 1 bộ định thời Watchdog có thể lập trình với bộ dao động bên trong, 1 cổng nối tiếp SPI, và 6 chế độ tiết kiệm năng lượng có thể lựa chọn nhờ phần mềm. Chế độ nghỉ làm cho CPU ngừng hoạt động trong khi cho phép bộ USART, bộ giao diện 2 dây, bộ chuyển đổi A/D, SRAM, bộ Timer/Counter, cổng SPI, và hệ thống ngắt vẫn tiếp tục làm việc. Chế độ làm giảm mức tiêu thụ năng lượng lưu nội dung thanh ghi nhưng lại để bộ dao động hoạt động, cấm tất cả các chức năng khác trên chip cho đến khi có tín hiệu ngắt ngoài kế tiếp hoặc tín hiệu reset phần cứng. Ở chế độ tiết kiệm năng lượng, bộ Timer bất đồng bộ vẫn tiếp tục hoạt động và cho phép người sử dụng vẫn tiếp tục duy trì 1 bộ định thời cơ sở trong khi các thiết bị còn lại trong chế độ nghỉ. Chế độ giảm nhiễu ADC làm cho CPU ngừng hoạt động và tất cả các môđun vào/ra ngoại trừ bộ Timer bất đồng bộ và bộ ADC, để nhiễu của việc chuyển mạch đạt cực tiều trong suốt quá trình chuyển đổi ADC. Trong chế độ dự phòng, thạch anh/bộ dao động cộng hưởng sẽ hoạt động trong khi các thiết bị còn lại trong chế độ nghỉ. Điều này cho phép việc khởi động nhanh được kết hợp với việc tiêu thụ năng lượng thấp. Ở chế độ dự phòng bên ngoài, cả hai bộ dao động chính và Timer bất đồng bộ vẫn tiếp tục hoạt động. - Các thiết bị được chế tạo bởi công tuy Atmel sử dụng công nghệ bộ nhớ không tự mất dữ liệu và có mật độ cao. Bộ nhớ Flash ISP trên chip cho phép bộ nhớ chương trình có thể lập trình được ngay trên hệ thống qua 1 bộ giao diện nối tiếp SPI hoặc bằng bộ nạp chương trình vào bộ nhớ không tự mất dữ liệu thông thường, hoặc bằng 1 chương trình khởi động trên chip đang chạy trong lõi AVR. Chương trình boot có thể sử dụng một vài giao diện để tải chương trình ứng dụng trong bộ nhớ Flash ứng dụng. Phần mềm trong đoạn Flash khởi động sẽ tiếp tục hoạt động trong khi đoạn Flash khởi động được cập nhật, cung cấp hoạt động đọc ghi một cách chính xác. Bằng cách kết hợp 1 CPU 8 bit theo cấu trúc RISC với bộ nhớ Flash lập trình ngay trên hệ thống trong một chip đơn, ATmega16 của Atmel là bộ vi điều khiển mạnh nó đáp ứng sự linh hoạt cao và là giải pháp có giá trị hiệu quả để đưa nhiều ứng dụng điều khiển vào. 1.2.3. Sơ đồ và chức năng các chân Hình 1.4. Sơ đồ chân ATMEGA16 Port A (PA7 PA0) Port A là một cổng vào/ra 2 hướng 8 bit, nếu bộ chuyển đổi không được dùng. Chân Port có các điện trở nối lên nguồn dương (được chọn cho mỗi bit). Ngõ ra Port A có những đặc tính điều khiển đối xứng với cả hai khả năng chịu đựng nguồn và nhiệt cao. Khi chân PA0 tới chân PA7 được sử dụng như là ngõ vào và được đặt xuống mức thấp từ bên ngoài, chúng sẽ là nguồn dòng nếu các điện trở nối lên cực dương được kích hoạt. Port A cũng được sử dụng khi một tín hiệu tương tự ở ngõ vào đến bộ chuyển đổi A/D. Các chân của Port A sẽ được đặt ở trạng thái 3 (tổng trở cao) khi tín hiệu reset ở mức tích cực ngay cả khi tín hiệu xung nhịp không hoạt động. Port B (PB7 PB0) Port B là một cổng vào/ra 2 hướng 8 bit với các điện trở kéo lên nguồn dương bên trong (được chọn cho mỗi bit). Ngõ ra Port B có những đặc tính điều khiển đối xứng với cả hai khả năng chịu đựng nguồn và nhiệt cao. Cũng như các chân ngõ vào, các chân Port B được đặt xuống mức thấp từ bên ngoài sẽ là nguồn dòng nếu các điện trở nối lên cực dương được kích hoạt. Các chân Port B sẽ được đặt trạng thái thứ 3 khi tín hiệu reset ở mức tích cực, ngay khi xung nhịp không hoạt động. Port C (PC7 PC0) Port C là một cổng vào/ra 2 hướng 8 bit với các điện trở kéo lên nguồn dương bên trong (được chọn cho mỗi bit). Ngõ ra Port C có những đặc tính điều khiển đối xứng với cả hai khả năng chịu đựng nguồn và nhiệt cao. Cũng như các chân ngõ vào, các chân Port C được đặt xuống mức thấp từ bên ngoài sẽ là nguồn dòng nếu các điện trở nối lên cực dương được kích hoạt. Các chân Port C sẽ được đặt trạng thái thứ 3 (tổng trở cao) khi tín hiệu reset ở mức tích cực, ngay khi xung nhịp không hoạt động. Nếu giao diện JTAG được mức cho phép, những điện trở kéo lên trên những chân PC5(TDI), PC3(TMS) và PC2(TCK) sẽ được kích hoạt ngay cả khi nếu một reset xuất hiện. Port D (PD7 PD0) Port D là một cổng vào/ra 2 hướng 8 bit với các điện trở kéo lên nguồn dương bên trong (được chọn cho mỗi bit). Ngõ ra Port D có những đặc tính điều khiển đối xứng với cả hai khả năng chịu đựng nguồn và nhiệt cao. Cũng như các chân ngõ vào, các chân Port D được đặt xuống mức thấp từ bên ngoài sẽ là nguồn dòng nếu các điện trở nối lên cực dương được kích hoạt. Các chân Port C sẽ được đặt trạng thái thứ 3 (tổng trở cao) khi tín hiệu reset ở mức tích cực, ngay khi xung nhịp không hoạt động. VCC, GND, RESET, XTAL1, XTAL2, AVCC, AREF VCC: Nguồn cung cấp. GND: Đất. : Ngõ vào Reset. Một mức thấp trên chân này dài hơn độ rộng xung tối thiểu sẽ tạo ra một reset, ngay khi xung nhịp không hoạt động. Độ rộng xung tối thiểu là 1,5us. Xung ngắn hơn không đảm bảo để tạo ra một reset. XTAL1: Ngõ vào của bộ khuếch đại dao động đảo và mạch tạo xung nhịp bên trong. XTAL2: Ngõ ra của bộ khuếch đại dao động đảo. AVCC: là chân nguồn cung cấp cho Port A và bộ chuyển đổi A/D. Nó nên được kết nối ngoài tới VCC, ngay khi nếu bộ ADC không được dùng. Nếu bộ ADC được sử dụng thì nó được kết nối tới VCC thông qua một mạch lọc thông thấp. AREF: là chân tham chiếu cho bộ chuyển đổi A/D. 1.2.4. Tổ chức bộ nhớ của ATMEGA16 Để tăng tối đa hiệu suất và tính tương thích, vi điều khiển AVR sử dụng kiến trúc Havard tức là bộ nhớ dữ liệu và bộ nhớ chương trình tách biệt nhau cả về vùng nhớ và đường bus. Bộ nhớ chương trình của AVR là bộ nhớ Flash có dung lượng 16kbyte. 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 cho bảng vecto ngắt có địa chỉ từ 0000H – 0028H(gồm 21 ngắt). Bộ nhớ chương trình Flash được chia thành 2 phần, phần chương trình khởi động và phần chương trình ứng dụng. Cả hai phần đều dành những bit khóa cho việc bảo vệ ghi và đọc/ghi. Bộ nhớ dữ liệu của AVR chia làm 2 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 nằm tách biệt nhau và được đánh địa chỉ riêng. Bộ nhớ SRAM được chia thành 3 phần: Phần đầu là 32 thanh ghi chức năng chung (General Purpose Register ) R0 đến R31 có địa chỉ từ $0000 tới $001F. Phần thứ 2 là không gian nhớ vào ra với 64 thanh ghi vào ra ( I/O Register ) có địa chỉ từ $0020 tới $005F. Phần thứ 3 có địa chỉ từ $0060 tới $045F là vùng của bộ nhớ SRAM nội có kích thước là 1Kbyte. 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 điện cung cấp bị cắt. Có thể ví bộ nhớ dữ liệu EEPROM giống như là ổ cứng ( Hard disk ) của máy vi tính. Với vi điều khiển ATmega16, bộ nhớ EEPROM có kích thước là 512byte. EEPROM được xem như là một bộ nhớ vào ra được đánh địa chỉ độc lập với SRAM, điều này có nghĩa là ta cần sử dụng các lệnh in, out … khi muốn truy xuất tới EEPROM. Bộ nhớ có địa chỉ từ $000 tới $1FF. Hình 1.5. Tổ chức bộ nhớ của ATmega16 1.2.5. Một số thanh ghi của ATMEGA16 1. Status Register – Thanh ghi trạng thái Thanh ghi trạng thái chứa thông tin về kết quả thưc hiện của hầu hết các lệnh số học. Các thông tin này có thể được sử dụng để điều khiển chương trình. Chú ý rằng các thanh ghi trạng thái được cập nhật sau tất cả các hoạt động của ALU. Trong nhiều trường hợp, điều này sẽ bỏ đi những cần thiết khi sử dụng câu lệnh so sánh chuyên dụng, kết quả nhanh hơn và đoạn chương trình ngắn gọn hơn. Thanh ghi trạng thái không tự động lưu trữ khi đang nhập vào môt thường trình ngắt và lưu trữ khi trở về tự một ngắt. Điều này phải được quản lý bằng phần mềm. Thanh ghi trạng thái AVR – SREG - được định nghĩa như sau: Bit 7 – I: Global Interrupt Enable - bit cho phép ngắt toàn cục. Bit cho phép ngắt toàn cục phải được đặt để cho các ngắt có thể hoạt động. Điều khiển hoạt động của các ngắt riêng biệt được thực hiện trong các thanh ghi điều khiển riêng biệt. Nếu thanh ghi cho phép ngắt toàn cục được xóa, không có một ngắt riêng biệt nào được hoạt động. Bit I được xóa bởi phần cứng sau khi một ngắt xảy ra và được đặt bởi lệnh RETI để cho các phép các ngắt tiếp theo hoạt động. Bit I cũng có thể được đặt và xóa bởi câu lệnh SEI và CLI trong các ứng dụng. Bit 6 – T: Bit Copy Storage. Các câu lệnh copy bit BLD (Bit LoaD) và BST (Bit STore) sử dụng bit T như là đích hoặc nguồn cho bit hoạt động. 1 bit từ một thanh ghi trong tệp thanh ghi có thể được copy vào bit T bằng lệnh BST và một bit trong T có thể được copy vào 1 bit trong thanh ghi trong tệp thanh ghi bằng lệng BLD. Bit 5 – H: Half Carry Flag . Cờ nhớ một nửa dùng cho các toàn hạng hạng một nửa byte trong các phép toán số học. Cờ H sử dụng phép toán số học với số BDC . Bit 4 – S: Sign Bit, S = N Å V – bit dấu. Bit S là phép XOR giữa cờ âm và cờ tràn V . Bit 3 – V: Two’s Complement Overflow Flag – cờ tràn mã bù 2. Cờ tràn V hỗ trợ phép toán số bù 2. Bit 2 – N: Negative Flag – cờ âm. Cờ âm N hiển thị kết quả âm của phép toán logic hoặc số học. Bit 1 – Z: Zero Flag . Cờ Zero Z hiển thị kết quả bằng 0 của phép toán logic hoặc số học. Bit 0 – C: Carry Flag. Cờ nhớ C hiển thị số nhớ trong phép toán logic hoặc số học. 2. Thanh ghi địa chỉ EEPROM – EEARH và EEARL Bit 15..9 – Res: Reserved Bits là các bit thụ trong ATmega16 và luôn luôn được đặt ở mức [0]. Bit 8..0 – EEAR8..0: EEPROM Address Thanh ghi địa chỉ EEPROM – EEARH và EEARL chỉ rõ địa chỉ EEPROM trong không gian EEPROM 512 byte. Những byte dữ liệu EEPROM được định địa chỉ ở 0511. Giá trị ban đầu của EEAR thì không được định nghĩa. Một giá trị riêng phải được viết trước khi EEPROM có thể được truy xuất. 3. Thanh ghi dữ liệu EEPROM – EEDR Bit 7..0- EEDR7..0: Dữ liệu EEPROM Đối với thao tác ghi của EEPROM, thanh ghi dữ liệu EEDR chứa dữ liệu được ghi tới EEPROM trong vùng địa chỉ được định bởi thanh EEAR. Đối với thao tác đọc của EEPROM, thanh ghi EEDR chứa dữ liệu được tạo ra EEPROM trong vùng địa chỉ được định bởi thanh ghi EEAR. 4. Thanh ghi điều khiển EEPROM- EECR Bit 7..4 - Res: Resserved Bits là những bít thụ động. Các bít này luôn được đặt ở mức [0]. Bit 3 - EERIE: EEPROM Ready Interrupt Enable Khi bit I trong thanh ghi SREG và EERIE được đặt lên [1], ngắt EEPROM Ready được cho phép và khi xoá xuống [0] thì ngắt bị cấm. Ngắt EEPROM Ready phát ra một ngắt hằng khi EEWE bị xoá xuống [0]. Bit 2- EEMWE: EEPROM Master Write Enable Việc đặt EEMWE lên [1] sau đó việc thiết lập EEWE sẽ chỉ ghi dữ liệu lên bộ nhớ EEPROM tại vùng địa chỉ đã được chọn. Nếu EEMWE bị xoá xuống [0] thì thiết lập EEWE cũng không có tác dụng gì. Khi EEMWE được đặt lên [1] bằng phần mềm thì phần cứng sẽ xoá bit này xuống [0] sau 4 chu kỳ xung nhịp. Bit 1- EEWE: EEPROM Write Enable Khi địa chỉ và dữ liệu được cài đặt một chính xác, bit EEWE phải được thiết lập để ghi giá trị vào trong EEPROM. Khi mức logic [1] được đặt vào bit EEWE thì bit EEMWE phải được thiết lập, nếu không sẽ không thao tác ghi EEPROM được. Các lệnh ghi dữ liệu bộ nhớ EEPROM được viết như sau (bước 3 và 4 không cần thiết): 1. Đợi cho đến khi EEWE trở thành [0]. 2. Đợi cho đến khi SPMEN ở SPMCR trở thành [0]. 3. Ghi địa chỉ EEPROM mới tới EEAR (không bắt buộc). 4. Ghi dữ liệu EEPROM mới tới EEDR (không bắt buộc). 5. Ghi mức lôgic [1] tới bit EEMWE trong khi ghi mức [0] tới EEWE ở thanh ghi EECR. 6. Trong vòng bốn chu kỳ đồng hồ sau khi EEMWE được thiết lập, ghi lôgic [1] tới EEWE. Bit 0 - EERE: EEPROM Read Enable Khi địa chỉ chính xác được cài đặt trong thanh ghi EEAR, bit EERE được ghi mức lôgic [1] tới EEPROM kích đọc. Truy xuất đọc EEPROM mất một lệnh và dữ liệu yêu cầu được đáp ứng ngay lập tức. Khi EEPROM được đọc, CPU tạm nghỉ bốn chu kỳ xung trước khi lệnh kế tiếp được thực hiện. Người sử dụng nên kiểm tra bit EEWE trước khi bắt đầu thao tác đọc. Nếu một thao tác ghi được đang hoạt động, nó không thể đọc EEPROM, mà cũng không thay đổi thanh ghi EEAR. 5. Thanh ghi điều khiển MCUCR Thanh ghi này dùng để chọn điều kiện để xẩy ra các ngắt ngoài INT0 và INT1. Các bít ISCxx sẽ có nhiệm vụ đó với bít ISC1x sẽ có tác động tới ngắt ngoài INT1 còn với bít ISC0x sẽ tác động tới ngắt ngoài INT0. Cụ thể sẽ được trình bày như sau: ISCx1 ISCx0 Điều kiện xẩy ra ngắt 0 0 Mức logic 0(thấp) sẽ xẩy ra ngắt 1 0 Có sự thay đổi mức logic sẽ xẩy ra ngắt 0 1 Cạnh xuống của tín hiệu sẽ xẩy ra ngắt 1 1 Cạnh lên của tín hiệu sẽ xẩy ra ngắt Vậy ta có bốn sự lựa chọn để xẩy ra ngắt ngoài, tùy vào yêu cầu đặt ra mà ta chọn điều kiện để xẩy ra ngắt. Bít ISC2 cho phép chọn điều kiên xẩy ra ngắt ngoài INT2. ISC2 Điều kiện 1 Cạnh lên của tín hiệu sẽ xẩy ra ngắt 0 Cạnh xuống của tín hiệu sẽ xẩy ra ngắt 6. Thanh ghi điều khiển ngắt ngoài GICR Các bit INT0, INT1, INT2 cho phép các ngắt ngoài có xẩy ra hay không. Các ngắt ngoài chỉ xẩy ra khi các bít này được đặt thành 1 và ngắt toàn cục I được phép. 7. Thanh ghi cờ ngắt ngoài ngắt ngoài GIFR Các bít INTF2, INTF1, INTF0 là các cờ ngắt của các ngắt ngoài tương ứng. Khi có tín hiệu yêu cầu ngắt ngoài thì cờ ngắt tương ứng sẽ được set thành 1, nếu ngắt tương ứng được cho phép thì MCU sẽ nhảy tới bảng véc tơ ngắt, cờ ngắt sẽ được xóa khi chương trình phục vụ ngắt ( ISR ) được thực thi. Ngoài ra ta cũng có set hay xóa cờ ngắt bằng cách ghi trực tiếp một giá trị logic vào nó. 1.2.6. Chuyển đổi ADC trong AVR       Có 4 thanh trong bộ ADC trên AVR trong đó có 2 thanh ghi data chứa dữ liệu sau khi chuyển đổi, 2 thanh ghi điều khiển và chứa trạng thái của ADC.       -1, ADMUX (ADC Multiplexer Selection Register): là 1 thanh ghi 8 bit điều khiển việc chọn điện áp tham chiếu, kênh và chế độ hoạt động của ADC. Chức năng của từng bit trên thanh ghi này sẽ được trình bày cụ thể như sau: Bit 7:6- REFS1:0 (Reference Selection Bits): là các bit chọn điện áp tham chiếu cho ADC, 1 trong 3 nguồn điện áp tham chiếu có thể được chọn là: điện áp ngoài từ chân VREF, điện áp tham chiếu nội 2.56V hoặc điện áp AVCC. Bảng 2 tóm tắt giá trị các bit và điện áp tham chiếu tương ứng. Bảng 2: Chọn điện áp tham chiếu Bit 5-ADLAR (ADC Left Adjust Result): là bit cho phép hiệu chỉnh trái kết quả chuyển đổi. Sở dĩ có bit này là vì ADC trên AVR có độ phân giải 10 bit, nghĩa là kết quả thu được sau chuyển đổi là 1 số có độ dài 10 bit (tối đa 1023), AVR bố trí 2 thanh ghi data 8 bit để chứa giá trị sau chuyển đổi. Như thế giá trị chuyển đổi sẽ không lắp đầy 2 thanh ghi  data, trong một số trường hợp người dùng muốn 10 bit kết quả nằm lệch về phía trái trong khi cũng có trường hợp người dùng muốn kết quả nằm về phía phải. Bit ADLAR sẽ quyết định vị trí của 10 bit kết quả trong 16 bit của 2 thanh ghi data. Nếu ADLAR=0 kết quả sẽ được hiệu chỉnh về phía phải (thanh ghi ADCL chứa trọn 8 bit thấp và thanh ghi ADCH chứa 2 bit cao trong 10 bit kết quả), và nếu ADLAR=1 thì kết quả được hiệu chỉnh trái (thanh ghi ADCH chứa trọn 8 bit cao nhất, các bit từ 9 đến 2, và thanh ADCL chứa 2 bit thấp nhất trong 10 bit kết quả (bạn xem hình cách bố trí 2 thanh ghi ADCL và ADCH bên dưới để hiểu rõ hơn). Bits 4:0-MUX4:0 (Analog Channel and Gain Selection Bits): là 5 bit cho phép chọn kênh, chế độ và cả hệ số khuyếch đại cho ADC. Do bộ ADC trên AVR có nhiều kênh và cho phép thực hiện chuyển đổi ADC kiểu so sánh (so sánh điện áp giữa 2 chân analog) nên trước khi thực hiện chuyển đổi, chúng ta cần set các bit MUX để chọn kênh và chế độ cần sử dụng. Bảng 3 tóm tắt các chế độ hoạt động của ADC thông qua các giá trị của các bit MUX. Trong bảng này, ứng với các giá trị từ 00000 đến 00111 (nhị phân), các kênh ADC được chọn ở chế độ đơn kênh (tín hiệu input lấy trực tiếp từ các chân analog và so sánh với 0V), giá trị từ 01000 đến 11101 tương ứng với chế độ chuyển đổi so sánh. Bảng 3: Chọn chế độ chuyển đổi.       - 2, ADCSRA (ADC Control and Status RegisterA): là thanh ghi chính điều khiển hoạt động và chứa trạng thái của module ADC.       Từng bit của thanh ghi ADCSRA được mô tả như bên dưới: Bit 7 - ADEN(ADC Enable): viết giá trị 1 vào bit này tức bạn đã cho phép module ADC được sử dụng. Tuy nhiên khi ADEN=1 không có nghĩa là ADC đã hoạt động ngay, bạn cần set một bit khác lên 1 để bắt đầu quá trình chuyển đổi, đó là bit ADSC. Bit 6 - ADSC(ADC Start Conversion): set bit này lên 1 là bắt đầu khởi động quá trình chuyển đổi. Trong suốt quá trình chuyển đổi, bit ADSC sẽ được giữ nguyên giá trị 1, khi quá trình chuyển đổi kết thúc (tự động), bit này sẽ được trả về 0. Vì vậy bạn không cần và cũng không nên viết giá trị 0 vào bit này ở bất kỳ tình huống nào. Để thực hiện một chuyển đổi, thông thường chúng ta sẽ set bit ADEN=1 trước và sau đó set ADSC=1. Bit 4 – ADIF(ADC Interrupt Flag): cờ báo ngắt. Khi một chuyển đổi kết thúc, bit này tự động được set lên 1, vì thế người dùng cần kiểm tra giá trị bit này trước khi thực hiện đọc giá trị chuyển đổi để đảm bảo quá trình chuyển đổi đã thực sự hoàn tất. Bit 3 – ADIE(ADC Interrupt Enable): bit cho phép ngắt, nếu bit này được set bằng 1 và bit cho phép ngắt toàn cục (bit I trong thanh ghi trạng thái của chip) được set, một ngắt sẽ xảy ra khi một quá trình chuyển đổi ADC kết thúc và các giá trị chuyển đổi đã được cập nhật (các giá trị chuyển đổi chứa trong 2 thanh ghi ADCL và ADCH). Bit 2:0 – ADPS2:0(ADC Prescaler Select Bits): các bit chọn hệ số chia xung nhịp cho ADC. ADC, cũng như tất cả các module khác trên AVR, cần được giữ nhịp bằng một nguồn xung clock. Xung nhịp này được lấy từ nguồn xung chính của chip thông qua một hệ số chia. Các bit ADPS cho phép người dùng chọn hệ số chia từ nguồn clock chính đến ADC. Tham khảo bảng 4 để biết cách chọn hệ số chia. Bảng 4: Hệ số chia xung nhịp cho ADC.       -3, ADCL và ADCH (ADC Data Register): 2 thanh ghi chứa giá trị của quá trình chuyển đổi. Do  module ADC trên AVR có độ phân giải tối đa 10 bits nên cần 2 thanh ghi để chứa giá trị chuyển đổi. Tuy nhiên tổng số bít của 2 thanh ghi 8 bit là 16, con số này nhiều hơn 10 bit của kết quả chuyển đổi, vì thế chúng ta được phép chọn cách ghi 10 bit  kết quả vào 2 thanh ghi này. Bit ADLAR trong thanh ghi ADMUX quy định cách mà kết quả được ghi vào. ADLAR=0: ADLAR=1:       Thông thường, 2 thanh ghi data được sắp xếp theo định dạng ADLAR=0, ADCL chứa 8 bit thấp và 2 bit thấp của ADCH chứa 2 bit cao nhất của giá trị thu được. Chú ý thứ tự đọc giá trị từ 2 thanh ghi này, để tránh đọc sai kết quả, bạn cần đọc thanh ghi ADCL trước và ADCH sau, vì sau khi ADCH được đọc, các thanh ghi data có thể được cập nhật giá trị tiếp theo.       - SFIOR(Special FunctionIO Register C): thanh ghi chức năng đặc biệt, 3 bit cao trong thanh ghi này quy định nguồn kích ADC nếu chế độ Auto Trigger được sử dụng. Đó là các bit ADTS2:0 (Auto Trigger Source 2:0). Các loại nguồn kích được trình báy trong bảng 5. Bảng 5: Nguồn kích ADC trong chế độ Auto Trigger. 2. LCD 16x2. 2.1, Tìm hiểu về LCD 16x2 LCD sử dụng trong đề tài là loại 2 dòng và 16 cột, cho phép hiển hiển thị cùng lúc 32 ký tự. Với 14 chân điều khiển và 2 chân mở rộng, sơ đồ chân được chỉ ra ở hình. Hình ảnh thực tế LCD16x2. Vị trí các chân và tên chân tương ứng. Bảng 1.1 Mô tả các chân của LCD: Số thứ tự Tên Ý nghĩa 1 Vss Đất 2 Vcc Cung cấp nguồn +5V 3 Vee Điều khiển độ tương phản 4 RS 0 = đầu vào là lệnh 1 = đầu vào là dữ liệu 5 R/W 0 = ghi tới LCD 1 = đọc từ LCD 6 EN Chân cho phép 7 D0 Đường dữ liệu 0 (LSB) 8 D1 Đường dữ liệu 1 9 D2 Đường dữ liệu 2 10 D3 Đường dữ liệu 3 11 D4 Đường dữ liệu 4 12 D5 Đường dữ liệu 5 13 D6 Đường dữ liệu 6 14 D7 Đường dữ liệu 7 (MSB) .a, Tổ chức bộ nhớ của LCD16x2(HD44780U) LCD HD44780U có 3 loại bộ nhớ: DDRAM DDRAM là bộ nhớ tạm chứa các ký tự cần hiển thị lên LCD, bộ nhớ này gồm có 80 ô được chia thành 2 hàng, mỗi ô có độ rộng 8 bit và được đánh số từ 0 đến 39 cho dòng 1; từ 64 đến 103 cho dòng 2. Mỗi ô nhớ tương ứng với 1 ô trên màn hình LCD. Như chúng ta biết LCD loại 16x2 có thể hiển thị tối đa 32 ký tự (có 32 ô hiển thị), vì thế có một số ô nhớ của DDRAM không được sử dụng làm các ô hiển thị. Để hiểu rõ hơn chúng ta tham khảo hình bên dưới. Hình 1.14. Tổ chức của DDRAM. Chỉ có 16 ô nhớ có địa chỉ từ 0 đến 15 và 16 ô địa chỉ từ 64 đến 79 là được hiển thị trên LCD. Vì thế muốn hiển thị một ký tự nào đó trên LCD chúng ta cần viết ký tự đó vào DDRAM ở 1 trong 32 địa chỉ trên. Các ký tự nằm ngoài 32 ô nhớ trên sẽ không được hiển thị, tuy nhiên vẫn không bị mất đi, chúng có thể được dùng cho các mục đích khác nếu cần thiết. CGROM CGROM là vùng nhớ cố định chứa định nghĩa font cho các ký tự. Chúng ta không trực tiếp truy xuất vùng nhớ này mà chip HD44780U sẽ tự thực hiện khi có yêu cầu đọc font để hiện thị. Một điều đáng lưu ý là địa chỉ font của mỗi ký tự  vùng nhớ CGROM chính là mã ASCII của ký tự đó. Ví dụ ký tự ‘a’ có mã ASCII là 97, tham khảo tổ chức của vùng nhớ CGROM trong hình 4 bạn sẽ nhận thấy địa chỉ font của ‘a’ có 4 bit thấp là 0001 và 4 bit cao là 0110. CGROM và DDRAM được tự động phối hợp trong quá trình hiển thị của LCD. Giả sử chúng ta muốn hiển thị ký tự ‘a’ tại vị trí đầu tiên, dòng thứ 2 của LCD thì các bước thực hiện sẽ như sau: trước hết chúng ta biết rằng vị trí đầu tiên của dòng 2 có địa chỉ là 64 trong bộ nhớ DDRAM, vì thế chúng ta sẽ ghi vào ô nhớ có địa chỉ 64 một giá trị là 97 (mã ASCII của ký tự ‘a’). Tiếp theo, chip HD44780U đọc giá trị 97 này và coi như là địa chỉ của vùng nhớ CGROM, nó sẽ tìm đến vùng nhớ CGROM có địa chỉ 97 và đọc bảng font đã được định nghĩa sẵn ở đây, sau đó xuất bản font này ra các “chấm” trên màn hình LCD tại vị trí đầu tiên của dòng 2 trên LCD. Đây chính là cách mà 2 bộ nhớ DDRAM và CGROM phối hợp với nhau để hiển thị các ký tự. Như mô tả, công việc của người lập trình điều khiển LCD tương đối đơn giản, đó là viết mã ASCII vào bộ nhớ DDRAM tại đúng vị trí được yêu cầu, bước tiếp theo sẽ do HD44780U đảm nhiệm. CGRAM CGRAM là vùng nhớ chứa các symbol do người dùng tự định nghĩa, mỗi symbol được có kích thước font 5x8 và được dành cho 8 ô nhớ 8 bit. Các symbol thường được định nghĩa trước và được gọi hiển thị khi cần thiết. Vùng này có tất cả 64 ô nhớ nên có tối đa 8 symbol có thể được định nghĩa. Hình 1.15. Vùng nhớ CGROM. .b. Thanh ghi chỉ thị và thanh ghi dữ liệu. Là 2 thanh ghi 8 bit trong bộ điều khiển HD44780. Thanh ghi chỉ thị lệnh (instruction register) chứa các lệnh được gửi từ vi điều khiển để điều khiển LCD như lệnh dịch LCD, xóa LCD, địa chỉ LCD.v.v.. Thanh ghi dữ liệu (data register) được sử dụng để lưu trữ dữ liệu để hiển thị trên LCD. Khi tín hiệu cho phép gửi của LCD được xác nhận, dữ liệu trên các chân sẽ được chốt tới thanh ghi dữ liệu và dữ liệu này sau đó sẽ được tự động chuyển tới DDRAM và sau đó sẽ hiển thị lên LCD. Lệnh và chỉ thị: Chỉ có thanh ghi chỉ thị (instruction register) và thanh ghi dữ liệu (data register) của LCD mới có thể điều khiển được bằng vi điều khiển. Sự hoạt động bên trong của LCD được xác định bằng các tín hiệu được gửi đến từ MCU. Những tín hiệu đó bao gồm: tín hiệu lựa chon thanh ghi, tín hiệu đọc/ghi, và dữ liệu trên bus (D0 tới D7), có 4 loại lệnh của LCD là: Chỉ rõ chức năng của LCD như định dạng hiển thị, độ dài dữ liệu… Thiết lập địa chỉ RAM trong. Thực hiện truyền dữ liệu với RAM trong. Thực hiện một số chức năng khác. Bảng1.2. Danh sách các lệnh thường xuyên sử dụng khi làm việc với LCD. Số thứ tự Chỉ thị Mã lệnh (hex) Mã lênh (decimal) 1 Thiết lập : 8 bit, 1 dòng, 5x7 điểm 0x30 48 2 Thiết lập : 8 bit, 2 dòng, 5x7 điểm 0x38 56 3 Thiết lập : 4 bit, 1 dòng, 5x7 điểm 0x20 32 4 Thiết lập : 4 bit, 2 dòng, 5x7 điểm 0x28 40 5 Tắt hiển thị, tắt con trỏ 0x08 8 6 Bật hiển thị, bật con trỏ 0x0E 14 7 Bật hiển thị, tắt con trỏ 0x0C 12 8 Bật hiển thị, nhấp nháy con trỏ 0x0F 15 9 Dịch hiển thị sang trái 0x18 24 10 Dịch hiển thị sang phải 0x1C 30 11 Di chuyển con trỏ sang trái 1 ký tự 0x10 16 12 Dich chuyển con trỏ sang phải 1 ký tự 0x14 20 13 Xóa hiểm thị đồng thời cũng xóa nội dung trong DDRAM 0x01 1 14 Thiết lập địa chỉ DDRAM hoặc vị trí con trỏ hiển thị 0x80 + add 128 + add 15 Thiết lập địa chỉ CGRAM hoặc cài đặt con trỏ tới vùng CGRAM 0x40 + add 64 + add .c, Chế độ giao tiếp với LCD16x2. Có 2 chế độ giao tiếp là chế độ 8 bit và chế độ 4 bít. Với chế độ 8 bít chúng ta cần sử dụng 8 chân của vi điều khiển(ở cùng 1 PORT) để làm 8 chân dữ liệu và phải sử dụng thêm 3 chân của vi điều khiển nữa để làm các chân điều khiển. Như vậy ta cần tới 11 chân của vi điều khiển để giao tiếp với 1 LCD, mặt khác số lượng chân của vi điều khiển rất hạn chế do vậy chế độ giao tiếp 8 bít ít được sử dụng trong thực tế. Với chế độ 4 bít ta chỉ cần 4 chân của vi điều khiển và 3 chân vi điều khiển để làm các chân đưa tín hiệu điều khiển tới LCD. Do vậy ta chỉ mất có 7 chân của vi điều khiển để giao tiếp với LCD. Ở chế độ này thì khi gửi 1byte tới LCD ta phải chia làm hai lần – đó là gửi 4bit cao trước sau đó gủi 4bit thấp sau.Tuy nhiên ở chế độ này sẽ tiết kiệm chân của vi điều khiển để giao tiếp với LCD do đó chế độ này hiện này được sử dụng rất rộng dãi. .d, Một số hàm thao tác cơ bản với LCD 1. Hàm đọc cờ bận. Busy Flag (BF): là cờ chỉ thị trạng thái cho LCD. Khi gửi 1 lệnh hoặc dữ liệu tới LCD để xử lý thì cờ này được bật (BF =1). Quá trình kết thúc cờ này được xóa về không (BF = 0). Để đọc được cờ BF thì điều kiện là chân RS = 0 và chân R/W = 1, bit MSB của dữ liệu LCD (D7) chứa giá trị nhận được của BF. Khi BF = 1 có nghĩa là LCD đang bận và sẽ không nhận bất cứ lệnh nào, còn khi BF = 0 cho biết LCD đã sẵn sàng nhận lệnh hoặc dữ liệu để xử lý. Khi gửi lệnh thì BF hoặc D7 của LCD sẽ nhận giá trị 1 thông báo LCD đang bận xử lý, quá trình kết thúc BF = 0. Các bước sau chỉ ra quá trình đọc cờ bận. Lựa chọn thanh ghi lệnh(RS = 0). Lựa chọn thao tác đọc(R/W = 1). Gửi tín hiệu cho phép(E = 0, E =1). . Đọc cờ bận BF(đọc bit D7). Tuy nhiên, ta có thể ta không phải đọc trực tiếp cờ bận(BF) mà ta có thể thay thế bằng một đoạn trễ để LCD xử lí xong các lệnh mà nó đã nhận từ thiết bị điều khiển. 2. Ghi lệnh tới LCD Quá trình gửi lệnh thực hiện giống hệt như trong hàm khởi tạo có thể xây dựng hàm con với các bước sau: Di chuyển dữ liệu(lệnh cần gửi) tới cổng của LCD. Lựa chọn thanh ghi lệnh(RS = 0). Lựa chọn thao tác ghi(R/W = 0). Gửi tín hiệu cho phép(E = 0, E = 1) Đợi cho LCD xử lý(tới khi cờ BF = 0). 3. Ghi dữ liệu tới LCD Gửi dữ liệu đơn giản chỉ cần lựa chọn thanh ghi dữ liệu, các công việc khác hoàn toàn giống với thao tác gửi lệnh. Được mô tả bằng các bước sau: Di chuyển dữ liệu(dữ liệu cần ghi) tới cổng LCD. Lựa chọn thanh ghi dữ liệu(RS = 1). Lựa chọn thao tác ghi(R/W = 0). Gửi tín hiệu cho phép(E = 0, E = 1). Đợi cho LCD xử lý. 4. Di chuyển vị trí của con trỏ Để thiết lập vị trí con trỏ trên LCD, cần gửi tới địa chỉ DDRAM . Bit 7 6 5 4 3 2 1 0 Giá trị 1 AD6 AD5 AD4 AD3 AD2 AD1 AD0 Bit thứ 7 luôn luôn là 1(D7 = 1), các bit từ 0 tới 7 là địa chỉ của DDRAM. Nếu muốn đặt con trỏ tại vị trí đầu tiên tức dòng 1 cột 1, thì địa chỉ sẽ phải ghi là ‘0b10000000’ hay 0x80. Với LCD 2 dòng 16 cột, địa chỉ từ 0x80 tới 0x8F cho phép nhìn thấy trên dòng 1 và từ địa chỉ từ 0xC0 tới 0xCF nhìn thấy được trên dòng 2, vùng còn trống của DDRAM vẫn được dùng, tuy nhiên sẽ không nhìn thấy được trên LCD. Để kiểm tra điều này cách đơn giản là xuất 1 chuỗi ký tự lớn hơn 16 và dịch hiển thị thì những ký tự không được nhìn thấy sẽ trở lại từ phía sau. Cách tính địa chỉ DDRAM(vị trí của con trỏ) như sau: ADD = 128 + (x - 1) + 64(y - 1) Với y là số hàng, y = 1 hoặc y = 2. x là số cột, x = 1- 16. VD : Muốn di chuyển con trỏ tới vị trí hàng 2 cột 3(y = 2, x = 3) thì : ADD = 128 + (3-1) +64(2-1) = 194 hay 0xC2. 2.2.Kết nối LCD với AVR .a, Sơ đồ kết nối. .b, Trình tự giao tiếp với LCD. 3, Ngôn ngữ C. Ngôn ngữ để viết chương trình cho vi điều khiển AVR thường rất đa dạng. Từ những ngôn ngữ cấp thấp như ASM tới những ngôn ngữ câp cao như basic, pascal, C & C++, ngôn ngữ đồ họa. Khi sử dụng ngôn ngữ cấp thấp để viết chương trình giúp ta có thể hiểu rõ cấu trúc của vi điều khiển tuy nhiên lại mất nhiều thời gian khi ta xây dựng các ứng lớn. Với ngôn ngữ bậc cao có ưu điểm là giúp ta xây dựng các chương trình một cách nhanh chóng, rút ngắn thời gian xây dựng các ứng dụng. Trong các ngôn ngữ bậc cao thì ngôn ngữ C được sử dụng rất rộng dãi trong lập trình cho các dòng vi điều khiển nói chung và dòng AVR nói riêng. Trình biên dịch giúp ta dịch các file đã viết thành ngôn ngữ mấy để nạp vào vi điều khiên. Hiện nay, có rất nhiều trình biên dịch cho vi điều khiển AVR, mỗi trình dịch có thể sử dụng một hoặc nhiều ngôn ngữ để viết như WINavr; Codevision, ICCAVR, MikroC(C); Bacom, AvrFast(basic), Flowcode(ngôn ngữ đồ họa). 3.1. Cơ bản về ngôn ngữ C Ngôn ngữ lập trình C là ngôn ngữ khá mạnh và được nhiều người sử dụng. Lập trình bằng ngôn ngữ cấp cao như C giúp xây dựng các ứng dụng nhanh chóng và dễ dàng hơn. Sau đây sẽ giới thiệu một cách cơ bản nhất về cách viết chương trình cho AVR sử dụng ngôn ngữ C. Một chương trình C cho AVR thường bao gồm những thàn phần cơ bản như: chú thích (comments), biểu thức (expressions), câu lệnh (statements), khối (blocks), các toán tử, cấu trúc điều khiển (flow controls), hàm (function)…. Chú thích (comments): Chú thích là những đoạn trong chương trình dùng để giải thích hay bình phẩm những gì ta làm trong chương trình, phần chú thích không được biên dịch vì vậy nó không có bất kỳ ảnh hưởng nào dến hoạt động của chương trình. Có hai cách để tạo phần chú thích trong C là chú thích theo từng dòng bằng cách đặt ở đầu dòng chú thích dấu “//” và chú thích block bằng cách kẹp đoạn cần chú thích vào giữa /*…*/. Tiền xử lý (preprocessor): là một tiện ích của ngông ngữ C, các preprocessor được trình biên dịch xử lý trước tất cả các phần khác. Các preprocessor được bắt đầu bằng dấu “#”, trong ngôn ngữ C có hai preprocessor được sử dụng phổ biến nhât đó là #include và #define. Preprocessor #include dùng để chỉ định 1 file được đính kèm trong quá trình xử lý, và #define dùng để định nghĩa một chuỗi thay thế hoặc 1 macro. Biểu thức (expressions): là một phần của các câu lệnh, biểu thúc có thể bao gồm các biến, các toán tử, gọi hàm…. Biểu thức trả về một giá trị đơn. Biểu thức không phải là một câu lệnh hoàn chỉnh. Câu lệnh (statements): là một dòng lệnh hoàn chỉnh có thể bao gồm các từ khóa (key words), các biểu thức các câu lệnh khác và được kết thúc bằng dấu “;”. Khối (blocks): là sự kết hợp của nhiều câu lệnh để cùng thực hiện một nhiệm vụ nào đó. Khối được kẹp giữa hai dấu mở khối “{” và đóng khối “}”. Toán tử (operators): là những ký hiệu báo cho trình biên dịch biết nhũng nhiệm vụ cần thực hiện(toán tử đại số, toán tử logic và quan hệ …). Cấu trúc điều khiển (flow controls): Các cấu trúc điều khiển cho phép chương trình thực hiện đúng theo ý tưởng của người viết chương trình. Các cấu trúc điều khiển thường dùng trong lập trình C: “If (điều kiện) câu lệnh;” Nếu điều kiện là đúng thì thực hiện câu lệnh tiếp theo sau, câu lệnh có thể được viết cùng dòng hay dòng sau từ khóa if. Điều kiện là một biểu thức bất kỳ có thể là sự kết hợp của nhiều điều kiện thông qua các toán tử quan hệ AND(&&), OR(||), … Điều kiện được cho là đúng khi nó khác 0 . Trong trường hợp cần thực thi nhiều câu lệnh khi một điều kiện nào đó thỏa mãn ta có thể đặt các câu lệnh đó trong một khối: If (điều kiện) { Câu lệnh 1; Câu lệnh 2; … } “If (điều kiện) câu lệnh 1; else câu lệnh 2;”: Nếu điều kiện đúng thì thực hiện câu lệnh 1, nếu không đúng thì thực hiện câu lệnh 2. Việc đặt else và các câu lệnh trên cùng 1 dòng hay khác dòng không làm thay đổi ý nghĩa của cấu trúc. Nếu cần thực hiện nhiều câu lệnh thì các câu lệnh cần được dặt trong 1 khối: If (điều kiện) { Câu lệnh 1; Câu lệnh 2; … } Else { Câu lệnh 1; Câu lệnh 2; … } Trong trường hợp có nhiều khả năng xảy ra cho 1 biểu thức (hay một biến) với mỗi khả năng lại cần thực hiện một công việc nào đó, ta có thể sử dụng cấu trúc switch: Switch (biểu thức) { Case hằng _số_1: Các câu lệnh 1; Break; Case hằng_số_2: Các câu lệnh 2; Break; Defaul: Các câu lệnh khác; } Cấu trúc switch hoạt động theo cách thức sau: Đầu tiên chương trình tính giá trị của biểu thức sau đó lần lượt đem so sánh với các giá trị hằng số đặt phía sau từ khóa case. Biểu thức có giá trị bằng hằng số nào thì thực hiện các câu lệnh trong case đó dến khi tìm thấy từ khóa break. Có thể đặt bao nhiêu case tùy ý. Nếu giá trị của biểu thức không tương ứng với các hằng số thì chương trình thực hiện các câu lệnh trong phần defaul: (nếu có phần này). Cấu trúc lặp While: “while (điều kiện) câu lệnh 1”. Ý nghĩa của cấu trúc lặp while là thực hiện câu lệnh 1 (hoặc 1 khối câu lệnh đặt trong dấu “{}”) khi điều kiện còn đúng. Cấu trúc lặp for : “for (biểu thức 1; biểu thức 2; biểu thức 3) câu lệnh”. Trong đó biểu thức 1 là biểu thức khởi tạo, biểu thức 2 là điều kiện, biểu thức 3 là biểu thức thực hiện sau. Biểu thức 1 được thực hiện 1 lần sau đó chương trình kiểm tra điêu kiện qua biểu thức 2, nếu điều kiện đúng câu lệnh được thực hiện, sau đó thực hiện biểu thức 3 rồi lại quay lại kiểm tra điều kiện. Cứ như vậy tới khi điều kiện không còn đúng nữa thì chương trình thoát khỏi vòng lặp. Chú ý khi sử dụng vòng lặp for là các biểu thức trong cấu trúc for có thể không có nhưng các dấu “;” thì bắt buộc phải có. Hàm (functions): Trong C có rất nhiều hàm, mỗi hàm dùng để thực hiện một chức năng cụ thể. Các hàm trong C thường được thiết kế nhỏ gọn, để có những hàm phức tạp người dùng cần tự tạo ra. Các từ khóa (key words): Từ khóa là những từ quy định của ngôn ngữ C như tên các kiểu dữ liệu (char, int, unsigned int, …); tên các cấu trúc điều khiển (if, while, for,…). Cần chú ý không được đặt tên biến trùng với từ khóa. Các kiểu dữ liệu thường dùng khi lập trình C cho vi điều khiển: Tên kiểu dữ liệu Số byte Khoảng dữ liệu Char 1 - 127 đến 127 hoặc 0 đến 255 Unsigned char 1 0 đến 255 Signed char 1 - 127 đến 127 Int 2 - 32767 đến 32767 Unsigned int 2 0 đến 65353 Singed int 2 - 32767 đến 32767 Short int 2 - 32767 đến 32767 Unsigned short int 2 0 đến 65353 Singed short int 2 - 32767 đến 32767 Long int 4 - 2147483647 đến 2147483647 Unsigned long int 4 0 đến 4294967295 Singed long int 4 - 2147483647 đến 2147483647 Long long int 8 - (2^63 – 1) đến (2^63 – 1) Unsigned long long int 8 0 đến (2^64 – 1 ) Signed long long int 8 - (2^63 – 1) đến (2^63 – 1) 4, Phần mềm Win AVR Win AVR là một bộ phần mềm mã nguồn mở bao gồm các công cụ cho dòng vi điều khiển AVR. Win AVR chạy trên hệ điều hành Windows, nó bao gồm các công cụ sau: -, Trình biên dịch avr-gcc :GNU GNC là trình biên dịch C .C++ phát tiển bởi cộng đồng mã nguồn mở GNU ,AVR-gcc phát triển riêng cho AVR . -, Chương trình nạp chip AVRdude . -, Chương trình gỡ lỗi AVR-gdb -, Programmer Notepad : Trình biên dịch code hỗ trợ nhiều ngôn ngữ C, C++,CSS,JAVA… -,Mfile: tiện ích tạo các file Makefile dùng trong quá trình biên dịch code. Cốt lõi của Win AVR là trình biên dịch GNU-GCC và thư viện avr-libc đây là bộ công cụ lập trình C miễn phí duy nhất cho AVR . Có thể nói bộ công cụ này góp phần không nhỏ giúp cho giúp cho chip AVR ngày càng trở lên phổ biến .Win AVR liên tục được cập nhật và hoàn thiện bởi rất nhiều người ,nguồn tài liệu và chương trình viết mẫu bằng công cụ này là rất lớn… Chương 3. Thiết kế hệ thống đo nhiệt độ sử dụng LM335

Các file đính kèm theo tài liệu này:

  • docxThiết kế hệ thống đo nhiệt độ sử dụng LM335.docx