Điều khiển hệ thống đèn dùng quang trở và IC thời gian thực
Trang 1Báo cáo đồ án môn học một
Tên đề tài:
Điều khiển hệ thống đèn dùng quang trở và IC thời gian thực
Đề tài:
Lập trình với vi điều khiển cho ứng dụng điều khiển hệ thống đèn,tương ứng với
3 chế độ,theo thứ tự ưu tiên như sau:
-Chế đô 1:Bật tắt hệ thống đèn bằng tay
-Chế đô 2:Bật tắt hệ thống đèn tùy theo cường độ sáng ngoài trời
-Chế độ 3:Bật tắt hệ thống đèn theo thời gian
1) Mục đích thực hiện đề tài
2) Phương án thực hiện đề tài và sơ đồ khối phần cứng
3) Lý thuyết liên quan
1.2) Ở một số địa phương trồng thanh long cần có hệ thống đèn để sưởi ấm
cho thanh long vào ban đêm,nhằm tăng năng suất thu hoạch thanh long…
Trang 22) Phương án thực hiện đề tài
Phương án thực hiện đề tài như sau:
*) Một đặc điểm nữa là đặt mức ưu tiên cho ba chế độ kể trên
Chế độ bằng tay đươc ưu tiên cao nhất,sau đó đến chế độ tự động bằng
quang trở,và ưu tiên sau cùng dành cho chế đọ tự động bằng IC thời gian thực
Sơ đồ khối thực hiện phần cứng:
Giải thích sơ đồ khối:
- Việc bật hay tắt tải thông qua điều khiển TRIAC
Trang 3- Có 2 cách điều khiển TRIAC: Bằng tay (MANUAL) và tự động thông qua lập trình cho PIC
- Việc đọc ADC từ 2 quang trở về được thực hiện ỏ chân RA0 và RA1 của PIC
- Việc đọc dữ liệu thời gian về từ khối REALTIME,thông qua giao tiếp I2C (với 2 dây SCL và SDA) được thực hiện ở chân RC3 và RC4 của PIC
3) Lý thuyết liên quan
Bố cục trình bày:
3.1) Lý thuyết về ADC và module ADC trong PIC 16F887
3.2)Lý thuyết về I2C và module I2C trong PIC 16F887
3.1) Lý thuyết về ADC và module ADC trong PIC 16F887
3.1.1)Tổng quan về quá trình chuyển đổi A/D
3.1.2) Các bước của quá trình chuyển đổi A/D
3.1.3) Module ADC trong PIC 16F887
3.1.1) Tổng quan về quá trình chuyển đổi A/D
Bộ chuyển đổi ADC là bộ chuyển đổi tín hiệu tương tự thành tín hiệu số
Trang 4Nhờ các sensors mà ta định lượng được các đại lượng phi điện như nhiệt độ,độ ẩm…từ đó kết hợp sensors với các bộ ADC để chuyển đổi sự thay đổi liên tục của các đại lượng phi điện này thành các bước nhảy của tín hiệu digital(qua quá trình lấy mẫu vàlượng tử hóa).Một khi đã chuyển đổi được các đại lượng phi
điện thành tín hiệu digital,ta dễ dàng lập trình với vi điều khiển sao cho phù hợp với từng ứng dụng cụ thể
3.1.2) Các bước của quá trình chuyển đổi A/D
a) Quá trình lấy mẫu và nhớ mẫu (sample và sample hold)
Quá trình lấy mẫu
Định lý lấy mẫu cho ta chặn dưới của tần số lấy mẫu fs,còn chặn trên ta phải
dựa vào giới hạn về phương diện dung lượng bộ nhớ và tốc độ xử lý của phần cứng,ngoài ra còn phải tùy vào ứng dụng để xác định chặn trên của f
Trang 5 Quá trình nhớ mẫu
Mỗi lần chuyển đổi từng mẫu đều tốn một khoảng thời gian nhất định,mà các mẫu lại xuất hiện liên tục theo chu kì lấy mẫu,do đó cần thiết phải có yếu tố nhớ mẫu (sample hold) để chắc chắn rằng ta không bỏ sót mẫu nào
Mạch nhớ mẫu(hold sample) đơn giản
Trang 6b) Quá trình lượng tử hóa và mã hóa
Tín hiệusau khi lấy mẫu không những rời rạc về mặt thời gian mà còn rời rạc về mặt giá trị.Do đặc điểm này mà ta cần quá trình lượng tử hóa,đó là quá trình mà
ta bắt điện áp lấy mẫu hóa thành bội số nguyên lần giá trị đơn vị
Như vậy,quá trình lượng tử hóa thực chất là quá trình làm tròn đến một giá trị thích hợp,gần nhất
Việc làm tròn này làm xuất hiện sai số trong quá trình lượng tử.Nếu độ phân giải không đủ(số bít để lượng tử nhỏ) thì sai số càng lớn
Độ phân giải n bít nghĩa là ADC có thể biểu diễn được 2n giá trị của tín hiệu sau lấy mẫu
Việc dùng mã nhị phân biểu thị giá trị tín hiệu số là mã hóa Mã nhị phân có
được sau quá trình trên chính là tín hiệu đầu ra của chuyên đổi A/D
Trang 73.1.3) Module ADC trong PIC 16F887
3.1.3.1) Tổng quan về module ADC trong PIC 16F887
3.1.3.2) Cấu hình cho module ADC trong PIC 16F887
3.1.3.1) Tổng quan về module ADC trong PIC 16F887
Module ADC trong PIC 16F887 có độ phân giải 10 bít
Module ADC trong PIC 16F887 có 14 kênh chuyển đổi A/D từ AN0 đến AN13
Sau khi lấy mẫu và giữ,tín hiệu ở dạng xung được đưa vào bộ chuyển đổi.Kết quả của quá trình chuyển đổi trên ở dạng 1 chuỗi bít gồm 10 bít,được lưu trong 2 thanh ghi ADC result gồm ADRESL và ADRESH
Có thể chọn điện áp tham khảo nội hoặc điện áp tham khảo ngoại.Việc lựa chọn này được thực hiện bằng phần mềm
Module ADC trong PIC 16F887 có thể tạo ngắt khi một chuyển đổi được thực hiện xong
3.1.3.2) Cấu hình cho module ADC trong PIC 16F887
a) Cấu hình PORT
b) Chọn kênh chuyển đổi
c) Chọn điện áp tham khảo
d) Chọn nguồn clock cho việc chuyển đổi
e) Điều khiển ngắt trong ADC
f) Định dạng kết quả chuyển đổi
Trang 8a) Cấu hình PORT
Module ADC trong PIC 16F887 có thể được dùng để chuyển đổi cả tín hiệu analog và digital.Bằng cách cấu hình PORT cho 2 thanh ghi ANSEL và ANSELH ta sẽ lựa chọn được 1 trong 2 chế độ trên
Cách cấu hình:
TRIS ANSEL=0xFF ; //Chọn chuyển đổi tín hiệu Analogtừ AN0 đến AN7
TRIS ANSELH= 0xFF ; // Chọn chuyển đổi tín hiệu Analog từ AN8 đến AN13
TRIS ANSEL= 0x03 ; // Chọn chuyển đổi tín hiệu Analog 2 kênh AN0 và AN1
b) Chọn kênh chuyển đổi
4 bít CHS <3:0> trong thanh ghi ADCON0 xác định kênh nào được đọc ADC
Ví dụ: CHS <3:0>=0011 => Kênh AN3 đang được chọn
Trang 9c) Chọn điện áp tham khảo
-Điện áp tham khảo phải là nguồn áp rất ổn định
-Chọn điện áp tham khảo bằng cách cấu hình cho 2 bít VCFG<1:0> trong thanh ghi ADCON0
Ví dụ: VCFG1=0;VCFG0=0; // Chọn điện áp tham khảo nội
VCFG1=1;VCFG0=1; // Chọn điện áp tham khảo ngoại(điện
áp tham khảo ngoại phải đưa vào 2 chân RA2 và RA3)
d) Chọn nguồn clock cho việc chuyển đổi
Chọn nguồn clock cho việc chuyển đổi được thực hiện thông qua việc cấu hình cho 3 bít ADCS<2:0>
Việc cấu hình trên phai quan tâm đến định lý lấy mẫu
e) Điều khiển ngắt trong ADC
Bít ADIF là cờ báo ngắt
Để cho phép ngắt,ta cần đặt: PEIE=1;GIE=1
Trang 10 Khi một quá trình chuyển đổi được thực hiện xong,cờ báo ngắt ADIF
được set lên 1,để bắt đầu một quá trình chuyển đổi mới,ta cần clear ADIF bằng phần mềm
f) Định dạng kết quả chuyển đổi
Bít ADFM điều khiển việc định dạng kết quả chuyển đổi
3.2) Lý thuyết về I2C và module I2C trong PIC 16F887
3.2.1) Đặc điểm của giao tiếp I2C
3.2.2) Cách thức truyền dữ liệu theo giao tiếp I2C
3.2.3) Module I2C trong PIC 16F887
3.2.1) Đặc điểm của giao tiếp I2C
Trang 11 Là một chuẩn giao tiếp nối tiếp rất hữu dụng cho các ứng dụng giao tiếp của các thiết bị vi điều khiển và các thiết bị ngoại vi.Các ngoại vi có thể
là các Serial EEPROM,các thanh ghi dịch,các bộ hiển thị,A/D Converter,các cảm biến nhiệt độ…
Nguồn dùng cho giao tiếp I2C thường là 3.3V hoặc 5V ,đây là các nguồn thông dụng dùng cho vi điều khiển
Một giao tiếp I2C gồm có 2 dây: Serial Data (SDA) và Serial Clock (SCL)
Mỗi dây SDA hay SCL đều được nối với điện áp dương của nguồn cấp thông qua một điện trở kéo lên (pull‐up resistor)Đối với giao tiếp I2C giá trị của các điện trở này nên có giá trị từ 1,8kΩ đến 47kΩ,trong đó có 3 giá trị điện trở sau đã được thực nghiệm xác nhận là tốt nhất cho đường truyền I2C,đó là 1.8kΩ; 4.7kΩ và 10kΩ;
Có thể cónhiều thiết bị ngoại vi cùng được kết nối vào một bus
I2C, nhưng sẽ không xảy ra chuyện nhầm lẫn giữa các thiết bị, bởi mỗi thiết
bị sẽ được nhận ra bởi một địa chỉ duy nhất của nó Có 2 cách định địa chỉ: Định địa chỉ 7 bít và 10 bít
Các mode hoạt động và tốc độ của đường truyền I2C
3.2.2) Cách thức truyền dữ liệu theo giao tiếp I2C
1) Phân tích sơ đồ thời gian truyền nhận dữ liệu trên bus I2C
2) Định dạng dữ liệu truyền
3) Định dạng địa chỉ thiết bị ngoại vi
4) Ví dụ phân tích quá trình “Read 1 byte “và “Write 1 byte”
1) Phân tích sơ đồ thời gian truyền nhận dữ liệu trên bus I2C
Trang 12 Trong giao tiếp I2C,chế độ rỗi ứng với SDA=SCL=1,điều này đạt được bởi 2 điện trở pull-up kéo lên nguồn
Để bắt đầu quá trình truyền nhận dữ liệu,ta cần khởi tạo đường truyền bằng một tìn hiệu Start-đó là lúc SDA bị kéo xuống 0,trong khi SCL vẫn bằng 1(xem hình trên)
Một thời gian ngắn sau thì bít SCL cũng bị kéo xuống 0,kể từ thời điểm này bắt đầu truyền nhận dữ liệu(Transfer data)trên bus I2C
Bước vào quá trình truyền dữ liệu,cứ mỗi bit dữ liệu được truyền đi,dữ liệu trên SCL sẽ được kích thêm 1 xung
Để kết thúc việc truyền dữ liệu,thì ta cần một tín hiệu Stop được gửi đi,bằng cách cho SDA đuợc kéo lên mức cao trong lúc SCL vẫn ở mức cao
Cả hai điều kiện START và STOP đều được tạo ra bởi thiết bị chủ
Sau tín hiệu START,bus I2C coi như đang trong trang thái làm việc
Sau tín hiệu STOP Bus I2C sẽ rỗi, sẵn sàng cho một giao tiếp mới
2) Định dạng dữ liệu truyền
Dữ liệu được truyền đi theo từng bít,bít dữ liệu được truyền đi tại sườn
dương của xung clock SCL,quá trình thay đổi bít dữ liệu trên SDA xảy ra
khi SCL ở mức thấp
Trang 13 Sau 8 xung clock trên dây SCL, 8 bit dữ liệu đã được truyền đi
Thiết bị nhận, sau khi đã nhận đủ 8 bít dữ liệu sẽ kéo SDA xuống mức thấp
tạo một xung ACK
Thiết bị truyền khi nhận được bit ACK sẽ tiếp tục thực hiện quá trình truyền
hoặc kết thúc
3) Định dạng địa chỉ thiết bị ngoại vi
Trang 14 Khi thiết bị chủ muốn giao tiếp với ngoại vi nào trên bus I2C, nó sẽ gửi 7 bit địa chỉ của thiết bị đó ra bus ngay sau xung START ,điều đó có nghĩa là ta
có thể giao tiếp với 128 thiết bị ngoại vi
Mỗi một thiết bị ngoại vi sẽ có một địa chỉ riêng do nhà sản xuất ra nó quy định
Byte đầu tiên được gửi sẽ bao gồm 7 bit địa chỉ và một bít thứ 8 điều khiển hướng truyền (“0”- ghi, “1”- đọc)
4) Ví dụ phân tích quá trình “Read 1 byte “và “Write 1 byte”
Khi chưa bắt đầu quá trình truyền dữ liệu thì bus I2C đang ở trạng thái rỗi
Để bắt đầu quá trình truyền dữ liệu,Master phải gửi đi tín hiệu Start
Sau đó Master gửi lên đường truyền 7 bít địa chỉ của Slave(tra trong
datasheet của nhà sản xuất thiết bị),kèm theo một bít Write(W)
Trang 15 Sau khi nhận đủ byte,thì Slave tự động gửi về cho Mastre bít ACK để báo hiệu rằng Slave đã nhận đủ byte
Master sau khi nhận được bít ACK,nó gửi tiếp cho Slave 8 bit địa chỉ thanh ghi của Slave mà nó muốn truy cập.Khi nhận xong 8 bít,Slave lại gửi về
ACK
Để chuyển sang trạng thái đọc,Master cần gửi đi tín hiệu ReStart để khởi tạo lại đường truyền,sau đó gửi lại 7 bít đại chỉ của Slave một lần nữa,kèm theo bít Read (R) để báo hiệu cho Slave rằng nó cần đọc dữ liệu từ Slave về
Slave gửi lại ACK để xác nhận,kèm theo 8 bít data chứa trong địa chỉ thanh ghi mà Master đã báo cho nó lúc trước
Master nhận được một byte dữ liệu và nó điều khiển việc kết thúc truyền
nhận dữ liệu bằng tín hiệu NACK kèm theo bít Stop
Cần lưu ý rằng,ta chỉ điều khiển được Master,còn những tín hiệu gửi đi từ Slave là tự động,ta không can thiệp được
Việc phân tích truyền nhận dữ liệu trên bus I2C trong trường hợp ghi
hoàn toàn tương tự như đọc 1 byte
Điểm khác nhau căn bản nhất giữa đọc 1 byte và ghi 1 byte chỉ là lúc kết thúc truyền nhận dữ liệu.Trong quá trình đọc,để kết thúc truyền nhận dữ liệu,Master cần gửi đi bít NAK trước khi gửi đi tín hiệu Stop,còn ở quá trình ghi,để kết thúc việc truyền nhận dữ liệu,Master chỉ cần gửi đi bít Stop là đủ
Trang 16Sau đây là quá trình đọc nhiều byte và ghi nhiều byte,việc phân tích truyền
nhận dữ liệu là tương tự như trên
3.2.3) Module I2C trong PIC 16F887
Module I2C nằm trong module MSSP của PIC 16F887
Có 2 cách định địa chỉ thiết bị trên đường truyền:7 bít và 10 bít
Trang 17 Dùng 2 chân RC3/SCL (truyền xung clock)và RC4/SDA(truyền dât) để truyền dữ liệu bằng giao thức I2C.Lưu ý người dùng phải cấu hình cho 2 chân này là input hoặc output
Chức năng I2C được enable bằng cách set bít SSPEN trong thanh ghi SSPCON lên 1
Có nhiều phương án để điều khiển bóng đèn theo cường độ ánh sáng môi trường và theo thời gian.Vì thế,chắc chắn sẽ có nhiều phương pháp khác hiệu quả hơn về mặt kinh tế và kỹ thuật,đòi hỏi người thực hiện phải cải tiến sản phẩm để sản phẩm tốt hơn
Qua việc thực hiện đồ án,thu nhận thêm được những kiến thức sau:
Các chuẩn giao tiếp như UART,I2C,SPI
Kiến thức lập trình
Kĩ năng phần cứng
Giao tiếp giữa MCU và LCD
Ưu điểm của sản phẩm
Cho phép hiển thị thời gian
Có 2 quang trở nên tạo tính tin cậy hơn cho sản phẩm
Sản phẩm được hoạt động theo chế đọ ưu tiên
Nhược điểm:
Chưa có nút chỉnh thời gian cho khối real time
Nếu muốn điều khiển nhiếu tải hơn,ta phải thay biến áp khác có khả năng chịu dòng lớn hơn,chẳng hạn như biến áp xung-vừa gọn nhẹ vừa có khả năng tải lớn
Hướng phát triển:
Tạo nút hẹn giờ cho khối Real time
Cải tiến để sản phẩm gọn nhẹ hơn
Trang 18PHẦN PHỤ LỤC
5.1) Sơ đồ khối và sơ đồ nguyên lý thực hiện phần cứng
5.2) Thi công mạch TRIAC và REALTIME CLOCK
5.3) Thi công mạch PIC 16F887
Trang 195.2) Thi công mạch TRIAC và REAL TIME CLOCK
5.3) Thi công mạch PIC 16F887
Trang 21/****************************************************************
*
* Module : main_combine.c
* Description : Display the time on LCD16x2, using Real Time Clock
DS1307 & I2C protocol
Give ADC priority
* Tool : HI-TECH PIC
* Chip : 16F887
* History : 7/12/2011
*
* Author : Nguyen Van Hai, TNDVT08
* Hardware : PORTD<==>LCD16x2 ; [RC3,RC4]<==>DS1307 (I2C
protocol)
RA0 va RA1 la 2 chan doc ADC
* RB0 la chan dieu khien tai
Trang 22#include <htc.h>
#include "lcd.h"
#include "i2c.h"
#include "rtc.h"
CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON &
CP_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF &
DEBUG_OFF); //1st config Word
CONFIG(BOR4V_BOR21V); //2st config Word
Trang 23* SUBROUTINES
******************************************************************/
void delay10Tms(unsigned char T);
void time2LCD(RTCTime time);
void BCD2LCD(unsigned char val);
Trang 24TimeNow = RTC_read(); // doc thoi gian vao bien,time no chua 7 byte trong ham RTC_read
Trang 25//Cai dat thoi gian lam tai OFF khi quang tro chua lam tai OFF
if (TimeNow.hour == 0x08 && TimeNow.minute == 0x45 && TimeNow.second == 0x00)
Trang 26} read_adc(); // Tiep tuc doc ADC,neu troi toi (RB4=1) thi RB5=0 lap tuc thoat ra ngoai vong lap while
TimeNow = RTC_read(); // doc thoi gian vao bien,time now chua 7 byte trong ham RTC_read
thi lcd
Trang 29RB2 = 0;
GO_nDONE = 1; //Set GODONE bit to start a new AD conversion
}
delay_us(50); //delay between 2 AD conversions
// Select Input chanel: AN0
Trang 30GO_nDONE = 1; //Set GODONE bit to start conversion }
Trang 31ANSELH=0x00; //
TRISB=0; //PORT B la output
PORTB=0;
TRISA0 = 1; //RA0 phai la Input de doc ADC
TRISA1 = 1; //RA1 phai la Input de doc ADC
lcd_init(); // khoi dong lcd
i2c_init(); // khoi dong i2c
//RTC_init(); //chi set up o lan dau tien cua DS1307
lcd_puts("Real Time Clock");
Trang 32// Result format: Right
// ADFM = 1 Right justified
// ADFM = 0 Left justified
Trang 34unsigned char i[2];
i[1] = (val>>4) & 0x0f; //lay 4 bit cao
i[0] = val & 0x0f; //lay 4 bit thap
Trang 35** Returned value: None
Trang 37** Returned value: None
// - NAP THOI GIAN BAN DAU CHO I2C -//
//chi set thoi gian 1 lan duy nhat Sau do xoa' doan code nay`
//roi nap lai code 1 lan nua (doan code sau chi doc data ve,
//chu khong set thoi gian lai > ds1307 moi chay dung' thoi
//gian Neu khong lam nhu vay, cu sau moi lan reset, ds1307
//lai duoc set lai thoi gian