#include "task.h" #include "TEST.H" #include "ctrl.h" #include "adc.h" #include "DAC.H" void EndDecompose(void *param); signed char DecompseDelayTimer = -1; void TaskTest(void) //TASK_TEST { long lDStartDJADValue= IED.DownloadWorkParam.lDStartDJADValue; long lDEndDJADValue = IED.DownloadWorkParam.lDEndDJADValue; long lChlPol = IED.AdValue.lPreChlPol; IED_DATABASE *pIED = &IED; pIED->cStateTime++; pIED->cTestTimer++; // //超时退出 // if(pIED->cTestTimer>=IED.DownloadWorkParam.sMaxTestTime+5)//MAXTESTTIME) // { // Beep(20,1000); // pIED->cTestState = TEST_DECOMP; // } if(IED.cTestState!=TEST_ERROR) { memset(IED.ErrorInfo,0,sizeof(IED.ErrorInfo)); } switch(IED.cTestState) { case TEST_NONE: SuspendTask(TASK_TEST); break; case TEST_INIT: pIED->cStateTime = 0; pIED->cTestTimer = 0; MovMotor(POS_MIDDLE_1); StopTimer(&DecompseDelayTimer); StartDigitalDJ(0); ActiveTask(TASK_DJ,TASK_DJ_SCAN_PERIOD); JB(1); Pumb(1); pIED->cStateTime = 0; pIED->cTestState = TEST_MOVE_POS1; ResetIntFreq();//清除计数器 InitIntegrator(); Beep(1,500); break; case TEST_MOVE_POS1: if((IED.MotorCtrl.cPos==POS_MIDDLE_1) ||(IED.MotorCtrl.cPos==POS_HIGH_TEMP)) { pIED->cStateTime = 0; pIED->cTestState = TEST_PREDECOMP1; } break; case TEST_PREDECOMP1: if(pIED->cStateTime>pIED->DownloadWorkParam.cTimeDecompose1*TICKCOUNT/TEST_SCAN_PERIOD) { MovMotor(POS_MIDDLE_2); pIED->cTestState=TEST_MOVE_POS2 ; pIED->cStateTime = 0; } break; case TEST_MOVE_POS2: if((IED.MotorCtrl.cPos==POS_MIDDLE_2) ||(IED.MotorCtrl.cPos==POS_HIGH_TEMP)) { pIED->cStateTime = 0; pIED->cTestState = TEST_PREDECOMP2; } break; case TEST_PREDECOMP2: if(pIED->cStateTime>pIED->DownloadWorkParam.cTimeDecompose2*TICKCOUNT/TEST_SCAN_PERIOD) { pIED->cStateTime = 0; pIED->cTestState = TEST_MOVE_POS3; MovMotor(POS_HIGH_TEMP); } break; case TEST_MOVE_POS3: //BUG:实验做完不退出 if((IED.MotorCtrl.cPos==POS_HIGH_TEMP)||(pIED->cStateTime>30)) { if(pIED->cStateTime>30) Beep(10,100); pIED->cTestState = TEST_DECOMP; pIED->cStateTime = 0; } break; case TEST_DECOMP: //超时退出 if(pIED->cTestTimer>=IED.DownloadWorkParam.sMaxTestTime)//MAXTESTTIME) { StopTimer(&DecompseDelayTimer); EndDecompose(0); } if(pIED->cTestState==TEST_DECOMP) { if(lChlPol>lDStartDJADValue) //// { StopTimer(&DecompseDelayTimer); } else { if((lChlPolDownloadWorkParam.cTimeDelay,EndDecompose,0); } } } break; case TEST_END: SuspendTask(TASK_DJ); StopDJ(); if((POS_PUT_SAMPLE==IED.MotorCtrl.cPos)||(pIED->cStateTime>70)) { Beep(2,500); if(IED.DownloadWorkParam.bAutoCly) { pIED->cCoolTime = pIED->DownloadWorkParam.cCoolTime ; pIED->cTestState = TEST_COOL1; } else { pIED->cTestState = TEST_NONE; } /* if(IED.DownloadWorkParam.bAutoCly) { pIED->cTestState = TEST_POS_MOVE; MoveSamplePos(IED.PosCtrl.cSamplePos+1); } else { pIED->cTestState = TEST_NONE; } */ } break; case TEST_POS_MOVE: if(IED.PosCtrl.cSamplePosMoving==0) //转盘电机停转 pIED->cTestState = TEST_NONE; break; case TEST_COOL1: if(pIED->cCoolTime--==0) { pIED->cTestState = TEST_POS_MOVE; #ifndef AUTOCLY_STAND //MoveSamplePos(IED.PosCtrl.cSamplePos+1); #endif } break; case TEST_INIT2: JB(1); Pumb(1); if(!IED.DownloadWorkParam.bAutoCly) { pIED->cTestState = TEST_INIT; } if((IED.PosCtrl.cDestPos==IED.PosCtrl.cSamplePos) &&(IED.PosCtrl.cSamplePosMoving==0)) { pIED->cTestState = TEST_INIT; } break; default: break; } } void EndDecompose(void *param) { int i = 0; IED_DATABASE *pIED = &IED; DecompseDelayTimer = -1; pIED->cTestState = TEST_END; pIED->cStateTime = 0; while(MovMotor(POS_PUT_SAMPLE)!=0) { if(i++>10) { Beep(10,100); break; } } } int preDJValue = 0; const int DJ_P1 = 5; //电解的比例系数 const int DJ_P2 = 1; //电解的比例系数 const int DJ_D = 10; //电解的微分系数 const int IntDJValue = 30; //如果硫电压在下降,小电流滴定提高精度 long Error = 0; long PreError = 0; long dErr = 0; //得到mV 电压 long GetVoltage(long AdValue) //MAXPREPOOLCNT 32 //GAIN_POL 9 { long mV ; mV = AdValue*DACREF; mV/= MAX_POL_CNT; mV/= GAIN_POL; mV/= 0xFFFL; return mV; } #define DJKP 6L #define LEAKCURRENTDAVALUE 20L //2.45mA double DeltamV; long DJ_DELAY =0; long preAD_POL; void TaskDJ(void) //数字电路电解 { IED_DATABASE *pIED = &IED; long lDEndDJADValue = pIED->DownloadWorkParam.lDEndDJADValue/MAX_POL_CNT; long lChlPol = IED.AdValue.lPreChlPol; //////////////////////////////////////////////////////////////////// //7.1将电解系数降低圆3 后2 看看是否会 好点? long djDAValue = ((AD_POL-lDEndDJADValue)*DJKP)*R_SENSOR/GAIN_POL/2; // 15/9 //if(preAD_POL-AD_POL>10) djDAValue += (AD_POL-preAD_POL)*5; //快速下降关闭电解 //是否根据当前值和平均值的差值极性判断上升还是下降,控制电流的提前量 //GetPolVol2 反应速度快 DeltamV = GetPolVol2()-GetPolVol(); if(DJ_DELAY>0) { DJ_DELAY++; djDAValue=0 ; if(DJ_DELAY>50) //延迟1S DJ_DELAY = 0; } if((DeltamV<-2.0f) //快速下降关闭输出,防止过电解 &&(GetPolVol2()<100.0f) &&(GetPolVol()>50.0f) ) //下降了5mV 启动延迟 { DJ_DELAY = 1; } //if((djDAValueMAXDACOUT*2/3)&&(preAD_POL-AD_POL>10)) djDAValue = 0; //下降2mV 10mS 下降 2mV preAD_POL = AD_POL; //AD/4096*5000/9 //减少小电机电压的滤波,让电解电流快速反应 //计时的小电机电压增加滤波数目,让偶尔的尖脉冲不至于影响计时,降低了ADC 的时钟频率 if((djDAValue0)) djDAValue = LEAKCURRENTDAVALUE; StartDigitalDJ_ADV(djDAValue); ////////////////////////////////////////////////////////////////////// }