📄 ldfxmain.lst
字号:
235 4 case 1://静置
236 4 {
237 5 da(0,0);
238 5 da(0,1);
239 5 P4 |=0xFF;
240 5 P5 |=0x0F;
C51 COMPILER V7.06 LDFXMAIN 06/06/2005 16:32:36 PAGE 5
241 5 P2 |=0xF0;
242 5 P1 |=0xFF;//所有DA_EN脚均为1,使所有398处于采样状态,把所有DA清为0
243 5 JDQ = 0;
244 5 WorkStepInit(HALT);
245 5 while(WorkStep[CurrentWorkStep].t > Second)
246 5 {
247 6 if(OSSemAccept(StopWorkStepSem)==OS_SEM_OK)//如果急停
248 6 {
249 7 CurrentWorkStep = SumWorkStep - 1;
250 7 break;
251 7 }
252 6 OSWait(K_TMO,(50*OS_TICKS_PER_SEC)/1000);
253 6 CellCheckFlag = 0;
254 6 }
255 5 }break;
256 4 case 2://充电
257 4 {
258 5 bit all_cell_full=0;
259 5 WorkStepInit(CHARGE);
260 5 ClearDA();//
261 5 OSWait(K_TMO,(450*OS_TICKS_PER_SEC)/1000);
262 5 JDQ = 0;
263 5 OSWait(K_TMO,(50*OS_TICKS_PER_SEC)/1000);
264 5 SetupDA();
265 5 OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
266 5 OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
267 5 OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
268 5 OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
269 5 while(all_cell_full==0)//等所有电池充满或超时
270 5 {
271 6 if(DaParaChanged)
272 6 {
273 7 SetupDA();
274 7 DaParaChanged=0;
275 7 }
276 6 if(OSSemAccept(StopWorkStepSem)==OS_SEM_OK)//如果急停
277 6 {
278 7 CurrentWorkStep = SumWorkStep - 1;
279 7 break;
280 7 }
281 6 OSWait(K_TMO,(50*OS_TICKS_PER_SEC)/1000);
282 6 CellCheckFlag = 0;
283 6 all_cell_full=1;
284 6 for(i=0;i<24;i++)
285 6 {
286 7 if(Cell[i].s == CHARGE)
287 7 {
288 8 all_cell_full=0;
289 8 }
290 7 if(Cell[i].i < WorkStep[CurrentWorkStep].limit)
291 7 {
292 8 //DAIBuf[i] = 0;//先充完的继续恒压充等时间到或所有都充完
293 8 Cell[i].s = CURRENTOVER;//当前工步完成
294 8 Cell[i].t = 0;
295 8 }
296 7 }
297 6 if(WorkStep[CurrentWorkStep].t < Second)
298 6 {
299 7 ClearDA();
300 7 all_cell_full = 1;
301 7 }
302 6 }//while(all_cell_full==0)//等所有电池充满或超时
C51 COMPILER V7.06 LDFXMAIN 06/06/2005 16:32:36 PAGE 6
303 5 for(i=0;i<24;i++)
304 5 {
305 6 Cell[i].s = CURRENTOVER;
306 6 }
307 5 OSWait(K_TMO,(1000*OS_TICKS_PER_SEC)/1000);//等待所有AD通道电流变为0
308 5 OSWait(K_TMO,(1000*OS_TICKS_PER_SEC)/1000);
309 5 OSWait(K_TMO,(1000*OS_TICKS_PER_SEC)/1000);
310 5 }break;//case 2://充电
311 4 case 3://放电
312 4 {
313 5 bit all_cell_over = 0;
314 5 bit change_flag = 1;
315 5 //以下部分等程序用于确定是不清空平台电压数据
316 5 for(i=0;i<24;i++)
317 5 {
318 6 if(Cell[i].s == DISCHARGE)//如果电池状态为放电说明是掉电续接所以不清空平台时间数据
319 6 {
320 7 change_flag = 0;
321 7 break;
322 7 }
323 6 }
324 5 //以上部分等程序用于确定是不清空平台电压数据
325 5 WorkStepInit(DISCHARGE);
326 5 //以下部分等程序用于清空平台数据
327 5 if(change_flag)
328 5 {
329 6 for(i=0;i<156;i++)//清空平台电压时间数据
330 6 {
331 7 OSSemPend(IICSem,0);
332 7 EepromWriteWord(ReferenceUTimeIICBase + i*2, 0);
333 7 EepromWriteWord(ReferenceUTimeIICBase + 312 + i*2, 0);
334 7 OSSemPost(IICSem);
335 7 }
336 6 for(i=0;i<24;i++)//清空平台电压数据
337 6 {
338 7 ReferenceU[i]=38000;
339 7 OSSemPend(IICSem,0);
340 7 EepromWriteWord(ReferenceUIICBase + i*2, 38000);
341 7 OSSemPost(IICSem);
342 7 }
343 6 }
344 5 //以上部分等程序用于清空平台数据
345 5 ClearDA();
346 5 OSWait(K_TMO,(450*OS_TICKS_PER_SEC)/1000);
347 5 JDQ = 1;
348 5 OSWait(K_TMO,(50*OS_TICKS_PER_SEC)/1000);
349 5 // WorkStepInit(DISCHARGE);
350 5 SetupDA();
351 5 OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
352 5 OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
353 5 OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
354 5 OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
355 5 while(all_cell_over==0)//等所有电池放干或超时
356 5 {
357 6 if(DaParaChanged)
358 6 {
359 7 SetupDA();
360 7 DaParaChanged=0;
361 7 }
362 6 if(OSSemAccept(StopWorkStepSem)==OS_SEM_OK)//如果急停
363 6 {
364 7 CurrentWorkStep = SumWorkStep - 1;
C51 COMPILER V7.06 LDFXMAIN 06/06/2005 16:32:36 PAGE 7
365 7 break;
366 7 }
367 6 OSWait(K_TMO,(50*OS_TICKS_PER_SEC)/1000);
368 6 CellCheckFlag = 0;
369 6 all_cell_over=1;
370 6 for(i=0;i<24;i++)
371 6 {
372 7 if(Cell[i].s == DISCHARGE && Cell[i].i > 100)//如果电池状态为放电并且电流大于1
-0毫安
373 7 {
374 8 all_cell_over=0;
375 8 }
376 7 if(ReferenceU[i] > 26000 && DAIBuf[i] > 0 && Cell[i].u < WorkStep[CurrentWorkS
-tep].limit)//电池放完,进行状态转换
377 7 {
378 8 OSSemPend(IICSem,0);//保存分容信息
379 8 EepromWriteWord(ReferenceUTimeIICBase + ((38000 - WorkStep[CurrentWorkStep
-].limit)/1000)*48 + i*2, Cell[i].t);
380 8 ReferenceU[i] = 26000;
381 8 EepromWriteWord(ReferenceUIICBase + i*2, ReferenceU[i]);
382 8 OSSemPost(IICSem);
383 8 DAIBuf[i] = 0;
384 8 DAUBuf[i] = 0;
385 8 Cell[i].t = 0;
386 8 }
387 7 if(DAIBuf[i] == 0 && DAUBuf[i] == 0 && Cell[i].t > 3)
388 7 {
389 8 Cell[i].s = CURRENTOVER;
390 8 }
391 7 }
392 6 if(WorkStep[CurrentWorkStep].t < Second)
393 6 {
394 7 ClearDA();
395 7 all_cell_over = 1;
396 7 }
397 6
398 6 }//while(all_cell_over==0)//等所有电池放干或超时
399 5 for(i=0;i<24;i++)
400 5 {
401 6 Cell[i].s = CURRENTOVER;
402 6 }
403 5 OSWait(K_TMO,(1000*OS_TICKS_PER_SEC)/1000);//等待所有AD通道电流变为0
404 5 OSWait(K_TMO,(1000*OS_TICKS_PER_SEC)/1000);
405 5 OSWait(K_TMO,(1000*OS_TICKS_PER_SEC)/1000);
406 5 }break;//case 3://放电
407 4 }//switch(WorkStep[i].type)
408 3 }//for(i=0;i<SumStep;i++)
409 2 }//while(1)
410 1 }//void TaskWorkStep(void)
411 /*********************************************************************************************************
412 ** 函数名称: TaskCalcCapa
413 ** 功能描述: 容量积分,每秒钟处理一次,同时将每只电池当前状态持续时间加1,
414 在放电过程中,将每只电池每隔100mV电压变化的时间存入F24C16
415 ** 输 入: 无
416 ** 输 出: 无
417 ** 全局变量: Cell[i].c Cell[i].i
418 ** 调用模块: OSWait
419 **
420 ** 作 者: 刘宝贵
421 ** 日 期: 2004年4月29日22:07
422 **-------------------------------------------------------------------------------------------------------
423 ** 修改人: 刘宝贵
C51 COMPILER V7.06 LDFXMAIN 06/06/2005 16:32:36 PAGE 8
424 ** 日 期: 2004年10月25日16:00
425 ** 内 容:在电池放电过程中,电池电压每下降100mV记录一次到达这个电压值的时间
426 **-------------------------------------------------------------------------------------------------------
427 *********************************************************************************************************/
428 void TaskCalcCapa(void)
429 {
430 1 uint8 data i;
431 1 uint8 xdata count=0;
432 1 uint8 xdata bhcount[24] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
433 1 while (1)
434 1 {
435 2 OSWait(K_SIG,0);//等一秒
436 2 Address = P7 & 0x3F;//读本机地址
437 2 //通信中断处理 begin
438 2 CommCounter++;
439 2 if(CommCounter>120 && CommCounter < 150 && CurrentWorkStep != 0)//如果通信断2分钟FMQ报警,报警时长
-30秒
440 2 {
441 3 ALARMLED = 1;//ON
442 3 FMQ = 0; //ON
443 3 }
444 2 else
445 2 {
446 3 FMQ = 1; //OFF
447 3 }
448 2 if(CommCounter>420 && CurrentWorkStep != 0)//如果通信断7分钟,本机停止工步执行。
449 2 OSSemPost(StopWorkStepSem);
450 2 //通信中断处理 end
451 2 //容量积算处理 begin
452 2 for(i=0;i<24;i++)
453 2 {
454 3 OS_ENTER_CRITICAL();
455 3 Cell[i].c+=Cell[i].i;
456 3 Cell[i].t++;
457 3 OS_EXIT_CRITICAL();
458 3 }
459 2 //容量积算处理 end
460 2 //软件电压保护电流保护处理begin
461 2 if(P7 < 64)//地址码最高位为硬件过压保护测试位1:电压DA给最大值,0:给正常值;
462 2 { //次高位为软件过压保护控制位1:不使能软件过压过流保护,0:使能软件过压过流保护
463 3 for(i=0;i<24;i++)
464 3 {
465 4 if(Cell[i].u > 43000 ||Cell[i].u < 10000 || Cell[i].i > (1000 + WorkStep[CurrentWorkStep].
-i) )//如果过压欠压过流
466 4 {
467 5 bhcount[i]++;
468 5 if(bhcount[i] > 5)//如果过压欠压过流5秒
469 5 {
470 6 ALARMLED = 1;//ON
471 6 DAUBuf[i] = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -