Rev Author Line No. Line
1045 jacho 1 //Mereni energie
2 //(c) Jan Chroust 2013
3  
4  
5 #include "C:main.h"
6  
7 #define EEPROM_SDA PIN_C4
8 #define EEPROM_SCL PIN_C3
9 //rele v blok sch. REL1 a REL2
10 #define REL1_IN1 PIN_D6
11 #define REL1_IN2 PIN_D7
12 //rele v blok sch. REL5
13 #define REL2_IN1 PIN_B2
14 #define REL2_IN2 PIN_B3
15 //rele v blok sch.REL3
16 #define REL3_IN1 PIN_A0
17 #define REL3_IN2 PIN_A1
18 //rele v blok sch.REL3
19 #define REL4_IN1 PIN_A2
20 #define REL4_IN2 PIN_A3
21  
22 #define NOC PIN_B1 //pro povoleni moznosti nabijet
23  
24  
25 #use i2c(master, sda=EEPROM_SDA, scl=EEPROM_SCL)
26 #use rs232(baud=9600,parity=N,xmit=PIN_C7,rcv=PIN_C6,bits=8) //rcv TXD xmit RXD
27 #include "BQ34Z100.h"
28  
29 //BAT3 - pro pohyblivý panel - LION1CELLB-1
30 //BAT2 - pro fixní panel - LION1CELLB-2
31 //BAT1 - hlavní baterie - LION1CELLB-3
32 int16 bat1STAV,bat2STAV,bat3STAV; //zbyvajici eneregie akumulátoru v %
33 signed int16 bat1PROUD,bat2PROUD,bat3PROUD; //proud akumulatorem
34 int16 bat1NAP,bat2NAP,bat3NAP; //napeti akumulatoru
35 signed int16 bat1P,bat2P, bat3P; //vykon z nebo do akumulatoru
36  
37 //pro odeslání
38 signed int16 rozdil;
39 char baterka[40];
40  
41  
42 void batMODE(int d) //nastavi rele do prislusneho modu
43 {
44 switch (d) {
45  
46 case 1: output_high(REL1_IN2); //pro mereni
47 output_high(REL2_IN1);
48 output_high(REL3_IN2);
49 output_high(REL4_IN2);
50 delay_ms(100);
51 output_low(REL1_IN1);
52 output_low(REL1_IN2);
53 output_low(REL2_IN1);
54 output_low(REL2_IN2);
55 output_low(REL3_IN1);
56 output_low(REL3_IN2);
57 output_low(REL4_IN1);
58 output_low(REL4_IN2);
59  
60 break;
61  
62 case 2: output_high(REL1_IN2); //dobijeni Hl. clanku z bat3
63 output_high(REL2_IN1);
64 output_high(REL3_IN1);
65 output_high(REL4_IN2);
66 delay_ms(100);
67 output_low(REL1_IN2);
68 output_low(REL2_IN1);
69 output_low(REL3_IN1);
70 output_low(REL4_IN2);
71 break;
72  
73 case 3: output_high(REL1_IN2); //dobijeni Hl. clanku z bat2
74 output_high(REL2_IN1);
75 output_high(REL3_IN2);
76 output_high(REL4_IN1);
77 delay_ms(100);
78 output_low(REL1_IN2);
79 output_low(REL2_IN1);
80 output_low(REL3_IN2);
81 output_low(REL4_IN1);
82  
83 break;
84  
85 case 4: output_high(REL1_IN1); //dobijeni Hl. clanku ze sol. clanku
86 output_high(REL2_IN1);
87 output_high(REL3_IN2);
88 output_high(REL4_IN2);
89 delay_ms(100);
90 output_low(REL1_IN1);
91 output_low(REL2_IN1);
92 output_low(REL3_IN2);
93 output_low(REL4_IN2);
94  
95  
96 break;
97 case 5: output_high(REL1_IN2); //vybijeni bat3 do R
98 output_high(REL2_IN2);
99 output_high(REL3_IN1);
100 output_high(REL4_IN2);
101 delay_ms(100);
102 output_low(REL1_IN2);
103 output_low(REL2_IN2);
104 output_low(REL3_IN1);
105 output_low(REL4_IN2);
106  
107 break;
108  
109 case 6: output_high(REL1_IN2); //vybijeni bat2 do R
110 output_high(REL2_IN2);
111 output_high(REL3_IN2);
112 output_high(REL4_IN1);
113 delay_ms(100);
114 output_low(REL1_IN2);
115 output_low(REL2_IN2);
116 output_low(REL3_IN2);
117 output_low(REL4_IN1);
118  
119 default:printf("chyba");
120  
121 break; }
122  
123  
124 }
125  
126  
127 void setHUB(int d) //vstupuje 1-8
128 //hodnota udava jaky port bude pripojen na master I2C
129 //zde je nastaveno propojeni jen jedne brany, je mozne propojit i vice bran naraz
130 {
131 switch (d) {
132  
133 case 1: d=0x01;
134  
135 break;
136  
137 case 2: d=0x02;
138  
139 break;
140  
141 case 3: d=0x04;
142  
143 break;
144  
145 case 4: d=0x08;
146  
147 break;
148 case 5: d=0x10;
149  
150 break;
151  
152 case 6: d=0x20;
153  
154 break;
155 case 7: d=0x40;
156  
157 break;
158  
159 case 8: d=0x80;
160  
161 break;
162  
163 default:printf("chyba");
164  
165 break; }
166  
167 i2c_start();
168 I2C_Write(0xE0);
169  
170 I2C_write(d);
171 i2c_stop();
172  
173 }
174  
175 //nacitani potrebnych informaci z modulu s baterii
176 void batdata(void)
177 {
178 setHUB(1);
179 bat1PROUD=batPROUD();
180 bat1STAV=batSTAV();
181 bat1NAP=batNAP();
182 setHUB(2);
183 bat2PROUD=batPROUD();
184 bat2STAV=batSTAV();
185 bat2NAP=batNAP();
186 setHUB(3);
187 bat3PROUD=batPROUD();
188 bat3STAV=batSTAV();
189 bat3NAP=batNAP();
190  
191 bat1P=(bat1PROUD*(((float)bat1NAP/1000)));
192 bat2P=(bat2PROUD*(((float)bat2NAP/1000)));
193 bat3P=(bat3PROUD*(((float)bat3NAP/1000)));
194 }
195  
196  
197 void main()
198 {
199 batMODE(1);
200 float vypocet;
201  
202 setup_adc_ports(NO_ANALOGS|VSS_VDD);
203 setup_adc(ADC_CLOCK_DIV_2);
204 setup_spi(SPI_SS_DISABLED);
205 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
206 setup_timer_1(T1_DISABLED);
207 setup_timer_2(T2_DISABLED,0,1);
208 setup_ccp1(CCP_OFF);
209 setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
210  
211 batMODE(1);
212  
213  
214 //printf("STAV1 STAV2 STAV3 VYKON1 VYKON2 VYKON3\r\n");
215 while(TRUE)
216 {
217  
218 batdata();
219 //nastane pri nedostatku energie v hl. akumulátoru
220 while(bat1STAV<20)
221 {
222 //printf("nedostatek energie\r\n");
223 if(bat2STAV>10)
224 {
225 batMODE(3);
226 }
227 else
228 {
229 if(bat3STAV>10)
230 {
231 batMODE(2);
232 }
233 else
234 {
235 batMODE(4);
236 }
237 }
238 batdata();
239 sprintf(baterka, " %3.0Ld %3.0Ld %3.0Ld %5.0Ld %5.0Ld %5.0Ld %5.0Ld", bat1STAV, bat2STAV, bat3STAV, bat1P, bat2P, bat3P, 0);
240 printf(baterka);
241 delay_ms(5000);
242 }
243  
244 //osetreni proti prebiti clanku
245 while(bat2STAV>96)
246 {
247 //printf("bat2 prebita");
248 if(bat1STAV>98)
249 {
250 batMODE(6); //vybijeni do rezistoru
251 }
252 else
253 {
254 batMODE(3); //nabijeni hl. akumulatoru
255 }
256  
257 batdata();
258 sprintf(baterka, " %3.0Ld %3.0Ld %3.0Ld %5.0Ld %5.0Ld %5.0Ld %5.0Ld", bat1STAV, bat2STAV, bat3STAV, bat1P, bat2P, bat3P, 0);
259 printf(baterka);
260 bat2STAV=bat2STAV-2;
261 delay_ms(5000);
262 }
263  
264 while(bat3STAV>96)
265 {
266 //printf("bat3 prebyta\r\n");
267 if(bat1STAV>98)
268 {
269 batMODE(5); //vybijeni do rezistoru
270 }
271 else
272 {
273 batMODE(2); //vybijeni do hl. akumulatoru
274 }
275  
276 batdata();
277 sprintf(baterka, " %3.0Ld %3.0Ld %3.0Ld %5.0Ld %5.0Ld %5.0Ld %5.0Ld", bat1STAV, bat2STAV, bat3STAV, bat1P, bat2P, bat3P, 0);
278 printf(baterka);
279 bat3STAV=bat3STAV-2;
280 delay_ms(5000);
281 }
282  
283 while(input(NOC)==1) //nastane pri zapadu Slunce
284 {
285 //printf("noc\r\n");
286 batdata();
287  
288 if(bat1STAV<98) //dobiti hl. akumulatoru
289 {
290  
291 if(bat2STAV>20)
292 {
293 batMODE(3);
294 }
295 else
296 {
297  
298 if(bat3STAV>20)
299 {
300 batMODE(2);
301 }
302 else
303 {
304 batMODE(1);
305 }
306  
307 }
308 batdata();
309 }
310 else //prebitecna energie do rezistoru
311 {
312 if(bat2STAV>20)
313 {
314 batMODE(6);
315 }
316 else
317 {
318 if(bat3STAV>20)
319 {
320 batMODE(5);
321 }
322 else
323 {
324 batMODE(1);
325 }
326 }
327 }
328  
329 batdata();
330 sprintf(baterka, " %3.0Ld %3.0Ld %3.0Ld %5.0Ld %5.0Ld %5.0Ld %5.0Ld", bat1STAV, bat2STAV, bat3STAV, bat1P, bat2P, bat3P, 0);
331 //sprintf(baterka, "%Ld %Ld %Ld 0 0 0 0" bat1STAV, bat2STAV, bat3STAV);
332 printf(baterka);
333 delay_ms(5000);
334 }
335  
336 batMODE(1);
337 if(bat2P==0) //osetreni deleni nulou
338 {
339 rozdil=9999;
340 }
341 else
342 {
343 vypocet=(((float)bat3P-bat2P)/bat2P)*100; //vypocet rozdilu dodavane enengie dodavane solárnim panelem sledujícím Slunce a fixnim solarnim panelem
344 rozdil=(signed int)vypocet;
345 }
346  
347 //zaslani namerenych udaju na seriovou linku
348 sprintf(baterka, " %3.0Ld %3.0Ld %3.0Ld %5.0Ld %5.0Ld %5.0Ld %5.0Ld", bat1STAV, bat2STAV, bat3STAV, bat1P, bat2P, bat3P, rozdil);
349 printf(baterka);
350 delay_ms (20000);
351 }
352 }
353