From 72ea368472685914def2d1f1d18e79bda8d28174 Mon Sep 17 00:00:00 2001 From: sunbeam0529 Date: Tue, 8 Jul 2025 08:16:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=8A=E7=94=B5=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E7=94=B5=E6=B5=81=E8=AF=AF=E5=B7=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app_code/main.c | 130 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 103 insertions(+), 27 deletions(-) diff --git a/app_code/main.c b/app_code/main.c index ecddb06..7ecd0db 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, @@ -106,7 +108,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; @@ -185,7 +187,7 @@ float xdata OutGain = 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 +199,7 @@ void main() PWM_Init(); UART1_Init(); ADC_Init(); - + P25 = 0; ES = 1; EA = 1; UartCnt = 0; @@ -210,7 +212,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 +244,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 +273,8 @@ void main() } if (TimeBaseCntLast % 1000 == 0) { - ledState = !ledState; - P16 = ledState; + //ledState = !ledState; + //P16 = ledState; } if (TimeBaseCnt >= 10000) { @@ -302,25 +305,82 @@ 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; + } + if (OutCurrent > TargetCurrent + 10) { if (OutputVol > 100) { OutputVol--; } } - else if (OutCurrent < TargetCurrent - 20) + else if (OutCurrent < TargetCurrent - 10) { if (OutputVol < 5000) { @@ -328,19 +388,42 @@ void OutPutCtrl(void) } } PWM_TO_DAC(5000, OutputVol); + if (OutCurrent >= 100 && OutCurrent <= 10000) + { + LED_ON; + } + else + { + LED_OFF; + } + if (OutCurrent > 30000) + { + ErrTimeCnt++; + if (ErrTimeCnt > 50)//500ms + { + OutPutState = OUT_ERR; + } + + } + else + { + ErrTimeCnt = 0; + } + break; case OUT_AUTOSTOP: break; case OUT_ERR: + LED_OFF; break; default: break; } } -void turnOFFOutput(void) +void (void) { - PWM_ON_EN = 1; + STOP_FLAG = 1; Shut_Hour = 0; Shut_Min = 0; Shut_Sec = 0; @@ -352,7 +435,7 @@ void turnOFFOutput(void) void AutoAction(void) { - if (PWM_ON_EN == 0) // PWM输出使能 + if (STOP_FLAG == 0) // PWM输出使能 { if (AcqVolatage >= Limitvoltage) // 采集电压大于1500mV,或电流小于0.5mA,关闭输出 { @@ -1542,8 +1625,8 @@ void UartSendData(void) SendBuffer[2] = RunTime >> 8; // 运行时间H SendBuffer[3] = RunTime; // 运行时间L - SendBuffer[4] = InVoltage >> 8; // 输入电压H - SendBuffer[5] = InVoltage; // 输入电压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; - } } } }