TỔNG LIÊN ĐOÀN LAO ĐỘNG VIỆT NAM TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG KHOA ĐIỆN- ĐIỆN TỬ ĐỒ ÁN TỐT NGHIỆP ĐIỀU KHIỂN NHIỆT ĐỘ DÙNG GIẢI THUẬT PID GVHD : ThS HOÀNG TRUNG HIẾU SVTH : BÙI VẠN ĐƯỜNG LỚP : 06DD3N KHĨA : 06 TP Hồ Chí Minh, tháng năm 2009 LỜI CẢM ƠN Em xin chân thành cảm ơn tất thầy cô trường, thầy cô khoa Điện-Điện tử, thầy cô môn Điều khiển tự động giảng dạy truyền đạt cho em kiến thức quý báu năm qua suốt trình thực luận văn Em xin chân thành cảm ơn thầy giáo hướng dẫn Th.S Hoàng Trung Hiếu hướng dẫn em thời gian làm luận văn Em chân thành cảm ơn hỗ trợ, đóng góp ý kiến chân thành bạn sinh viên khóa Mặc dù cố gắng nhiều lần làm luận văn, thời gian cịn hạn chế lực có giới hạn nên khơng tránh thiếu xót định, em kính mong thầy thơng cảm bỏ qua dạy Em xin chân thành cảm ơn đóng góp ý kiến chun mơn để khả kỹ thuật em mở rộng Sinh viên thực Bùi Vạn Đường Tháng năm 2009 NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN TP.HCM, ngày …… tháng … năm 2009 NHẬN XÉT CỦA CƠ QUAN THỰC TẬP TP.HCM, ngày …… tháng … năm 2009 NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN TP.HCM, ngày …… tháng … năm 2009 MỤC LỤC LỜI CẢM ƠN 2 NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN 3 NHẬN XÉT CỦA CƠ QUAN THỰC TẬP 4 NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN 5 MỤC LỤC 6 LỜI MỞ ĐẦU 10 PHẦN 1: CƠ SỞ LÝ THUYẾT 11 CHƯƠNG 1: TÌM HIỂU VỀ NHIỆT ĐỘ VÀ HỆ THỐNG NHIỆT 11 NHIỆT ĐỘ VÀ CÁC THANG ĐO NHIỆT ĐỘ 11 ĐO NHIỆT ĐỘ 12 2.1 Hệ thống đo lường: 12 2.1.1Giới thiệu : 12 2.1.2Hệ thống đo lường số: 13 2.2Các phương pháp đo nhiệt độ: 13 3.TÌM HIỂU HỆ THỐNG NHIỆT 14 CHƯƠNG 2:TÌM HIỂU VỀ CẢM BIẾN VÀ PHƯƠNG PHÁP CÂN CHỈNH 15 CÁC LOẠI CẢM BIẾN HIỆN TẠI 15 2.1 Thermocoup: 15 2.2 RTD (Resistance Temperature Detector): 15 2.3 Thermistor: 15 2.4 IC cảm biến: 16 2.5 Một số nhiệt độ chuẩn: 16 Cảm biến nhiệt độ LM 335: 17 3.1Sơ đồ bên vi mạch LM 335: 17 3.2Các đặc tính vi mạch LM 335: 18 3.3 Tính tốn cân chỉnh: 19 CHƯƠNG 3: LÝ THUYẾT VỀ CÁC LINH KIỆN ĐIỆN TỬ 23 MÀN HÌNH TINH THỂ LỎNG LCD 23 SƠ ĐỒ CẤU TRÚC 24 CHIẾU SÁNG TRONG BỘ HIỂN THỊ LCD 24 HÌNH DÁNG VÀ KÍCH THƯỚC CỦA LCD 25 4.1 Sơ đồ chân: 25 4.2 Các chân LCD: 25 4.3 Chức chân ra: 26 4.4 Tập lệnh LCD 27 4.5 Các bit chức điều khiển 29 5.1.1 Bộ nhớ liệu : 31 5.1.2 Bộ nhớ chương trình: 32 5.2 Các chế độ truy nhập địa AVR: 33 5.4 RAM: 38 5.5 Bộ tạo dao động: 39 5.6 Mạch khởi động lại mạch phát sụt điện áp nguồn nuôi thấp: 39 5.7 Cổng nối tiếp: 39 5.8 Cổng vào/ra số: 39 5.9 Cổng vào/ra tương tự: 40 5.11Bộ định thời watchdog WDT(Watchdog Timer): 40 5.12 RTC( Real Time Clock): 40 6.SỬ DỤNG TIMER 40 6.1.Đặc tính: 41 6.2 Các chế độ hoạt động cưa Timer: 41 6.2.1 Chế độ thông thường: 41 6.2.2 Chế độ so sánh (CTC): 41 6.2.3Chế độ Fast PWM: 41 6.2.4Chế độ Phase Correct PWM: 42 HOẠT ĐỘNG CỦA CÁC BỘ PHẬN TRÊN AVR 42 7.1 Bộ nhớ EEPROM: 42 7.2 Bộ nhớ SRAM: 43 7.3 Các cổng vào (I/O): 43 7.4 Bộ truyền nhận UART: 43 7.5 Bộ so sánh Analog: 43 7.6 Bộ biến đổi tương tự sang số (ADC): 43 7.7 Bộ định thời Watchdog: 43 7.8 Hoạt động điều chế độ rộng xung PWM: 43 7.9 Cấu trúc ngắt: 44 7.10.Chế độ tiết kiệm lượng: 44 CHƯƠNG 4: CÁC PHƯƠNG PHÁP ĐIỀU KHIỂN NHIỆT ĐỘ 45 PID TRONG HỆ THỐNG ĐIỀU KHIỂN NHIỆT ĐỘ 45 4.1.Các phương pháp điều khiển: 45 4.1.1.Điều khiển On –Off: 45 4.1.2 Điểu khiển khâu tỷ lệ ( P): 46 4.1.3 Điều khiển khâu vi phân tỷ lệ ( PD): 46 4.1.4 Bộ điều khiển khâu tích phân – tỷ lệ (PI): 47 4.1.5 Điều khiển khâu vi phân – tích phân – tỷ lệ ( PID ): 47 PHẦN : THIẾT KẾ PHẦN CỨNG 55 CHƯƠNG TRÌNH VÀ LƯU ĐỒ GIẢI THUẬT 55 DANH MỤC CÁC BẢNG BIỂU Bảng 2.5 Một số nhiệt độ chuẩn 17 Bảng 3.3: Các giá trị thông số tương ứng 22 Bảng 4.3 Chức chân LCD 26 Bảng 4.4 Tập lệnh LCD 28 Bảng 4.5 Các bit chức điều khiển 29 Bảng 4.6 Bảng ký tự chuẩn LCD 30 Bảng 4.7 Bảng vector ngắt 33 Bảng 4.8 Chọn thông số điều khiển P, PI, PID cách 53 Bảng 4.9 Chọn thông số điều khiển P, PI, PID cách 54 DANH MỤC CÁC HÌNH VẼ Hình 2.1.1 Hệ thống đo lường 12 Hình Hệ thống điều khiển nhiệt độ 14 Hình 3.1.1 Sơ đồ cấu trúc bên LM 335 17 Bảng 3.1.3 Dãy nhiệt độ LM 335 18 Hình 3.1.4 Sơ đồ chân LM 335 18 Hình 3.5 Đồ thị nhiệt độ điện áp LM 335 19 Hình 3.6 Màn hình LCD 23 Hình 3.7 Sơ đồ cấu trúc LCD 24 Hình 3.8 Sơ đồ chân LCD 25 Hình 3.9 x dot character set 26 Hình 3.10 Cấu trúc nhớ 31 Hình 3.11 Bộ nhớ liệu 32 Hình 3.12 Truy nhập địa ghi đơn trực tiếp 33 Hình 3.13 Truy nhập địa hai ghi trực tiếp 33 Hình 3.15 Truy nhập trực tiếp liệu 34 Hình 3.16 Truy nhập địa liệu gián tiếp với dịch chuyển 35 Hình 3.17 Truy nhập địa gián tiếp liệu 35 Hình 3.18 Truy nhập địa liệu gián tiếp với tang giảm trỏ 35 Hình 3.19 Truy nhập địa số nhớ chương trình 36 Hình 3.20 Truy nhập địa nhớ chương trình 36 Hình 3.21 Truy nhập địa tương đối nhớ chương trình 37 Hình 4.1 Đồ thị mô điều khiển On- Off 45 Hình 4.2 Đồ thị mơ điều khiển khâu tỷ lệ 46 Hình 4.3 Đồ thị mơ điều khiển khâu vi phân tỷ lệ 47 Hình 4.4 Đồ thị mơ điều khiển khâu vi phân- tích phân-tỷ lệ 48 Hình 4.5 Ngõ điều khiển tỷ lệ 49 LỜI MỞ ĐẦU Như biết, nhiệt độ môt thành phần vật lý quan trọng Việc thay đổi nhiệt độ vật chất ảnh hưởng nhiều đến cấu tạo, tính chất đại lượng vật lý khác vật chất Ví dụ, thay đổi nhiệt độ chất khí làm thay đổi thể tích, áp suất chất khí bình Vì vậy, nghiên cứu khoa học, công nghiệp đời sống sinh hoạt, thu thập thông số điều khiển nhiệt độ điều cần thiết Trong nhiều lĩnh vực sản xuất công nghiệp nay, ngành công nghiệp luyện kim, chế biến thực phẩm …thì vấn đề đo điều khiển nhiệt độ đặt biệt quan trọng yếu tố định đến chất lượng sản phẩm Trong lò nhiệt, máy điều hòa, máy lạnh hay lị viba, điều khiển nhiệt độ tính chất định cho sản phẩm Trong ngành luyện kim, cần phải đạt đến nhiệt độ để kim loại nóng chảy cần đạt nhiệt độ để ủ kim loại nhằm đạt tốt đặc tính học độ bền, độ dẻo, độ chống gỉ sét… Trong ngành thực phẩm, cần trì nhiệt độ để nướng bánh, để nấu để bảo quản…Việc thay đổi thất thường nhiệt độ không gây hư hại đến thiết bị hoạt động, cịn ảnh hưởng đến q trình sản xuất, sản phẩm Có nhiều phương pháp để điều khiển lị nhiệt độ, phương pháp điều mang đến kết khác thông qua phương pháp điều khiển khác Trong nội dung luận văn em dùng phương pháp điều khiển nhiệt độ dùng giải thuật PID làm đề tài tốt nghiệp cho Những kiến thức lực đạt trình học tập trường dược đánh giá qua đợt bảo vệ luận văn cuối khóa Vì em cố gắng tận dụng tất kiến thức học trường với tìm tịi nghiên cứu để hoàn thành tốt luận văn Những sản phẩm kết đạt ngày hơm khơng có lớn lao, thành năm học tập, thành công em trước trường Mặc dù em cố gắng để hồn thành luận văn thời hạn khơng thể tránh thiếu sót, mong q thầy thơng cảm Em đón nhận ý kiến đóng góp từ phía thầy cơ.Cuối em xin chân thành cảm ơn quý thầy cô bạn sinh viên khóa 10 thời gian xác lập, tăng tốc độ đáp ứng hệ thống, giảm sai số xác lập, giảm độ vọt lố… 4.1.5.1Điều khiển PID liên tục: Điều khiển PID cấu trúc điều khiển thông dụng quy trình điều khiển Đầu điều khiển tổng thành phần : Thành phần thứ up(t) tỷ lệ sai số đầu hệ thống thực với giá trị tham chiếu ( giá trị đặt) Thành phần thứ hai ui(t) tích phân theo thời gian sai số Thành phần thứ ba uD(t) đạo hàm sai số theo thời gian Hàm điều khiển: ∫ ] u (t) = uo + K[ e(t) + 1/Ti e(τ)dτ + Td *de(τ)/ dτ = uo + up(t) + ui(t) + uD(t) Trong K độ lợi, Ti hệ số khâu tích phân sai số, Td hệ số khâu đạo hàm τ biến tích phân Giá trị uo giá trị xác định trị trung bình biên độ tín hiệu xác thực Một vài quy trình điều khiển đặc biệt quy trình cũ có khoảng tỷ lệ đặt thay độ lợi điều khiển Khoảng tỷ lệ xác định PB = 100/K, định nghĩa áp dụng K khơng có thứ nguyên Công thức hàm điều khiển không giới hạn thực tế đầu Điều khiển đạt trạng thái bão hòa ngõ đạt tới giới hạn vật lý umax umin Trong thực tế, ngõ điều khiển tỷ lệ sau: up umax Độ dốc K umin Hình 4.5 Ngõ điều khiển tỷ lệ Phần tích phân hàm điều khiển dùng để khử sai số trạng thái ổn định Chức giải thích trực giác sau: Giả sử hệ thống trạng thái ổn định tất tín hiệu số, đặc biệt e(t) Trạng 49 thái ổn định trì phần tích phân ui(t) số, mặt khác u(t) thay đổi Điều xảy e(t) khơng Hàm điều khiển biểu diễn theo phép biến Laplace sau: U(s) – Uo(s) = δU(s) + UI (s) + UD(s) U(s) – Uo(s) = K[1+1/TIS + TdS]E(s) = K(1+ T1s + T1Td s*s)E(s)/T1s Bậc tỷ số nhỏ bậc mẫu số độ lợi hàm điều khiển tiến vô tần số cao Đây hệ giới hạn đạo hàm Trong thực tế đạo hàm khó đạt xác, coi cách gần hệ thống bậc với số thời gian Tf δU(s) = UP(s) +UI(s) +UD(s) = [1+ 1/TIs + Tds/(1+Tfs)]E(s) Tf = Td/N với N = 5÷10 Độ lợi phần đạo hàm điều khiển có giới hạn KN tần số cao Hàm PID viết lại sau: T1s(1+Tfs)δU(s) = K[T1s(1+Tfs)+ 1+Tfs+T1Tfs*s]E(s) Đây trường hợp đặt biệt điều khiển thông thường Chia cho T1Tf, PID viết lại sau: R(s) = s*s + s/Tf R(s) = T(s) = K[1+Td/Tf]s*s+ K[1/Tf + 1/T1]*s+ K/T1Tf Đặt tính giới hạn điều khiển PID: điều khiển PID áp dụng thành cơng hầu hết tiến trình điều khiển Thời trễ: Thời trễ xảy thực tế Thời trễ làm chậm trình điều khiển truyền tới điều khiển tới điều khiển trễ so với mong muốn, thơng tin bị ý nghĩa Thời trễ giới hạn đặc tính hệ thống, hệ thống có thời trễ điều khiển PID thường hoạt động chậm 4.1.5.2 Điều khiển PID rời rạc: Đối với hệ thống số, điều khiển liên tục rời rạc dạng số, cho hệ số lấy mẫu ngắn bên trong,vi phân xấp xỉ sai phân có giới hạn tích phân xấp xỉ với việc lấy tổng Bộ điều khiển số tiến hành lấy mẫu sau khoảng thời gian gọi chu kỳ lấy mẫu Mỗi mẫu chuyển thành giá trị nhị phân để đưa vào điều khiển ( vi xử lý máy tính) Bộ điều khiển tính tốn sai số vị trí theo cơng thức sau: e1 = sp – c1 e2 = sp – c2 ………… en = sp – cn Trong đó: ei : sai số vị trí thứ i sp : vị trí đặt ci : mẫu thứ i 50 en : sai số vị trí Sauk hi tính tốn sai số vị trí, điều khiển tính tốn giá trị ngõ dựa phương trình PID số sai số vị trí có: un = Kpen + KI ∆t ∑ej + KD* ∆en/∆t Trong : un : vị trí K : độ lợi en : sai số vị trí ∆t : chu kỳ lấy mẫu ∆en = en – en-1: độ thay đổi sai số Sự hiệu chỉnh thực tế điều khiển: Một chu kỳ lấy mẫu dài ảng hưởng đến việc điều khiển hồi tiếp bị nhiễu Một trường hợp đặt biệt chu kỳ lấy mẫu lâu thời gian đáp ứng trình ảnh hưởng đến q trình xử lý trước điều khiển nhận hoạt động xác Vì điều quan trọng quan tâm đến động học đặc tính nhiễu ảnh hưởng đến lựa chọn chu kỳ lấy mẫu Trong việc sử lý tín hiệu, mục đích lấy mẫu tín hiệu phục hồi từ dạng thời gian rời rạc Lý thuyết lấy mẫu khơng xem thời gian tính tốn mối quan tâm để làm cấu trúc lại thời gian, tín hiệu lấy mẫu thời gian lâu Nói them ta giả sử tín hiệu chu kỳ hóa Trong ứng dụng điều khiển tín hiệu thường khơng theo chu kỳ thời gian tính tốn cho việc cấu trúc lại tín hiệu bị giới hạn 4.1.5.3Chức cụ thể thành phần PID: * Khâu hiệu chỉnh khuếch đại tỷ lệ (P): Được đưa vào hệ thống nhằm làm giảm sai số xác lập, với đầu vào thay đổi theo hàm nấc gây vọt lố cao, vị trí khơng theo u cầu Đây điều khiển mà biến đặt tỷ lệ với độ lệch từ điểm đặt bên dãy tỉ lệ cho phạm vi vị trí đặt * Khâu điều khiển vi phân D (hoạt động đạo hàm): Được đòi hỏi phải bù, thực với biến đặt tỷ lệ Tỉ số thời gian (rate time): số biểu diễn độ dài trình hoạt động Đây thời gian đòi hỏi biến đặt tỉ số hoạt động giống biến đặt hoạt động hiệu chỉnh xảy thay đổi độ dốc độ lệch Tùy theo tỉ số thời gian dài hơn, vi phân linh hoạt * Khâu tich phân I : 51 Điều khiển hoạt động I: độ lệch tăng tương quan vị trí đặt hệ điều khiển vị trí tại, giữ sau hệ thống điều khiển đạt trạng thái bền Sự lệch gọi sai số Nếu sai số xảy điều khiển mà thực điều khiển tỉ lệ, thiếu xác Giảm loại sai số để vị trí điều khiển hợp với điểm đặt Khâu P thường dùng để kết hợp với điều khiển tích phân 4.1.5.4Cách tính thơng số KP, KI, KD: Nhìn chung việc điều khiển đối tượng thuật tốn PID động cơ, lị nhiệt…Thì ngồi phương pháp khử sai khơng cịn phương pháp khác để xác định thơng số PID Nghĩa ta chọn giá trị thơng số cho hệ thống chạy thử, thay đổi thông số theo chiều hướng cho hệ ổn định đạt chất lượng mong muốn, đến ta chọn thông số tối ưu việc chọn thơng số PID chấm dứt Tuy nhiên, để q trình chọn thơng số PID trở nên đơn giản ta dùng phương pháp Ziegler- Nichol để tính thơng số PID từ hàm truyền đối tượng, lấy thông số để thử cho hệ thống, thay đổi vài lần giá trị gần với thông số ta hệ thống tối ưu Bộ điều khiển PID sử dụng rộng rãi thực tế để điều khiển đối tượng khác lò nhiệt, tốc độ động v v Do có khả làm giảm sai số xác lập, tăng tốc độ đáp ứng độ, giảm độ vọt lố thông số điều khiển lựa chọn thích hợp Trong thực tế có nhiều phương pháp để thiết kế điều khiển PID như: dùng quỹ đạo nghiệm số (QDNS), dùng biểu đồ Bode, hay phương pháp giải tích khó khăn việc xây dựng hàm truyền đối tượng Phương pháp phổ biến để chọn thông số cho điều khiển phương pháp Zeigler- Nichols 4.1.5.5 Phương pháp Neigler – Nichols: Phương pháp Zeigler – Nichols phương pháp thực nghiệm để thiết kế điều khiển P, PI, PID cách dựa vào đáp ứng độ đối tượng điều khiển Bộ điều khiển PID cần thiết có hàm truyền là: Gc(s) = Kp + KI/s + KD*s = Kp(1+ 1/Ti*s + TD*s) Zeigler Nichols đưa hai cách chọn thông số điều khiển PID tùy theo đặc điểm đối tượng Cách 1: Dựa vào đáp ứng độ hệ hở, áp dụng cho đối tượng có đáp ứng tín hiệu vào hàm nấc có dạng chữ S nhiệt độ lò nhiệt, tốc độ động cơ,… 52 Đối tượng r(t) c(t) Hình 4.6 Đáp ứng nấc hệ hở có dạng S Thơng số điều khiển P,PI,PID chọn sau: TI Bộ ĐK thông số KP P T2/(T1.K) ∞ PI 0.9T2/(T1.K) T1/0.3 PID 1.2T2/(T1.K) 2T1 TD 0 0.5T1 Bảng 4.8 Chọn thông số điều khiển P, PI, PID cách Cách 2: Dựa vào đáp ứng độ hệ kín, áp dụng cho đối tượng có khâu tích phân lý tưởng , ví dụ mực chất lỏng bồn chứa, vị trí hệ truyền dùng động cơ, Đáp ứng độ ( hệ hở ) đối tượng có khâu tích phân lý tưởng khơng có dạng cách mà tăng đến vô Đối với đối tượng thuộc loại ta chọn thông số điều khiển PID dựa vào đáp ứng độ hệ kín Tăng dần hệ số khuếch đại K hệ kín đến giá trị giới hạn Kgh, đáp ứng hệ kín trạng thái xác lập dao động ổn định với chu kỳ Tgh r(t) K Đối tượng +/- 53 Thông số điều khiển P, PI, PID chọn sau: TI TD Bộ ĐK thông số KP P 0.5Kgh ∞ PI 0.45Kgh 0.83Tgh PID 0.6Kgh 0.5Tgh 0.125Tgh Bảng 4.9 Chọn thông số điều khiển P, PI, PID cách 54 PHẦN : THIẾT KẾ PHẦN CỨNG CHƯƠNG TRÌNH VÀ LƯU ĐỒ GIẢI THUẬT LƯU ĐỒ GIẢI THUẬT START Thiết lập I/O Hiển thị LCD UP = Yes Tăng Set_point No No Down= Yes Giảm Set_ Point Đọc nhiệt độ No ĐO >= Đặt Yes Mở lò Tắt lò END 55 CHƯƠNG TRÌNH CHÍNH /***************************************************** This program was produced by the CodeWizardAVR V1.24.2c Standard Automatic Program Generator © Copyright 1998-2004 Pavel Haiduc, HP InfoTech s.r.l http://www.hpinfotech.ro e-mail:office@hpinfotech.ro Project : Version : Date : 5/26/2009 Author : DUONG Company : Comments: Chip type : ATmega8 Program type : Application Clock frequency : 8.000000 MHz Memory model : Small External SRAM size : Data Stack size : 256 /*****************************************************/ #include #include #include #include #include /*****************************************************/ // Declare your global variables here char lcd_buffer[16]; long int nhietdodo,saisoxaclap,nhietdodat; char scan_key_flag = 1; long int count = 0; long int temperature; char read_temperature_flag = 0; char i=0; eeprom int set_point=40; #define UP_BUTTON_ON PINC.3==0 56 #define UP_BUTTON_OFF PINC.3==1 #define DOWN_BUTTON_ON #define DOWN_BUTTON_OFF PINC.5==0 PINC.5==1 #define RIGHT_BUTTON_ON #define RIGHT_BUTTON_OFF PINC.2==0 PINC.2==1 #define LEFT_BUTTON_ON #define LEFT_BUTTON_OFF PINC.4==0 PINC.4==1 #define BUZZER_ON #define BUZZER_OFF PORTB.2 = PORTB.2 = #define OUTPUT_ON #define OUTPUT_OFF PORTB.1 = PORTB.1 = #define READ_TEMPERATURE read_adc(1) #define T_BZZR_ON #define T_BZZR_OFF delay_ms(30) delay_ms(100) #define XY lcd_gotoxy #define STRING lcd_putsf #define CHAR lcd_putchar #define CLRSCR lcd_clear() #define POSITIVE #define NEGATIVE #define T_CYCLE 100 /*****************************************************/ /*****************************************************/ // Alphanumeric LCD Module functions #asm equ lcd_port=0x12 ;PORTD #endasm #include /*****************************************************/ #define ADC_VREF_TYPE 0x00 // Read the AD conversion result 57 long int read_adc(unsigned char adc_input) { ADMUX=adc_input|ADC_VREF_TYPE; // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } /*****************************************************/ // Timer overflow interrupt service routine interrupt [TIM1_OVF] void timer1_ovf_isr(void) { // Reinitialize Timer value TCNT1H=0x04; TCNT1L=0xE2; // Place your code here count++; if(count==1) { temperature = READ_TEMPERATURE; count = 0; read_temperature_flag = 1; } }// END INT /*****************************************************/ void bintobcd(long int value,char x,char y) { long int temp[2]; char sign; if(value>=0) sign = POSITIVE; else { sign = NEGATIVE;value = value*(-1); } temp[0] = value/10; temp[1] = value%10; if(sign==POSITIVE) sprintf(lcd_buffer,"%u ",temp[0]); if(sign==NEGATIVE) sprintf(lcd_buffer,"-%u",temp[0]); XY(x,y); lcd_puts(lcd_buffer); } void main(void) { // Declare your local variables here 58 // Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=In // State7=T State6=T State5=T State4=T State3=T State2=0 State1=1 State0=T PORTB=0x02; DDRB=0x06; // Port C initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State6=T State5=P State4=P State3=P State2=P State1=T State0=T PORTC=0x3C; DDRC=0x00; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0x00; // Timer/Counter initialization // Clock source: System Clock // Clock value: Timer Stopped TCCR0=0x00; TCNT0=0x00; // Timer/Counter initialization // Clock source: System Clock // Clock value: 125.000 kHz // Mode: Normal top=FFFFh // OC1A output: Discon // OC1B output: Discon // Noise Canceler: Off // Input Capture on Falling Edge TCCR1A=0x00; TCCR1B=0x03; TCNT1H=0x04; TCNT1L=0xE2; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; 59 OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter initialization // Clock source: System Clock // Clock value: Timer Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x04; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off // Analog Comparator Output: Off ACSR=0x80; SFIOR=0x00; // ADC initialization // ADC Clock frequency: 125.000 kHz // ADC Voltage Reference: AREF pin // ADC High Speed Mode: Off ADMUX=ADC_VREF_TYPE; ADCSRA=0x86; SFIOR&=0xEF; // LCD module initialization lcd_init(16); // Global enable interrupts #asm("sei") BUZZER_ON;T_BZZR_ON;BUZZER_OFF;T_BZZR_OFF; BUZZER_ON;T_BZZR_ON;BUZZER_OFF;T_BZZR_OFF; 60 BUZZER_ON;T_BZZR_ON;BUZZER_OFF;T_BZZR_OFF; OUTPUT_OFF; while (1) { /*****************************************************/ delay_ms(200); _lcd_ready(); _lcd_write_data(0x0F); nhietdodat = set_point*10; if(read_temperature_flag==1) { read_temperature_flag = 0; nhietdodo = (temperature-559)*5000/1023; saisoxaclap = nhietdodat-nhietdodo; XY(0,0);STRING("DO:");bintobcd(nhietdodo,3,0); XY(8,0);STRING("DAT:");bintobcd(nhietdodat,12,0); XY(0,1);STRING("XL:"); bintobcd(saisoxaclap,3,1); XY(8,1);STRING("VL:"); count = 0; } XY(12,0); if(UP_BUTTON_ON) { set_point++; BUZZER_ON;T_BZZR_ON;BUZZER_OFF; delay_ms(200); } if(DOWN_BUTTON_ON) { if(set_point==0) set_point = 0; else set_point ; BUZZER_ON;T_BZZR_ON;BUZZER_OFF; delay_ms(200); } if(RIGHT_BUTTON_ON) { BUZZER_ON;T_BZZR_ON;BUZZER_OFF; delay_ms(200); } if(LEFT_BUTTON_ON) { BUZZER_ON;T_BZZR_ON;BUZZER_OFF; 61 delay_ms(200); } /*************************MAIN PROGRAM*************************/ count=0; nhietdodo = 0; for(i=0;i