diff --git a/app_code/main.c b/app_code/main.c index ecddb06..da5ea52 100644 --- a/app_code/main.c +++ b/app_code/main.c @@ -3,7 +3,9 @@ typedef enum { - OUT_INIT = 0, + OUT_INIT=0, + OUT_CELI, + OUT_START, OUT_RUNNING, OUT_AUTOSTOP, OUT_ERR, @@ -17,8 +19,8 @@ typedef enum #define IAP_ADDRESS 0x0000 -#define LED_ON P16 = 1 -#define LED_OFF P16 = 0 +#define LED_ON P16 = 0 +#define LED_OFF P16 = 1 #define WT_30M 0x80 #define WT_24M 0x81 @@ -93,6 +95,9 @@ unsigned int ADC_Average(unsigned int *buff, unsigned int num, unsigned int thre // new void OutPutCtrl(void); + +unsigned char code BUILD_DATA[] = __DATE__ ; +unsigned char code BUILD_TIME[] = __TIME__ ; /***************变量定义**************/ bit busy = 0; bit SendEN = 0; @@ -106,7 +111,7 @@ bit AcqInitFlag = 0; bit AD_Refresh = 0; bit Save_Flag = 0; -bit PWM_ON_EN = 0; +bit STOP_FLAG = 0; unsigned char xdata Rxbuff[20]; unsigned char xdata aRxBufferTemp = 0; @@ -182,10 +187,10 @@ float xdata CurrentError = 0; float xdata AdjVoltage = 0; // 调节电压 float xdata CompensationValue = 0; // 补偿系数 float xdata OutGain = 0; // 输出增益调节 - +float xdata LoadRes = 0; // new OUTSTATE_t xdata OutPutState; -unsigned int xdata InitTimeCnt; +unsigned int xdata InitTimeCnt,ErrTimeCnt; unsigned int xdata TimeBaseCnt, TimeBaseCntLast; bit ledState; unsigned int xdata TargetCurrent; @@ -197,7 +202,7 @@ void main() PWM_Init(); UART1_Init(); ADC_Init(); - + P25 = 0; ES = 1; EA = 1; UartCnt = 0; @@ -210,7 +215,7 @@ void main() Delay10ms(); Delay10ms(); - EEPROM_read_n(IAP_ADDRESS, TableRead, 18); // 从EEPROM读取数据 + EEPROM_read_n(IAP_ADDRESS, TableRead, 4); // 从EEPROM读取数据 if (TableRead[0] == 0x55 && TableRead[1] == 0xaa) { TargetCurrent = (TableRead[2] << 8) + TableRead[3]; @@ -242,17 +247,18 @@ void main() AcqError = 100; OutSet = 10000; DisSet = 16146; - + InitError = 0; OutGain = (float)OutSet / 10000; CalibrationVoltage = SetVoltage; - PWM_TO_DAC(5000, (unsigned int)(CalibrationVoltage * OutGain) + (unsigned int)IA); // 供电电压为:5000MV,负载端输出电压为:CalibrationVoltage,单片机口输出电压为:SetOutVoltage/3 + //PWM_TO_DAC(5000, (unsigned int)(CalibrationVoltage * OutGain) + (unsigned int)IA); // 供电电压为:5000MV,负载端输出电压为:CalibrationVoltage,单片机口输出电压为:SetOutVoltage/3 AcqInitCnt = 0; InitTimeCnt = 0; TimeBaseCnt = 0; TimeBaseCntLast = 0; OutPutState = OUT_INIT; + ErrTimeCnt = 0; while (1) { @@ -270,8 +276,8 @@ void main() } if (TimeBaseCntLast % 1000 == 0) { - ledState = !ledState; - P16 = ledState; + //ledState = !ledState; + //P16 = ledState; } if (TimeBaseCnt >= 10000) { @@ -302,25 +308,83 @@ void OutPutCtrl(void) switch (OutPutState) { case OUT_INIT: - PWM_TO_DAC(5000, 1000); + PWM_TO_DAC(5000, 0); + P25 = 0; InitTimeCnt++; if (InitTimeCnt > 100) + { + InitTimeCnt = 0; + OutPutState = OUT_CELI; + InitError = 0; + } + break; + case OUT_CELI: + PWM_TO_DAC(5000, 0); + InitTimeCnt++; + InitError += OutCurrent; + if (InitTimeCnt >= 10) + { + InitError /= 10; + InitTimeCnt = 0; + OutPutState = OUT_START; + OutputVol = 500; + } + if (OutCurrent > 30000) + { + ErrTimeCnt++; + if (ErrTimeCnt > 3) + { + OutPutState = OUT_ERR; + } + + } + else + { + ErrTimeCnt = 0; + } + + break; + case OUT_START: + PWM_TO_DAC(5000, OutputVol); + InitTimeCnt++; + if (InitTimeCnt > 40) { InitTimeCnt = 0; OutPutState = OUT_RUNNING; - OutputVol = 1000; + } + if (OutCurrent > 30000) + { + ErrTimeCnt++; + if (ErrTimeCnt > 50)//500ms + { + OutPutState = OUT_ERR; + } + + } + else + { + ErrTimeCnt = 0; } break; case OUT_RUNNING: - if (OutCurrent > TargetCurrent + 20) + if (OutCurrent > InitError) + { + OutCurrent -= InitError; + } + else + { + OutCurrent = 0; + } + LoadRes = (float)OutVoltage / (OutCurrent/100); + if (OutCurrent > TargetCurrent + 10) { if (OutputVol > 100) { OutputVol--; } } - else if (OutCurrent < TargetCurrent - 20) + else if (OutCurrent < TargetCurrent - 10) { if (OutputVol < 5000) { @@ -328,19 +392,42 @@ void OutPutCtrl(void) } } PWM_TO_DAC(5000, OutputVol); + if (OutCurrent >= 100 && OutCurrent <= 10000) + { + LED_ON; + } + else + { + LED_OFF; + } + if (OutCurrent > 10000) + { + ErrTimeCnt++; + if (ErrTimeCnt > 10)//100ms + { + OutPutState = OUT_ERR; + } + + } + else + { + ErrTimeCnt = 0; + } + break; case OUT_AUTOSTOP: break; case OUT_ERR: + LED_OFF; break; default: break; } } -void turnOFFOutput(void) +void turnOFFOutput(void) { - PWM_ON_EN = 1; + STOP_FLAG = 1; Shut_Hour = 0; Shut_Min = 0; Shut_Sec = 0; @@ -352,7 +439,7 @@ void turnOFFOutput(void) void AutoAction(void) { - if (PWM_ON_EN == 0) // PWM输出使能 + if (STOP_FLAG == 0) // PWM输出使能 { if (AcqVolatage >= Limitvoltage) // 采集电压大于1500mV,或电流小于0.5mA,关闭输出 { @@ -1505,14 +1592,10 @@ void DataParsing(void) { if (Uart1Ready_R == 1) // 数据接收完成,处理接收到的数据 { - // 按键返回 if (Rxbuff[0] == 0x02) { - // 参数复位 - TargetCurrent = Rxbuff[1] << 8 + Rxbuff[2]; - // 参数掉电保存(直接调用函数) + TargetCurrent = (Rxbuff[1] << 8) + Rxbuff[2]; Save_Flag = 1; - // Parameter_Save(); } } Uart1Ready_R = 0; @@ -1540,10 +1623,10 @@ void UartSendData(void) SendBuffer[0] = 0x55; SendBuffer[1] = 0xAA; - SendBuffer[2] = RunTime >> 8; // 运行时间H - SendBuffer[3] = RunTime; // 运行时间L - SendBuffer[4] = InVoltage >> 8; // 输入电压H - SendBuffer[5] = InVoltage; // 输入电压L + SendBuffer[2] = (unsigned int)LoadRes >> 8; // 运行时间H + SendBuffer[3] = (unsigned int)LoadRes; // 运行时间L + SendBuffer[4] = InitError >> 8; // 输入电压H + SendBuffer[5] = InitError; // 输入电压L SendBuffer[6] = OutVoltage >> 8; // 输出电压H SendBuffer[7] = OutVoltage; // 输出电压L SendBuffer[8] = OutCurrent >> 8; // 输出电流H @@ -1637,7 +1720,7 @@ void TM0_Isr() interrupt 1 using 1 AcqInitCnt++; TimeBaseCnt++; /*** 新增2019-11-14 ***/ - if (PWM_ON_EN) + if (STOP_FLAG) { Shut_MS++; if (Shut_MS >= 1000) @@ -1654,7 +1737,7 @@ void TM0_Isr() interrupt 1 using 1 if (Shut_Min >= 180) // 大于3小时,恢复工作 { - PWM_ON_EN = 0; + STOP_FLAG = 0; Shut_Hour = 0; Shut_Min = 0; Shut_Sec = 0; @@ -1681,13 +1764,6 @@ void TM0_Isr() interrupt 1 using 1 { Time_Min = 0; RunTime++; - - Save_Cnt++; - if ((Save_Cnt > 0) && ((Save_Cnt % 5) == 0)) - { - Save_Flag = 1; // 运行参数1个小时保存一次 - Save_Cnt = 0; - } } } }