Compare commits

...

2 Commits

Author SHA1 Message Date
e046637625 修复接收数据处理BUG 2025-07-08 09:10:07 +08:00
72ea368472 增加上电检测电流误差 2025-07-08 08:16:00 +08:00

View File

@ -3,7 +3,9 @@
typedef enum typedef enum
{ {
OUT_INIT = 0, OUT_INIT=0,
OUT_CELI,
OUT_START,
OUT_RUNNING, OUT_RUNNING,
OUT_AUTOSTOP, OUT_AUTOSTOP,
OUT_ERR, OUT_ERR,
@ -93,6 +95,9 @@ unsigned int ADC_Average(unsigned int *buff, unsigned int num, unsigned int thre
// new // new
void OutPutCtrl(void); void OutPutCtrl(void);
unsigned char code BUILD_DATA[] = __DATE__ ;
unsigned char code BUILD_TIME[] = __TIME__ ;
/***************变量定义**************/ /***************变量定义**************/
bit busy = 0; bit busy = 0;
bit SendEN = 0; bit SendEN = 0;
@ -106,7 +111,7 @@ bit AcqInitFlag = 0;
bit AD_Refresh = 0; bit AD_Refresh = 0;
bit Save_Flag = 0; bit Save_Flag = 0;
bit PWM_ON_EN = 0; bit STOP_FLAG = 0;
unsigned char xdata Rxbuff[20]; unsigned char xdata Rxbuff[20];
unsigned char xdata aRxBufferTemp = 0; unsigned char xdata aRxBufferTemp = 0;
@ -185,7 +190,7 @@ float xdata OutGain = 0; // 输出增益调节
// new // new
OUTSTATE_t xdata OutPutState; OUTSTATE_t xdata OutPutState;
unsigned int xdata InitTimeCnt; unsigned int xdata InitTimeCnt,ErrTimeCnt;
unsigned int xdata TimeBaseCnt, TimeBaseCntLast; unsigned int xdata TimeBaseCnt, TimeBaseCntLast;
bit ledState; bit ledState;
unsigned int xdata TargetCurrent; unsigned int xdata TargetCurrent;
@ -197,7 +202,7 @@ void main()
PWM_Init(); PWM_Init();
UART1_Init(); UART1_Init();
ADC_Init(); ADC_Init();
P25 = 0;
ES = 1; ES = 1;
EA = 1; EA = 1;
UartCnt = 0; UartCnt = 0;
@ -210,7 +215,7 @@ void main()
Delay10ms(); Delay10ms();
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) if (TableRead[0] == 0x55 && TableRead[1] == 0xaa)
{ {
TargetCurrent = (TableRead[2] << 8) + TableRead[3]; TargetCurrent = (TableRead[2] << 8) + TableRead[3];
@ -242,17 +247,18 @@ void main()
AcqError = 100; AcqError = 100;
OutSet = 10000; OutSet = 10000;
DisSet = 16146; DisSet = 16146;
InitError = 0;
OutGain = (float)OutSet / 10000; OutGain = (float)OutSet / 10000;
CalibrationVoltage = SetVoltage; 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; AcqInitCnt = 0;
InitTimeCnt = 0; InitTimeCnt = 0;
TimeBaseCnt = 0; TimeBaseCnt = 0;
TimeBaseCntLast = 0; TimeBaseCntLast = 0;
OutPutState = OUT_INIT; OutPutState = OUT_INIT;
ErrTimeCnt = 0;
while (1) while (1)
{ {
@ -270,8 +276,8 @@ void main()
} }
if (TimeBaseCntLast % 1000 == 0) if (TimeBaseCntLast % 1000 == 0)
{ {
ledState = !ledState; //ledState = !ledState;
P16 = ledState; //P16 = ledState;
} }
if (TimeBaseCnt >= 10000) if (TimeBaseCnt >= 10000)
{ {
@ -302,25 +308,82 @@ void OutPutCtrl(void)
switch (OutPutState) switch (OutPutState)
{ {
case OUT_INIT: case OUT_INIT:
PWM_TO_DAC(5000, 1000); PWM_TO_DAC(5000, 0);
P25 = 0;
InitTimeCnt++; InitTimeCnt++;
if (InitTimeCnt > 100) 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; InitTimeCnt = 0;
OutPutState = OUT_RUNNING; OutPutState = OUT_RUNNING;
OutputVol = 1000; }
if (OutCurrent > 30000)
{
ErrTimeCnt++;
if (ErrTimeCnt > 50)//500ms
{
OutPutState = OUT_ERR;
}
}
else
{
ErrTimeCnt = 0;
} }
break; break;
case OUT_RUNNING: case OUT_RUNNING:
if (OutCurrent > TargetCurrent + 20) if (OutCurrent > InitError)
{
OutCurrent -= InitError;
}
else
{
OutCurrent = 0;
}
if (OutCurrent > TargetCurrent + 10)
{ {
if (OutputVol > 100) if (OutputVol > 100)
{ {
OutputVol--; OutputVol--;
} }
} }
else if (OutCurrent < TargetCurrent - 20) else if (OutCurrent < TargetCurrent - 10)
{ {
if (OutputVol < 5000) if (OutputVol < 5000)
{ {
@ -328,19 +391,42 @@ void OutPutCtrl(void)
} }
} }
PWM_TO_DAC(5000, OutputVol); 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; break;
case OUT_AUTOSTOP: case OUT_AUTOSTOP:
break; break;
case OUT_ERR: case OUT_ERR:
LED_OFF;
break; break;
default: default:
break; break;
} }
} }
void turnOFFOutput(void) void turnOFFOutput(void)
{ {
PWM_ON_EN = 1; STOP_FLAG = 1;
Shut_Hour = 0; Shut_Hour = 0;
Shut_Min = 0; Shut_Min = 0;
Shut_Sec = 0; Shut_Sec = 0;
@ -352,7 +438,7 @@ void turnOFFOutput(void)
void AutoAction(void) void AutoAction(void)
{ {
if (PWM_ON_EN == 0) // PWM输出使能 if (STOP_FLAG == 0) // PWM输出使能
{ {
if (AcqVolatage >= Limitvoltage) // 采集电压大于1500mV,或电流小于0.5mA,关闭输出 if (AcqVolatage >= Limitvoltage) // 采集电压大于1500mV,或电流小于0.5mA,关闭输出
{ {
@ -1505,14 +1591,10 @@ void DataParsing(void)
{ {
if (Uart1Ready_R == 1) // 数据接收完成,处理接收到的数据 if (Uart1Ready_R == 1) // 数据接收完成,处理接收到的数据
{ {
// 按键返回
if (Rxbuff[0] == 0x02) if (Rxbuff[0] == 0x02)
{ {
// 参数复位 TargetCurrent = (Rxbuff[1] << 8) + Rxbuff[2];
TargetCurrent = Rxbuff[1] << 8 + Rxbuff[2];
// 参数掉电保存(直接调用函数)
Save_Flag = 1; Save_Flag = 1;
// Parameter_Save();
} }
} }
Uart1Ready_R = 0; Uart1Ready_R = 0;
@ -1542,8 +1624,8 @@ void UartSendData(void)
SendBuffer[2] = RunTime >> 8; // 运行时间H SendBuffer[2] = RunTime >> 8; // 运行时间H
SendBuffer[3] = RunTime; // 运行时间L SendBuffer[3] = RunTime; // 运行时间L
SendBuffer[4] = InVoltage >> 8; // 输入电压H SendBuffer[4] = InitError >> 8; // 输入电压H
SendBuffer[5] = InVoltage; // 输入电压L SendBuffer[5] = InitError; // 输入电压L
SendBuffer[6] = OutVoltage >> 8; // 输出电压H SendBuffer[6] = OutVoltage >> 8; // 输出电压H
SendBuffer[7] = OutVoltage; // 输出电压L SendBuffer[7] = OutVoltage; // 输出电压L
SendBuffer[8] = OutCurrent >> 8; // 输出电流H SendBuffer[8] = OutCurrent >> 8; // 输出电流H
@ -1637,7 +1719,7 @@ void TM0_Isr() interrupt 1 using 1
AcqInitCnt++; AcqInitCnt++;
TimeBaseCnt++; TimeBaseCnt++;
/*** 新增2019-11-14 ***/ /*** 新增2019-11-14 ***/
if (PWM_ON_EN) if (STOP_FLAG)
{ {
Shut_MS++; Shut_MS++;
if (Shut_MS >= 1000) if (Shut_MS >= 1000)
@ -1654,7 +1736,7 @@ void TM0_Isr() interrupt 1 using 1
if (Shut_Min >= 180) // 大于3小时恢复工作 if (Shut_Min >= 180) // 大于3小时恢复工作
{ {
PWM_ON_EN = 0; STOP_FLAG = 0;
Shut_Hour = 0; Shut_Hour = 0;
Shut_Min = 0; Shut_Min = 0;
Shut_Sec = 0; Shut_Sec = 0;
@ -1681,13 +1763,6 @@ void TM0_Isr() interrupt 1 using 1
{ {
Time_Min = 0; Time_Min = 0;
RunTime++; RunTime++;
Save_Cnt++;
if ((Save_Cnt > 0) && ((Save_Cnt % 5) == 0))
{
Save_Flag = 1; // 运行参数1个小时保存一次
Save_Cnt = 0;
}
} }
} }
} }