ĐỒ ÁN TỐT NGHIỆP Chương THIẾT KẾ VÀ THI CÔNG MẠCH NẠP ACQUY TỪ HỆ THỐNG PIN MẶT TRỜI 3.1 Thiết kế mạch nạp acquy: Những chương trước tìm hiểu tổng quan hệ thống pin mặt trời Từ sở lý thuyết đó, xây dựng mơ hình đề tài với ý tưởng thiết kế sử pin lượng mặt trời, nạp điện cho Acquy, có dị điểm cơng suất cực đại 3.1.1 u cầu mơ hình: 3.1.1.1 Về kỹ thuật: - Mơ hình phải thể hiệu tiết kiệm thân thiện với môi trường - Chịu điều kiện khắc nghiệt thời tiết, bền vững với thời gian - Đơn giản vận hành bảo trì - Linh động thẩm mỹ 3.1.1.2 Về kinh tế: - Đơn giản thiết kế để hạ giá thành - Sử dụng vật tư thiết bị thông dụng với giá thành thấp - Với phần khơng quan trọng mơ hình tận dụng vật tư có sẳn để hạ giá thành 3.1.2 Sơ đồ nguyên lý code cho mạch nạp acquy: Trang ĐỒ ÁN TỐT NGHIỆP Hình 3.1: Sơ đồ nguyên lý mạch nạp acquy Sơ đồ nguyên lý mạch nạp acquy vẽ chạy mô phần mềm Protues Trang ĐỒ ÁN TỐT NGHIỆP Hình 3.2: Phần mềm mơ Protues Chương trình viết ngơn ngữ lập trình C, lập trình phần mềm Keil C Hình 3.3: Phần mềm keil C Sau đoạn code mạch nạp acquy: Phần bao gồm: - Chương trình mạch nạp - Các thư viện có chương trình chính: • • Trang Thư viện LCD Thư viện DS1307 ĐỒ ÁN TỐT NGHIỆP 3.1.2.1 Code chương trình chính: #include "REG51xD2.h" #include // === lcd === unsigned char buf_lcd[20]; #define rs_lcd P10 #define e_lcd P11 #define d4_lcd P00 #define d5_lcd P01 #define d6_lcd P02 #define d7_lcd P03 #include "Driver_Lcd_4Bit_V0.h" // === DS 1307 === #define SCL P36 #define SDA P37 #define ACK #define NO_ACK #define DS_WRITE 0xD0 #define DS_READ #define ERR_ACK 0x01 // 0xD1 *** -*** unsigned char RTC_ARR[7]; #include "i2c.h" // Read RTC (all real time) void ReadRTC(unsigned char * buff) { StartI2C(); WriteI2C(DS_WRITE); WriteI2C(0x00); Trang ĐỒ ÁN TỐT NGHIỆP StartI2C(); WriteI2C(DS_READ); *(buff+0)=ReadI2C(ACK); // Second *(buff+1)=ReadI2C(ACK); // Minute *(buff+2)=ReadI2C(ACK); // hour *(buff+6)=ReadI2C(NO_ACK); // year StopI2C(); } // Write RTC void WriteRTC(unsigned char *buff) { StartI2C(); WriteI2C(DS_WRITE); WriteI2C(0x00); WriteI2C(*(buff+0)); WriteI2C(*(buff+1)); WriteI2C(*(buff+2)); StopI2C(); } void Set_Date_Time( unsigned char min, unsigned char hour) { ReadRTC(&RTC_ARR[0]); RTC_ARR[0] = RTC_ARR[0] & 0x7F;//enable oscillator (bit 7=0) RTC_ARR[1] = min; RTC_ARR[2] = hour; WriteRTC(&RTC_ARR[0]);//Set RTC } void display(void) { Trang ĐỒ ÁN TỐT NGHIỆP ReadRTC(&RTC_ARR[0]); sprintf(buf_lcd," %02bX:%02bX:%02bX",RTC_ARR[2],RTC_ARR[1],RTC_ARR[0]); Putc_Lcd(buf_lcd,8,0); delay(50); // delay about second } // === adc === #define adc_ale P14 #define adc_start P15 #define adc_add0 P16 #define adc_add1 P17 #define data_adc P2 short f_adc=0; unsigned val_adc[6]; float xdata Vso, Pso,deltaV,deltaP,D_pwm,Pnew; Inap; unsigned int mode=0,f_k=0; // === === void int_ex0 (void ) interrupt { f_adc = 1; } void int_ex1 (void ) interrupt { mode++; if(mode==3) { mode =1;} } // === === void scan_adc() { unsigned int i=0; /// doc ad for (i=0;i 0.0) { if (deltaV > 0.0) {if (D_pwm < 245.0) D_pwm = D_pwm+5;} else { if (D_pwm > 5) D_pwm = D_pwm-5;} } else { if (deltaV > 0.0) { if (D_pwm > 5.0) D_pwm = D_pwm-5;} else { if (D_pwm < 245.0) D_pwm = D_pwm+5; } } CCAPM0 = 0x42; CCAP0H = D_pwm; CR = 1; Vso = val_adc[1]; // cap nhat Vso Pso = Pnew; // cap nhat Pnew } // ket thuc doan moi bo sung void main() { EA = 1; EX0 = 1; IT0 1; = EX1 = 1; IT1 = 1; Innit_Lcd(); Trang ĐỒ ÁN TỐT NGHIỆP mode =1 ; CCAPM0 = 0x42; CCAP0H = 255; CR = 0; //Set_Date_Time(0x37,0x9); main: Write_Lcd(0x01,0); delay(10); Dis_Lcd_4line (" Time =", "Bater V=", "Solar V=", "Solar I=" ); // che auto while(mode==1) { /// delay(200); display(); scan_adc(); if(((float)val_adc[1]*20.0/255.0)>10.0) { charge(); sprintf(buf_lcd,"Nap"); Putc_Lcd(buf_lcd,15,1); } else { Trang CCAPM0 = 0x42; CCAP0H = 255; ///xet nap ĐỒ ÁN TỐT NGHIỆP CR = 0; sprintf(buf_lcd,"Stop"); Putc_Lcd(buf_lcd,15,1); } } Write_Lcd(0x01,0); delay(10); goto main; } 3.1.2.2 Code chương trình thư viện: Thư viện LCD: #include // === void Triger(void); void Write_Lcd(char c ,short mode ); void Innit_Lcd(void ); void Goto_Lcd(int x, int y); void Putc_Lcd(char c[ ],int x , int y); // === void delay(unsigned int count) { unsigned int i; while(count) { i = 115; while(i>0) i ; count ; } } void Triger(void) Trang 10 ĐỒ ÁN TỐT NGHIỆP { delay(1); e_lcd = 1; = 0; delay(1); e_lcd delay(1); } // === void make_out_data(char buffer_data) { d4_lcd= (buffer_data&0x01) ; d5_lcd= ((buffer_data&0x02)>>1); d6_lcd= ((buffer_data&0x04)>>2); d7_lcd= ((buffer_data&0x08)>>3); } // === void lcd_send_nibble(char buffer_nibble) { make_out_data(buffer_nibble); Triger(); } // === void Write_Lcd(char c ,short mode ) { rs_lcd = 0; delay(1); rs_lcd = mode; delay(1); delay(1); e_lcd = 0; lcd_send_nibble((c >> 4)&0xf); lcd_send_nibble(c & 0xf); } Trang 11 ĐỒ ÁN TỐT NGHIỆP void Innit_Lcd(void ) { char i; rs_lcd = 0; e_lcd= 0; delay(5); for(i=1;i