Đo và điều khiển nhiệt độ phòng

129 151 1
Đo và điều khiển nhiệt độ phòng

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Đo Và Điều Khiển Nhiệt Độ Phòng GVHD: Tô Hoàng Lộc 11.1 Sơ lược vi điều khiển PIC16F877A: PIC 16F877A dòng PIC phổ biến (đủ mạnh tính năng, 40 chân, nhớ đủ cho hầu hết ứng dụng thông thường) Cấu trúc tổng quát PIC 16F877A sau: - K Flash ROM - 368 Bytes RAM - 256 Bytes EEPROM - ports (A, B, C, D, E) vào với tín hiệu điều khiển độc lập - định thời bits (Timer Timer 2) - Một định thời 16 bits (Timer 1) hoạt động chế độ tiết kiệm lượng (SLEEP MODE) với nguồn xung Clock - bô CCP( Capture / Compare / PWM) - biến đổi AD 10 bits, ngõ vào - so sánh tương tự (Compartor) - định thời giám sát (WatchDog Timer) 10 - Một cổng song song bits với tín hiệu điều khiển 11 - Một cổng nối tiếp 12 - 15 nguồn ngắt 13 - Có chế độ tiết kiệm lượng 14 - Nạp chương trình cổng nối tiếp ICSP(In-Circuit Serial Programming) 15 - Được chế tạo công nghệ CMOS 16 - 35 tập lệnh có độ dài 14 bits 17 - Tần số hoạt động tối đa 20MHz -1- SVTH : Lê Văn Thực Đo Và Điều Khiển Nhiệt Độ Phòng GVHD: Tô Hoàng Lộc 18 Sơ đồ chân PIC 16f877A -2- SVTH : Lê Văn Thực Đo Và Điều Khiển Nhiệt Độ Phòng GVHD: Tô Hoàng Lộc PIC16F877A họ vi điều khiển có 40 chân, chân có chức khác nhau.Trong có số chân đa công dụng: chân hoạt động đường xuất nhập chân chức đặc biệt dùng để giao tiếp với thiết bị ngoại vi Sơ Đồ Khối PIC -5- SVTH : Lê Văn Thực Đo Và Điều Khiển Nhiệt Độ Phòng GVHD: Tô Hoàng Lộc 1.2 Một số điểm đặc biệt CPU: 1.2.1 Dao động: PIC16F877A hoạt động bốn chế độ dao động khác nhau: Trong chế độ LP, XT HS sử dụng thạch anh dao động nối vào chân OSC1 OSC2 để tạo dao động Việc lựa chọn tụ dao động thạch anh dựa vào bảng sau: Lưu ý: Tụ có giá trị lớn tăng tính ổn định dao động làm tăng thời gian khởi động Chế độ dao động RC sử dụng giải pháp tiết kiệm ứng dụng không cần xác thời gian * Cách tính chu kì máy: Ví dụ ta sử dụng thạch anh 10Mhz Khi đó: -6- SVTH : Lê Văn Thực Đo Và Điều Khiển Nhiệt Độ Phòng GVHD: Tô Hoàng Lộc Tần số dao động thạch anh Fosc = 10Mhz →ChukỳdaođộngcủathạchanhlàTosc=1/Tosc=1/10*106 (s) Chu kỳ máy: T_instruction = 4*Tosc = 4/10*106(s) = 0.4 µs = 400 ns 1.3.2 Reset: PIC16F877A bị reset nhiều nguyên nhân khác như: 1.2.2 : MCRL PIC16F877A có lọc nhiễu phần Bộ lọc nhiễu phát bỏ qua tín hiệu nhiễu Ngõ vào chân PIC16F877A Khi đưa chân xuống thấp ghi bên VĐK tải giá trị thích hợp để khởi động lại hệ thống (Lưu ý: Reset WDT không làm chân xuống mức thấp) -7- SVTH : Lê Văn Thực Đo Và Điều Khiển Nhiệt Độ Phòng GVHD: Tô Hoàng Lộc -8- SVTH : Lê Văn Thực 1.2.3 INTERRUPTS: PIC16F877A có nhiều nguồn ngắt khác Đây số ngắt tiêu biểu : 1- Ngắt xảy chân INT 2- Ngắt Timer0 3- Ngắt Timer1 4- Ngắt Timer2 5- Ngắt thay đổi trạng thái chân PortB 6- Ngắt so sánh điện 7- Ngắt Port song song 8- Ngắt USART 9- Ngắt nhận liệu 10- Ngắt truyền liệu 11- Ngắt chuyển đổi ADC 12- Ngắt hình LCD 13- Ngắt hoàn tất ghi EEPROM 14- Ngắt module CCP 15- Ngắt Module SSP * Các ghi chức ngắt: INTCON, PIE1, PIR1, PIE2, PIR2 (các ghi nghiên cứu phần sau) 1.2.4 Chế độ nguồn thấp Sleep (Power down Mode) : Đây chế độ hoạt động VĐK lệnh sleep thực thi Khi cho phép hoạt động, đếm WDT bị xóa WDT tiếp tục hoạt động bit PD (STATUS ) reset không, bit TO set, oscillator ngưng hoạt động PORT giữ nguyên trạng thái trước lệnh sleep thực thi Do chế độ sleep dòng cung cấp cho VĐK nhỏ nên ta cần thực bước sau trước VĐK thực thi lệnh sleep 1• Đưa tất chân trạng thái VDD VSS 2• Cần đảm bảo mạch ngoại vi điều khiển dòng điện VĐK dòng điện nhỏ không đủ khả cung cấp cho mạch ngoại vi hoạt động 3• Tạm ngưng hoạt động khối A/D không cho phép xung clock bên tác dụng vào VĐK 4• Để ý chức điện trở kéo lên PORTB 5• Pin phải mức logic cao 1.2.5 Bộ định thời giám sát (Watch Dog Timer -WDT): Giả sử bạn viết chương trình, bạn mong đợi chương trình chạy trục trặc xảy không dừng lại, bạn phải làm vòng lặp để chương trình chạy đến điểm cuối lại quay trở điểm bắt đầu Nhưng mà xem trường hợp: Giả sử chương trình kiểm tra chân input, lên mức cao Pic tiếp tục kiểm tra chân input thứ hai có lên mức cao hay không, chân input thứ hai không lên mức cao, Pic ngồi chờ thoát khỏi chỗ ngồi chân input thứ hai lên mức cao Bây xem trường hợp khác, giả sử bạn viết chương trình, bạn compiled thành công, bạn cho chạy mô bước, bước máy tính, MPLAB chẳng hạn, chuyện tốt, bạn đem nạp vào Pic Sau thời gian chạy thử, Pic bị kẹt vào nơi chương trình mà thoát trạng thái Điều cần thiết để giải hai trường hợp trên, reset lại hay bị kẹt không thoát được, mục đích mạch Watchdog Mạch Watchdog mẽ gì, có nhiều microprocessors microcontrollers có mạch Watchdog, mà làm việc ? Bên Pic có mạch RC, mạch cung cấp xung Clock độc lập với xung Clock cung cấp cho Pic Khi Watchdog Timer (viết tắt WDT) cho phép (enabled), đếm 00 tăng lên FFh, tăng từ FFh đến 00 ( FFh+1) Pic bị Reset làm gì, có cách ngăn không cho WDT đếm tới 00 Khi Pic bị kẹt thoát khỏi tình trạng WDT tiếp tục đếm mà không bị điều ngăn cấm đếm tới FF đến FF+1, reset Pic làm cho chương trình phải khởi động lại từ đầu Để sử dụng WDT cần làm việc 1• Thứ nhất, cần thời gian để reset WDT ? 2• Thứ hai, xoá WDT ? 3• Cuối cùng, phải nói cho Pic biết chương trình cho phép WDT hoạt động 2.6 Tổ chức nhớ: PIC16F877A có tất khối nhớ riêng biệt bao gồm: Bộ nhớ chương trình, nhớ liệu nhớ EEPROM 1.2.6.1 Bộ nhớ chương trình: PIC16F877A có đếm chương trình dài 13 bits định địa cho khoảng không gian nhớ 8K x 14bits Không gian nhớ chia làm trang, có địa từ 0005h đến 1FFFh Mọi truy cập vùng không gian nhớ tác dụng Ngoài ra, nhớ chương trình bao gồm ngăn xếp (Stack) mức Vector Reset đặt địa 0000h vector ngắt đặt địa 0004h B portD=so[dv];b5=0;b4=1; Tạo Trễ 2ms b5=1 Trở Về 5.2.1.5 LƯU ĐỒ GIẢI THUẬT CHCHƯƠNG TRÌNH NGẮT NHẬN NỐI TIẾP Lưu đồ giải thuật chương trình ngắt nhận : Bắt đầu nhận liệu sai nhận byte thứ Lưu vào số hàng trăm sai nhận byte thứ hai Lưu vào số hàng chục sai nhận byte thứ ba Lưu vào số hàng đơn vị Caidat=tram+chuc+donvi RETFI E 5.2.2 CHƯƠNG TRÌNH CỦA MẠCH ĐO VÀ ĐIỀU KHIỂN NHIỆT ĐỘ PHÒNG //chuong trinh nhiet //chuong trinh nhiet //SVTH :Le Van Thuc lop CDDT07B //ngay thuc hien :26/07/2010 #INCLUDE #device *=16 ADC=10 #FUSES NOWDT,NOPROTECT,NOLVP,XT,PUT,NODEBUG,HS #USE DELAY(CLOCK=4000000) #USE RS232(BAUD=9600,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7,BITS=8) #use fast_io(a) #use fast_io(b) #use fast_io(c) #USE FAST_IO(d) #use fast_io(e) #BYTE portd=0X08 #BYTE porte=0X09 #BYTE porta=0X05 #BYTE portb=0X06 #BYTE portc=0X07 #bit c0=portc.0 #bit b7=portb.7 #bit b6=portb.6 #bit b5=portb.5 #bit b4=portb.4 #bit b3=portb.3 #bit b2=portb.2 #bit b1=portb.1 #bit b0=portb.0 #bit a5=porta.5 #bit a4=porta.4 #bit a3=porta.3 #bit a2=porta.2 #bit a1=porta.1 int16 x,y,adc,data,rec,caidat=40;//mặc định nhiệt độ cài đặt 40 int8 tram,chuc,donvi,d=0; INT8 led[10]={64,121,36,48,25,18,2,120,0,16}; //mã led đoạn int8 pc[10]={48,49,50,51,52,53,54,55,56,57};// mã ascii đến #int_rda void nhandulieu() { d++; data=getc(); delay_us(100); if(data==48) {data=0;} if(data==49) {data=1;} if(data==50) {data=2;} if(data==51) {data=3;} if(data==52) {data=4;} if(data==53) {data=5;} if(data==54) {data=6;} if(data==55) {data=7;} if(data==56) {data=8;} if(data==57) {data=9;} else {data=data;} if(d==1) //kiểm tra ngắt thứ { rec=data%10; //byte thứ caidat=rec; } if(d==2) { rec=rec%10; data=data%10; rec=(rec*10)+data;//byte thứ caidat=rec; data=0; } if(d==3) { data=data%10; rec=rec%100; rec=(rec*10)+data;//byte thứ caidat=rec; data=0; d=0; } if(d>3)// phòng xảy ngắt reset lại số ngắt { d=0; } } void hienthi() { portb=255; x=adc; y=x%100; tram=x/100; //lấy số hàng trăm chuc=y/10; //lấy số hàng chục dovi=y%10; //lấy số hàng đơn vị portd=led[tram]; b0=0; delay_ms(2); portd=led[chuc]; b1=0; b0=1; delay_ms(2); portd=led[donvi]; b2=0; b1=1; delay_ms(2); b2=1; x=caidat; y=x%100; tram=x/100; //lấy số hàng trăm chuc=y/10; //lấy số hàng chục dovi=y%10; //lấy số hàng đơn vị portd=led[tram]; b3=0; delay_ms(2); portd=led[chuc]; b4=0; b3=1; delay_ms(2); portd=led[donvi]; b5=0; b4=1; delay_ms(2); b5=1; } void main() { enable_interrupts(int_rda); enable_interrupts(global); set_tris_a(1); set_tris_b(0); set_tris_c(0b10000000); set_tris_d(0); set_tris_e(0); porte=portd=porta=portb=0; portc=0; setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(an0); set_adc_channel(0); adc=(float)read_adc(); delay_ms(10); setup_timer_2(T2_DIV_BY_4, 250, 1); setup_ccp1(CCP_PWM); //tần số PWM = 1KHz set_pwm1_duty(0); adc=(float)((adc-558.6)/2.048); while(true) { adc=(float)read_adc(); delay_us(100); adc=(float)((adc-558.6)/2.048); x=adc; y=x%100; tram=x/100; chuc=y/10; dovi=y%10; putc(pc[tram]); delay_us(100); putc(pc[chuc]); delay_us(100); putc(pc[donvi]); delay_us(100); hienthi(); if(adc>caidat) { c0=1; //bật role set_pwm1_duty(500); //bật còi báo động } if(adc #device PIC6f877 *=16 ADC=10 #use delay(clock=20000000) Int16 a,b; Void xu_ly_ADC ( ) { } #INT_TIMER1 Void xu_ly_ngat_timer ( ) { } Main ( ) { } - Đầu tiên thị tiền xử lý : # có nhiệm vụ báo cho CCS cần sử dụng chương trình C dùng VXL , có dùng giao tiếp PC qua cổng COM không , có dùng ADC không , có dùng DELAY không , có biên dịch kèm file hay không - Các khai báo biến - Các hàm ta viết : xu_ly_ADC () , - Các hàm phục vụ ngắt theo sau thị tiền xử lý cho biết dùng ngắt - Chương trình 3.1.2 Khai báo sử dụng biến - Các loại biến sau hỗ trợ : int1 số bit = true hay false ( hay 1) int8 số nguyên byte ( bit) int16 số nguyên 16 bit int32 số nguyên 32 bit char ký tự bit float số thực 32 bit short mặc định kiểu int1 byte mặc định kiểu int8 int mặc định kiểu int8 long mặc định kiểu int16 - Thêm signed unsigned phía trước để số có dấu hay không dấu Khai báo mặc định không dấu khai báo cuối không nên dùng dễ nhầm lẫn Thay vào nên dùng khai báo đầu 3.1.3 Các cấu trúc lệnh 3.1.4 Truyền thông với máy tính qua cổng COM _Để sử dụng giao thức , phải có khai báo ví dụ sau : #use delay (clock = 40000000 ) // VDK dùng OSC 40Mhz #use rs232 (baud=19200 , parity=n , xmit=pin_C6 , rcv=pin_C7 ) // baud= 19200 , không chẵn lẻ , chân truyền C6 , chân nhận C7 - Các hàm liên quan : Printf ( ) Getc ( ) putc ( ) Getch ( ) putchar ( ) Getchar ( ) fputc ( ) Fgetc ( ) puts ( ) Gets ( ) fputs ( ) Fgets ( ) Kbhit ( ) Assert ( ) CCS 3.222 Perror ( ) CCS 3.222 Set_uart_speed ( ) Setup_uart ( ) / printf ( string ) Printf ( cstring , values ) - Dùng xuất chuỗi theo chuẩn RS232 PC - string chuỗi hay mảng ký tự ( kết thúc ký tự null ) - value danh sách biến , cách dấu phẩy - Bạn phải khai báo dạng format value theo kiểu %wt Trong w có không , có giá trị từ 1-9 rõ có ký tự xuất ( mặc định có nhiêu ), 01-09 chèn thêm cho đủ ký tự 1.1-1.9 cho trường hợp số thực t kiểu giá trị - t : C : ký tự S : chuỗi ký tự U : số bit không dấu x : số bit kiểu hex ( ký tự viết thường ,VD : 1ef ) X : số bit kiểu hex ( ký tự viết hoa ,VD : 1EF ) D : số bit có dấu e : số thực có luỹ thừa TÀI LIỆU THAM KHẢO [1] Hồ Trung Mỹ – Giáo trình Quang điện tử.Đại học Bách khoa Tp.Hồ Chí Minh [2] Ngô Diên Tập – Vi điều khiển với lập trình - Nhà xuất Khoa học Kỹ thuật Hà Nội [3] Giáo trình VISUAL BASIC [4] Lakeview.Research.Serial.Port.Complete.2nd.Edition.Dec.2007 [5] Giáo Trình học tập môn Vi Xử Lý –PIC16F877A [6] Giáo Trinh học tập môn Kỹ Thuật Số [7] Giáo Trình học tập môn Kỹ Thuật Truyền Số Liệu [8] Giáo Trình Mạch điện tử - [9] Giáo Trình Đo Lường Và Điều Khiển Thiết Bị Bằng máy tính [9] Giáo Trình học tập môn Điện Tử Công Suất [10] www.picvietnam.net [11] www.Microchip.com [12] www.diendandientu.net [13] www.datasheet4u.com [14] www.dientuvietnam.net .. .Đo Và Điều Khiển Nhiệt Độ Phòng GVHD: Tô Hoàng Lộc 18 Sơ đồ chân PIC 16f877A -2- SVTH : Lê Văn Thực Đo Và Điều Khiển Nhiệt Độ Phòng GVHD: Tô Hoàng Lộc PIC16F877A họ vi điều khiển có... Dao động: PIC16F877A hoạt động bốn chế độ dao động khác nhau: Trong chế độ LP, XT HS sử dụng thạch anh dao động nối vào chân OSC1 OSC2 để tạo dao động Việc lựa chọn tụ dao động thạch anh dựa vào... thạch anh 10Mhz Khi đó: -6- SVTH : Lê Văn Thực Đo Và Điều Khiển Nhiệt Độ Phòng GVHD: Tô Hoàng Lộc Tần số dao động thạch anh Fosc = 10Mhz →ChukỳdaođộngcủathạchanhlàTosc=1/Tosc=1/10*106 (s) Chu

Ngày đăng: 07/09/2017, 11:03

Từ khóa liên quan

Mục lục

  • 2.8 Loa điện động

    • 2.8.1 Cấu tạo và ngun lý hoạt động

    • 2.8.2Phân loại

      • 2.8.2.1 Loa nén

      • 2.8.2.2 Loa thơng dụng

      • Khi thực hiện kết nối như trên, quá trình truyền phải đảm bảo tốc độ ở đầu phát và thu giống nhau. Khi có dữ liệu đén DTE, dữ liệu này sẽ được đưa vào bộ đệm và tạo ngắt.

      • Ngoài ra, khi thực hiện kết nối giữa hai DTE, ta còn dùng sơ đồ sau:

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan