From 72ea368472685914def2d1f1d18e79bda8d28174 Mon Sep 17 00:00:00 2001 From: sunbeam0529 Date: Tue, 8 Jul 2025 08:16:00 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=8A=E7=94=B5?= =?UTF-8?q?=E6=A3=80=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; - } } } } From e0466376254927de7008e6ab699ba640f8f6a7d8 Mon Sep 17 00:00:00 2001 From: sunbeam0529 Date: Tue, 8 Jul 2025 09:10:07 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=8E=A5=E6=94=B6?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=A4=84=E7=90=86BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app_code/main.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/app_code/main.c b/app_code/main.c index 7ecd0db..0528952 100644 --- a/app_code/main.c +++ b/app_code/main.c @@ -95,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; @@ -421,7 +424,7 @@ void OutPutCtrl(void) } } -void (void) +void turnOFFOutput(void) { STOP_FLAG = 1; Shut_Hour = 0; @@ -1588,14 +1591,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; From 0df7ea6350fa7429ea07b9f7d757756b471c3005 Mon Sep 17 00:00:00 2001 From: sunbeam0529 Date: Tue, 8 Jul 2025 14:49:08 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=BE=93=E5=87=BA?= =?UTF-8?q?=E7=94=B5=E5=B9=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app_code/main.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/app_code/main.c b/app_code/main.c index 0528952..da5ea52 100644 --- a/app_code/main.c +++ b/app_code/main.c @@ -19,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 @@ -187,7 +187,7 @@ 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,ErrTimeCnt; @@ -376,6 +376,7 @@ void OutPutCtrl(void) { OutCurrent = 0; } + LoadRes = (float)OutVoltage / (OutCurrent/100); if (OutCurrent > TargetCurrent + 10) { if (OutputVol > 100) @@ -399,10 +400,10 @@ void OutPutCtrl(void) { LED_OFF; } - if (OutCurrent > 30000) + if (OutCurrent > 10000) { ErrTimeCnt++; - if (ErrTimeCnt > 50)//500ms + if (ErrTimeCnt > 10)//100ms { OutPutState = OUT_ERR; } @@ -1622,8 +1623,8 @@ void UartSendData(void) SendBuffer[0] = 0x55; SendBuffer[1] = 0xAA; - SendBuffer[2] = RunTime >> 8; // 运行时间H - SendBuffer[3] = RunTime; // 运行时间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