From 096bd938ce5a1c3643695bc8f6818e8e1fd3c064 Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Wed, 19 Feb 2020 11:30:46 +0200 Subject: bug fixes before version 1.4.6.12 --- Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules/Control') diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c index 2c7512129..dec526668 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c @@ -569,6 +569,7 @@ void setRapidPressureRead(bool value) } uint16_t PumpCounter = 0; +uint16_t realtimetest[101]; uint32_t MillisecLowLoop(uint32_t tick) { uint8_t Motor_i,Disp_i,temp; @@ -598,6 +599,7 @@ uint32_t MillisecLowLoop(uint32_t tick) Onesecond_Tick = (tick%eOneSecond == 0) ?true:false; OneMinute_Tick = (tick%eOneMinute == 0) ?true:false; OneHourTick = (tick%eOneHour == 0) ?true:false; + realtimetest[(tick%1000)/10]++; //gather Motor data from FPGA //ROM_IntMasterDisable(); int StartPT100 = 0; @@ -720,8 +722,8 @@ uint32_t MillisecLowLoop(uint32_t tick) } Trigger_WHS_PT100_Read_All(); Trigger_WHS_MAX11614_Read_allADC(); - WHS_Blower_Avarege_ORF1(); //drier - WHS_Blower_Avarege_ORF3(); //head + //WHS_Blower_Avarege_ORF1(); //drier + //WHS_Blower_Avarege_ORF3(); //head Trigger_WHSReadAllFanTacho (); } if (OneMinute_Tick) -- cgit v1.3.1 From 55953df8a7753da1477dcf1db5484db342b3c906 Mon Sep 17 00:00:00 2001 From: Shai Frieder Date: Wed, 19 Feb 2020 16:45:35 +0200 Subject: control the blower acording to Q value --- .../WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.c | 50 ++++++++++++++++------ .../WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.h | 7 ++- .../Embedded/Modules/Control/MillisecTask.c | 5 ++- .../Embedded/Modules/Stubs_Handler/Progress.c | 2 +- 4 files changed, 46 insertions(+), 18 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules/Control') diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.c index 384e3cd59..c68073238 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.c @@ -28,6 +28,8 @@ double average_Q_orifice1; double average_Q_orifice3; bool ORF1_flageNewBlowerValue; bool ORF3_flageNewBlowerValue; +double SetPoint_Q = 0.0; +bool CofigurationFlow = 1; int32_t i2c_smbus_write_word_data(int i2cFileDescriptor, uint8_t command_regAddress, uint16_t regValue) { @@ -220,7 +222,7 @@ double WHS_Blower_Avarege_ORF1() i += 1; } sum_orifice_Q -= average_orf1_Q_buff[i]; - get_orf_1(&orifice_hex_value ); + //get_orf_1(&orifice_hex_value ); average_orf1_Q_buff[i] = get_Q(orifice_hex_value); sum_orifice_Q += average_orf1_Q_buff[i]; average_Q_orifice1 = sum_orifice_Q / ORF_BUFF_SIZE; @@ -269,6 +271,20 @@ double WHS_Blower_Avarege_ORF3() return average_Q_orifice3; } +double get_ORF1_Q() +{ + uint16_t tempu16 = 0; + get_orf_1(&tempu16); + return get_Q(tempu16); +} + +double get_ORF3_Q() +{ + uint16_t tempu16 = 0; + get_orf_3(&tempu16); + return get_Q(tempu16); +} + double get_average_ORF1_Q() { return average_Q_orifice1; @@ -298,8 +314,8 @@ bool Test_WHS_blower() return status; } #define SET_DYEING_HEAD_ORRIFFICE_SENSOR headairflow //todo -#define LARGE_STEP 10 //todo define the correct number -#define SMALL_STEP 1 //todo define the correct number +#define LARGE_STEP 100 //todo define the correct number +#define SMALL_STEP 10 //todo define the correct number bool WHS_Set_Blower_Control_Closed_Loop(double SetPoint_Q) { @@ -307,13 +323,15 @@ bool WHS_Set_Blower_Control_Closed_Loop(double SetPoint_Q) double current_dying_head_flow_Q = 0; uint16_t volt; - +double tmp = 0.0; current_dying_head_flow_Q = get_average_ORF3_Q(); ReportWithPackageFilter(WasteFilter,"------------ current_dying_head_flow_Q =-----------------", __FILE__,__LINE__, current_dying_head_flow_Q, RpMessage, 0, 0); ReportWithPackageFilter(WasteFilter,"------------ SET_DYEING_HEAD_ORRIFFICE_SENSOR =-----------------", __FILE__,__LINE__, SET_DYEING_HEAD_ORRIFFICE_SENSOR, RpMessage, current_dying_head_flow_Q, 0); - while (abs(current_dying_head_flow_Q - SetPoint_Q) > 0.2) + tmp = abs((current_dying_head_flow_Q*10) - (SetPoint_Q*10)); + + if (tmp > (0.2 * 10)) { - volt = getBlowerState(); + volt = g_MAX5805_device.CODE;//getBlowerState(); if (current_dying_head_flow_Q < SetPoint_Q) { if (( SetPoint_Q - current_dying_head_flow_Q) > 0.5) @@ -352,18 +370,21 @@ bool WHS_Set_Blower_Control_Closed_Loop(double SetPoint_Q) return OK; } -void WHS_Start_Blower_Control_Closed_Loop (double SetPoint_Q) +void WHS_Set_SetPoint_Q_value(double value) { - // use 0 to STOP -// uint16_t mVSetpoint = 0; + SetPoint_Q = value; + CofigurationFlow = 0; +} - if(SetPoint_Q) +void WHS_Start_Blower_Control_Closed_Loop () +{ + if(CofigurationFlow) { - WHS_Set_Blower_Control_Closed_Loop(SetPoint_Q); + WHS_Set_Blower_Control_Closed_Loop(headairflow); } else { - // blower off? + WHS_Set_Blower_Control_Closed_Loop(SetPoint_Q); } @@ -383,5 +404,8 @@ return value; } */ - +uint16_t WHS_Get_Volt_Blower_Control() +{ + return g_MAX5805_device.CODE; +} diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.h b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.h index 9f79034bb..344932033 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.h +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.h @@ -16,16 +16,19 @@ int16_t Write_Max5805_LDACn(bool value); bool WHS_init_Blower(void); bool WHS_Set_Volt_Blower_Control(uint16_t volt); +uint16_t WHS_Get_Volt_Blower_Control(void); bool Write_MAX5805_REF(void); bool Test_WHS_blower(void); double WHS_Blower_Avarege_ORF1(void); double WHS_Blower_Avarege_ORF3(void); double get_average_ORF1_Q(void); double get_average_ORF3_Q(void); +double get_ORF1_Q(); +double get_ORF3_Q(); bool WHS_Set_Blower_Control_Closed_Loop(double SetPoint); -void WHS_Start_Blower_Control_Closed_Loop (double SetPoint); +void WHS_Start_Blower_Control_Closed_Loop (); double WHS_Get_Blower_Control_Closed_Loop_SetPoint(void); - +void WHS_Set_SetPoint_Q_value(double value); extern double headairflow; /* from Blower.h diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c index dec526668..fe350d78d 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c @@ -722,9 +722,10 @@ uint32_t MillisecLowLoop(uint32_t tick) } Trigger_WHS_PT100_Read_All(); Trigger_WHS_MAX11614_Read_allADC(); - //WHS_Blower_Avarege_ORF1(); //drier - //WHS_Blower_Avarege_ORF3(); //head + WHS_Blower_Avarege_ORF1(); //drier + WHS_Blower_Avarege_ORF3(); //head Trigger_WHSReadAllFanTacho (); + WHS_Start_Blower_Control_Closed_Loop (); } if (OneMinute_Tick) { diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c index 98fb74ea7..68df2aa17 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c @@ -121,7 +121,7 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) { if (WHS_Type == WHS_TYPE_NEW) { - WHS_Set_Blower_Control_Closed_Loop (request->delay); + WHS_Set_SetPoint_Q_value((double) request->delay); response.progress = 0; response.has_progress = false; } -- cgit v1.3.1 From a391142a20ab2c47a4ac6c1f6a7f3b77f04b4a92 Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Thu, 20 Feb 2020 11:40:51 +0200 Subject: fix init heating and midtank reading (semaphore and task) --- .../Embedded/Common/report/reportInit.c | 2 +- .../Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c | 31 +++++++++------------- .../WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.c | 4 +-- .../Embedded/Modules/Control/MillisecTask.c | 10 +++---- .../Embedded_SW/Embedded/Modules/General/process.c | 6 ++--- 5 files changed, 24 insertions(+), 29 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules/Control') diff --git a/Software/Embedded_SW/Embedded/Common/report/reportInit.c b/Software/Embedded_SW/Embedded/Common/report/reportInit.c index 8f3cde15f..ef9f2fffb 100644 --- a/Software/Embedded_SW/Embedded/Common/report/reportInit.c +++ b/Software/Embedded_SW/Embedded/Common/report/reportInit.c @@ -481,6 +481,6 @@ STATUS ReportInit(ReportInitParams InitParams) InitFilter = ReportAddFilterPackage("Init"); MaintFilter = ReportAddFilterPackage("Maint"); // Filter = ReportAddFilterPackage(""); - ReportSwitchPackageFilter(WasteFilter,REPORT_OFF); + //ReportSwitchPackageFilter(WasteFilter,REPORT_OFF); return status; } diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c index 008e24681..283249dd1 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c @@ -363,29 +363,24 @@ double Read_MidTank_Pressure_Sensor(MidTank_t MidTank_ID) //0-7 break; } - if (Semaphore_pend(I2C_Sem, BIOS_NO_WAIT)) - { - Status = I2C_ADC_Config(I2C_Slave_Add, Channel); - SysCtlDelay(1); - Status |= I2C_ADC_Set_For_Read_Ch(I2C_Slave_Add); - SysCtlDelay(1); - VsampleInBits = I2C_ADC_Read_Ch(I2C_Slave_Add); - if (Status) - LOG_ERROR(Status, "I2C actions failed"); - MidTank_Pressure_Bits[MidTank_ID] = VsampleInBits;//just for debug + Status = I2C_ADC_Config(I2C_Slave_Add, Channel); + SysCtlDelay(1); + Status |= I2C_ADC_Set_For_Read_Ch(I2C_Slave_Add); + SysCtlDelay(1); + VsampleInBits = I2C_ADC_Read_Ch(I2C_Slave_Add); + + if (Status) + LOG_ERROR(Status, "I2C actions failed"); + MidTank_Pressure_Bits[MidTank_ID] = VsampleInBits;//just for debug - //MidTank_Pressure[MidTank_ID] = Calculate_Pressure(VsampleInBits) - MidThankReadingOffset; + //MidTank_Pressure[MidTank_ID] = Calculate_Pressure(VsampleInBits) - MidThankReadingOffset; - //MidTank_Pressure[MidTank_ID] = Calculate_correction_MidTank_Pressure(VsampleInBits);//use the Calibration correction equation + //MidTank_Pressure[MidTank_ID] = Calculate_correction_MidTank_Pressure(VsampleInBits);//use the Calibration correction equation - //MidTank_Pressure[MidTank_ID] = Calculate_MidTank_Liquid(VsampleInBits , Factor);//According to Gal (email 28-Aug-19) + //MidTank_Pressure[MidTank_ID] = Calculate_MidTank_Liquid(VsampleInBits , Factor);//According to Gal (email 28-Aug-19) - MidTank_Pressure[MidTank_ID] = Calc_Calibration_MidTank_Liquid(VsampleInBits, MidTank_ID ); - Semaphore_post(I2C_Sem); - } - else - Report("Read_MidTank_Pressure_Sensor",__FILE__,__LINE__,255,RpWarning,0,0); + MidTank_Pressure[MidTank_ID] = Calc_Calibration_MidTank_Liquid(VsampleInBits, MidTank_ID ); return MidTank_Pressure[MidTank_ID]; diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.c index 728b7d3d1..5c8cf5cfb 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.c @@ -30,7 +30,7 @@ double average_Q_orifice1; double average_Q_orifice3; bool ORF1_flageNewBlowerValue; bool ORF3_flageNewBlowerValue; -double SetPoint_Q = 0.0; +double SetPoint_Q = 5.0; bool CofigurationFlow = 1; int32_t i2c_smbus_write_word_data(int i2cFileDescriptor, uint8_t command_regAddress, uint16_t regValue) @@ -380,7 +380,7 @@ void WHS_Set_SetPoint_Q_value(double value) void WHS_Start_Blower_Control_Closed_Loop () { - if (GetMachineState()headzone6temp > MAX_ALLOWED_TEMPERATURE) status = ERROR_CODE__INVALID_PARAMETER; if (status != 0) return status; - if (GetMachineState() Date: Thu, 20 Feb 2020 14:05:26 +0200 Subject: bugs fix - job abort --- Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c | 11 +++++++---- Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules/Control') diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c index ff0353b23..1cc8e766b 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c @@ -722,10 +722,13 @@ uint32_t MillisecLowLoop(uint32_t tick) PressureCalc[Disp_i] = MillisecCalculatePressures(Disp_i); } } - Trigger_WHS_PT100_Read_All(); - WHS_Blower_Avarege_ORF1(); //drier - WHS_Blower_Avarege_ORF3(); //head - WHS_Start_Blower_Control_Closed_Loop (); + if (WHS_Type == WHS_TYPE_NEW) + { + Trigger_WHS_PT100_Read_All(); + WHS_Blower_Avarege_ORF1(); //drier + WHS_Blower_Avarege_ORF3(); //head + WHS_Start_Blower_Control_Closed_Loop (); + } } if (OneMinute_Tick) { diff --git a/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c b/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c index 7eb621c81..f295f2475 100644 --- a/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c +++ b/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c @@ -930,7 +930,6 @@ void SendJobProgress(double ProcessedLength, int SegmentId, bool done, char *Mes responseContainer.has_continuous = true; responseContainer.continuous = true; - container_buffer = my_malloc(message_container__get_packed_size(&responseContainer)); if (done == true) { if(JobEndReason != JOB_OK) @@ -945,6 +944,7 @@ void SendJobProgress(double ProcessedLength, int SegmentId, bool done, char *Mes responseContainer.error = ERROR_CODE__CONTINUOUS_RESPONSE_ABORTED; } } + container_buffer = my_malloc(message_container__get_packed_size(&responseContainer)); if (container_buffer) { size_t container_size = message_container__pack(&responseContainer, container_buffer); -- cgit v1.3.1 From 2f0962db91caa293c9eb43f511c18f25acf9a603 Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Tue, 25 Feb 2020 11:39:27 +0200 Subject: Current handling supported --- .../Embedded/Common/report/reportInit.c | 4 +-- Software/Embedded_SW/Embedded/DataDef.h | 2 ++ .../Embedded/Drivers/ADC_Sampling/ADC.h | 4 +++ .../Embedded/Drivers/ADC_Sampling/ADC_VAC.c | 8 +++++- .../Embedded/Modules/Control/MillisecTask.c | 3 ++- .../Embedded/Modules/Heaters/Heaters_ex.h | 1 + .../Embedded/Modules/Heaters/Heaters_print.c | 23 +++++++++++++---- .../Embedded/Modules/Stubs_Handler/Progress.c | 12 +++++++++ .../StateMachines/Initialization/InitSequence.c | 30 ++++++++++++++-------- 9 files changed, 68 insertions(+), 19 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules/Control') diff --git a/Software/Embedded_SW/Embedded/Common/report/reportInit.c b/Software/Embedded_SW/Embedded/Common/report/reportInit.c index 8f3cde15f..818e0d938 100644 --- a/Software/Embedded_SW/Embedded/Common/report/reportInit.c +++ b/Software/Embedded_SW/Embedded/Common/report/reportInit.c @@ -86,7 +86,7 @@ uint32_t OpenLogFile(void) { if (LogFileHandle->fsize < 100000) f_lseek(LogFileHandle, LogFileHandle->fsize); - len = usnprintf(message, 80, "\r\n Log File %s %s",__DATE__, __TIME__); + len = usnprintf(message, 80, "Log File %s %s",__DATE__, __TIME__); LogFresult = f_write(LogFileHandle,message,len,&Bytes ); }*/ return LogFresult; @@ -110,7 +110,7 @@ uint32_t LogToFile(char *message, /* The formatted message /* uint32_t Bytes = 0; int len; - len = usnprintf(message, 300, "\r\n %s, file %s line %d code %d sev %d,param %d",message,FileName, LineNumber,errorCode, Severity, parameter); + len = usnprintf(message, 300, "%s, file %s line %d code %d sev %d,param %d",message,FileName, LineNumber,errorCode, Severity, parameter); LogFresult = f_write(LogFileHandle,message,len,&Bytes );*/ return LogFresult; diff --git a/Software/Embedded_SW/Embedded/DataDef.h b/Software/Embedded_SW/Embedded/DataDef.h index 716ae7fe4..3aaa38c2e 100644 --- a/Software/Embedded_SW/Embedded/DataDef.h +++ b/Software/Embedded_SW/Embedded/DataDef.h @@ -25,6 +25,8 @@ #define USE_POWERSTEP01 +//#define VAC_TEST + //#define SPECIAL_DISPENSERS //#define Use_Head_Card //for real card only //#define Use_WHS_Card //for real card only diff --git a/Software/Embedded_SW/Embedded/Drivers/ADC_Sampling/ADC.h b/Software/Embedded_SW/Embedded/Drivers/ADC_Sampling/ADC.h index 2d5a95c2a..03d333e04 100644 --- a/Software/Embedded_SW/Embedded/Drivers/ADC_Sampling/ADC.h +++ b/Software/Embedded_SW/Embedded/Drivers/ADC_Sampling/ADC.h @@ -66,6 +66,10 @@ uint8_t Calculate_Gas_Power_Consumption(); uint32_t Read_Dryer_Heaters_Current(HEATERS_CURRENT Heater_ID); void CheckAcInputVoltage(); +#ifdef VAC_TEST +extern double VAC_Test; +#endif + double ReadVAC(); extern PowerControlFlag Power_Control_Flag; diff --git a/Software/Embedded_SW/Embedded/Drivers/ADC_Sampling/ADC_VAC.c b/Software/Embedded_SW/Embedded/Drivers/ADC_Sampling/ADC_VAC.c index d5f7b6a0e..9ca987e66 100644 --- a/Software/Embedded_SW/Embedded/Drivers/ADC_Sampling/ADC_VAC.c +++ b/Software/Embedded_SW/Embedded/Drivers/ADC_Sampling/ADC_VAC.c @@ -16,6 +16,10 @@ #define AcTable_MaxLine 9 #define AcTable_MaxColumn 2 +#ifdef VAC_TEST +double VAC_Test = 230.0; +#endif + double AcLookUpTable[AcTable_MaxLine][AcTable_MaxColumn] = //VAC = 29.5522 * VDC + 3.981;//linear line according to the lookup table { @@ -95,6 +99,8 @@ double ReadVAC() VSensor = (1.96- (VADC/1000)) * 4.64 + 1.96; VAC = VDC2VAC(VSensor); - +#ifdef VAC_TEST + VAC = VAC_Test; +#endif return VAC; //Volts } diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c index 1cc8e766b..00ce306cf 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c @@ -694,6 +694,7 @@ uint32_t MillisecLowLoop(uint32_t tick) if (O600Millisecond_Tick) { Trigger_WHSReadAllFanTacho (); + DrierHeaterVoltageSetup(); if (RapidPressureRead == false) { for (Disp_i = 0;Disp_i < MAX_SYSTEM_DISPENSERS;Disp_i++) @@ -928,7 +929,7 @@ void HundredMicroTimerInterrupt(int ARG0) StoreBuffer[StoreBufferId][StoreBufferCounter++] = dancer2; StoreBuffer[StoreBufferId][StoreBufferCounter++] = dancer3; /*-----------------------*/ - //len = usprintf(&StoreBuffer[StoreBufferId][StoreBufferCounter], "\r\n%d %d %d", dancer1[dancer_count],dancer2[dancer_count],dancer3[dancer_count]); + //len = usprintf(&StoreBuffer[StoreBufferId][StoreBufferCounter], "%d %d %d", dancer1[dancer_count],dancer2[dancer_count],dancer3[dancer_count]); //StoreBufferCounter+=(len+1); /*-----------------------*/ dancer1sum+=dancer1; diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h index 0c6ee94ee..1b5bd3518 100644 --- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h +++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_ex.h @@ -33,6 +33,7 @@ uint32_t LoadHeaterSetPoint(HeaterType HeaterType); void Heaters_SetOverHeatTimeOutValues(uint32_t OverHeatTimeout, uint32_t UnderHeatTimeout); void Heaters_SetOperationLimits(int acheatersloweroperationlimit,int acheatersupperoperationlimit,int dcheatersloweroperationlimit,int dcheatersupperoperationlimit); +uint32_t DrierHeaterVoltageSetup(void); uint32_t HeatersEnd(void); void HeatersControlStop(void); diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c index bc0d1002b..55b8e31c3 100644 --- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c +++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c @@ -1503,13 +1503,16 @@ double TotalCurrentLimit(double VAC) } } -uint32_t DrierHeaterVoltageSetup(double voltage) +uint32_t DrierHeaterVoltageSetup(void) { double DrierAcVoltage = 0.0; char str[100]; bool tempDrier2 = UseSecondaryDrierHeater; + double Z1Current,Z2AssumedCurrent,LimitCurrent; +#ifndef VAC_TEST if (Head_Type > HEAD_TYPE_SYLKO_WITHOUT_CARD) //rapid/pp machines +#endif { DrierAcVoltage = ReadVAC(); if (DrierAcVoltage<=180) @@ -1536,7 +1539,10 @@ uint32_t DrierHeaterVoltageSetup(double voltage) } else { - if ((GetZone2RMSCurrent(DrierAcVoltage)+Get_Heaters_Current(HEATER_DRYER_CURRENT_1))>TotalCurrentLimit(DrierAcVoltage)) + Z1Current = Get_Heaters_Current(HEATER_DRYER_CURRENT_1); + Z2AssumedCurrent = GetZone2RMSCurrent(DrierAcVoltage); + LimitCurrent = TotalCurrentLimit(DrierAcVoltage); + if ((Z2AssumedCurrent+Z1Current)>LimitCurrent) { UseSecondaryDrierHeater = false; } @@ -1546,15 +1552,22 @@ uint32_t DrierHeaterVoltageSetup(double voltage) } } } +#ifndef VAC_TEST else { UseSecondaryDrierHeater = true; } +#endif if (tempDrier2 != UseSecondaryDrierHeater) { - usnprintf(str, 100, "\r\n Changing Drier 2 setting VAC %d D1 Current %d D2 assumed current %d limit %d" - ,DrierAcVoltage,(int)(GetZone2RMSCurrent(DrierAcVoltage)*100),(int)(Get_Heaters_Current(HEATER_DRYER_CURRENT_1)*100),(int)(TotalCurrentLimit(DrierAcVoltage)*100)); + usnprintf(str, 100, "Changing Drier 2 from %d to %d VAC %d D1 Current %d D2 assumed current %d limit %d" ,tempDrier2,UseSecondaryDrierHeater + ,(int)DrierAcVoltage,(int)(Z1Current*100),(int)(Z2AssumedCurrent*100),(int)(LimitCurrent*100)); ReportWithPackageFilter(HeatersFilter,str, __FILE__,__LINE__,DrierAcVoltage, RpMessage, UseSecondaryDrierHeater, 0); + if (UseSecondaryDrierHeater == false) + { + DeActivateHeater (HEATER_TYPE__DryerSecondaryHeater); + } + } return OK; } @@ -1565,7 +1578,7 @@ uint32_t HeatersControlLoop(uint32_t tick) int DcHeaterId; bool AcHeaterDisaster = false; - /*len = usnprintf(str, 100, "\r\n EightMilliSecondHeatersInterrupt SliceCounter %d Owner %d H1000 %d H2000 %d" + /*len = usnprintf(str, 100, " EightMilliSecondHeatersInterrupt SliceCounter %d Owner %d H1000 %d H2000 %d" ,SliceCounter,TimeSliceAllocation[SliceCounter],HeatersRestart,NumberOFSlicesInUse); ReportWithPackageFilter(HeatersFilter,str, __FILE__,__LINE__,0, RpMessage, SliceCounter, TimeSliceAllocation[SliceCounter]); */ diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c index c907f7cb8..12e344b79 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c @@ -664,6 +664,18 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) response.has_progress = true; } +#ifdef VAC_TEST + else + if(request->amount == 0xB6) //fast refresh for pressure + { + LOG_ERROR(request->delay,"set vac read test"); + VAC_Test = (double)request->delay; + response.progress = request->delay; + response.has_progress = true; + + } +#endif + else if(request->amount == 0xC3) //suspend I2C task { diff --git a/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c b/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c index af2178348..0d4dba468 100644 --- a/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c +++ b/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c @@ -120,6 +120,7 @@ uint32_t Start_InitSequence(void) MachineStateDetail = MACHINE_STATE_HW_CONFIG; SetMachineStatus(MACHINE_STATE__PowerUp); HWControlId = AddControlCallback("Init HW Init", InitSequenceCallBackFunction, 4* eOneSecond, TemplateDataReadCBFunction,0,0, 0 ); + Report("AddControlCallback INIT",__FILE__,__LINE__,(int)HWControlId,RpWarning,(int)InitStages,0); InitSchedulerControlId = AddControlCallback("InitScheduler", InitScheduler, eOneSecond, TemplateDataReadCBFunction,0,0, 0 ); return OK; } @@ -268,10 +269,10 @@ double GetZone2RMSCurrent(double VAC) } uint32_t PowerManagementCallBack(uint32_t IfIndex, uint32_t BusyFlag) { - ReportWithPackageFilter(InitFilter,"PowerManagementCallBack", __FILE__,MainHeaterStable,(int)(SecondaryHeaterStable), RpMessage, Maxcount_Heater_Current, 0); - ReportWithPackageFilter(InitFilter,"PowerManagementCallBack", __FILE__,GetHeaterState(HEATER_TYPE__DryerMainHeater),(int)(GetHeaterState(HEATER_TYPE__DryerSecondaryHeater)), RpMessage, Maxcount_Heater_Current, 0); if (WaitForCurrentRaise++ < MaxStabilization) return OK; + ReportWithPackageFilter(InitFilter,"PowerManagementCallBack 1", __FILE__,MainHeaterStable,(int)(SecondaryHeaterStable), RpMessage, Maxcount_Heater_Current, 0); + ReportWithPackageFilter(InitFilter,"PowerManagementCallBack 2", __FILE__,GetHeaterState(HEATER_TYPE__DryerMainHeater),(int)(GetHeaterState(HEATER_TYPE__DryerSecondaryHeater)), RpMessage, Maxcount_Heater_Current, 0); if ((MainHeaterStable == false)&&(Maxcount_Heater_Current= HEAD_TYPE_SYLKO)&&(WHS_Type == WHS_TYPE_NEW)) + //if ((Head_Type >= HEAD_TYPE_SYLKO)&&(WHS_Type == WHS_TYPE_NEW)) { - InitCurrentReadingStable(); - ActivateHeater(HEATER_TYPE__DryerMainHeater); - HWControlId = AddControlCallback("Init Power", PowerManagementCallBack, eHundredMillisecond, TemplateDataReadCBFunction,0,0, 0 ); - ReportWithPackageFilter(InitFilter,"starting main heater ", __FILE__,__LINE__,(int)(StableCurrent*100), RpMessage, Maxcount_Heater_Current, 0); + if (HWControlId == 0xFF) + { + InitCurrentReadingStable(); + ActivateHeater(HEATER_TYPE__DryerMainHeater); + HWControlId = AddControlCallback("Init Power", PowerManagementCallBack, eHundredMillisecond, TemplateDataReadCBFunction,0,0, 0 ); + Report("AddControlCallback INIT",__FILE__,__LINE__,(int)HWControlId,RpWarning,(int)InitStages,0); + ReportWithPackageFilter(InitFilter,"starting main heater ", __FILE__,__LINE__,(int)(StableCurrent*100), RpMessage, Maxcount_Heater_Current, 0); + } + else + ReportWithPackageFilter(InitFilter,"cannot start InitSequencePowerManagementInit", __FILE__,__LINE__,(int)(StableCurrent*100), RpMessage, Maxcount_Heater_Current, 0); } - else - InitStages++; + // else + // InitStages++; return OK; } uint32_t InitSequenceInitialBlowerActivation(void) @@ -362,6 +369,7 @@ uint32_t InitSequenceInitialBlowerActivation(void) Control_Voltage_To_Blower(4200); Set_All_WHS_Fans(200); HWControlId = AddControlCallback("Init Blower", InitSequenceBlowerCallBackFunction, 10* eOneSecond, TemplateDataReadCBFunction,0,0, 0 ); + Report("AddControlCallback INIT",__FILE__,__LINE__,(int)HWControlId,RpWarning,(int)InitStages,0); /*if (RdInkCartridgeSensor()) //if there is a cartridge in the ink slot skip the valves procedure { MidTankOperationCounter = 32; @@ -432,6 +440,7 @@ uint32_t InitSequenceWaitForCooler(void) //cold reset, wait 2 minutes for cooler start // HWControlId = AddControlCallback("Init Cooler", InitSequenceWaitForCoolerCallBackFunction, 2*eOneMinute, TemplateDataReadCBFunction,0,0, 0 ); HWControlId = AddControlCallback("Init Cooler", InitSequenceWaitForCoolerCallBackFunction, 2*eOneSecond, TemplateDataReadCBFunction,0,0, 0 ); + Report("AddControlCallback INIT",__FILE__,__LINE__,(int)HWControlId,RpWarning,(int)InitStages,0); } //InitSequenceStateMachine(InitStages); return OK; @@ -472,13 +481,14 @@ uint32_t InitSequenceStartHeating(void) { MachineStateDetail = MACHINE_STATE_HEATING_STARTED; HWControlId = AddControlCallback("Init Heating", InitSequenceStartHeatingCallBackFunction, 2*eOneSecond, TemplateDataReadCBFunction,0,0, 0 ); + Report("AddControlCallback INIT",__FILE__,__LINE__,(int)HWControlId,RpWarning,(int)InitStages,0); //start heaters with predefined / store process parameters } else { MachineStateDetail = MACHINE_STATE_NO_PROCESS_PARAMS; SetMachineStatus(MACHINE_STATE__Ready); - REPORT_MSG(MachineStateDetail,"InitSequenceStateMachine no processparameters file"); + REPORT_MSG(MachineStateDetail,"InitSequenceStateMachine no process parameters file"); } } else -- cgit v1.3.1 From 124de0fe327a87aca0de1f38b7481cba51a01276 Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Thu, 27 Feb 2020 17:05:48 +0200 Subject: Improvements to the WHS blower control (feature #1561) --- .../WHS_Card/D_MAX11614_ADC/WHS_MAX11614_A2D.c | 84 ++++-- .../WHS_Card/D_MAX11614_ADC/WHS_MAX11614_A2D.h | 48 ++-- .../WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.c | 293 +++++++++++++-------- .../WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.h | 15 +- .../Embedded/Modules/Control/MillisecTask.c | 4 +- .../Embedded/Modules/Stubs_Handler/Progress.c | 48 +++- 6 files changed, 319 insertions(+), 173 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules/Control') diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_MAX11614_ADC/WHS_MAX11614_A2D.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_MAX11614_ADC/WHS_MAX11614_A2D.c index 1e611f65c..d90908b93 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_MAX11614_ADC/WHS_MAX11614_A2D.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_MAX11614_ADC/WHS_MAX11614_A2D.c @@ -26,7 +26,10 @@ uint16_t Orf_zero_value[DRIER_FLOW_METER+1] = {1112,0,1040}; MAX11614 U20_MAX11614 ; -static WHS_Display_View display_view = AVERAGE; +static WHS_Display_View display_view = /*CURRENT*/ AVERAGE; +static WHS_Left_Display_View left_display_view = HeadAVERAGE; +static WHS_Write_Display_View write_display_view = DrierAVERAGE; + //static uint16_t orf1V0Value = 0; //static uint16_t orf3V0Value = 0; @@ -51,10 +54,12 @@ uint32_t WHS_MAX11614_Init () status |= Select_Main_WHS_Mux_Channel(); status |= MAX11614_Init(); + WHS_MAX11614_Read_allADC(); return status; } + uint32_t WHS_MAX11614_Load_OrificeZeroValue (uint16_t O1, uint16_t O3) { @@ -196,18 +201,52 @@ bool Test_WHS_max11614() #define Aorf_ofset 0.0425 //#define Corf_flow 0.2485 #define Corf_flow 0.239 //email from Sergey 3.2.2020 -#define V0 1000 -double get_Q(int16_t num) +//double get_Q(int16_t num) +//{ +// double Sqrt = 0; +// double calc = 0; +// // int16_t tmp = num-orf3V0Value; +// // if (tmp<0) tmp = 0; +// +// Sqrt = sqrt((double)num); +// calc = Corf_flow*Sqrt; +// ReportWithPackageFilter(WasteFilter,"------------ calc Q value (calc)-----------------", __FILE__,__LINE__, calc, RpMessage, num, 0); +// return calc; +//} + +double get_Q(WHS_Flow_Meter num) { double Sqrt = 0; double calc = 0; - int16_t tmp = num-V0; - if (tmp<0) tmp = 0; + uint16_t Vm = 0; + uint16_t V0 = 0; + + switch (num) + { + case DRIER_FLOW_METER: + get_orf_3(&Vm); + V0 = Orf_zero_value[DRIER_FLOW_METER]; + break; - Sqrt = sqrt((double)tmp); - calc = Corf_flow*Sqrt; - ReportWithPackageFilter(WasteFilter,"------------ calc Q value (calc)-----------------", __FILE__,__LINE__, calc, RpMessage, num, 0); + case HEAD_FLOW_METER: + get_orf_1(&Vm); + V0 = Orf_zero_value[HEAD_FLOW_METER]; + break; + default: + break; + } + + if (Vm > V0) + { + Sqrt = sqrt((double)(Vm - V0)); + calc = Corf_flow*Sqrt; + } + else + { + calc = 0; + } + ReportWithPackageFilter(WasteFilter,"------------ calc Q value (calc) (flow num)-----------------", __FILE__,__LINE__, calc, RpMessage, num, 0); return calc; } @@ -246,7 +285,7 @@ bool get_vlev2(uint16_t *value) return status; } -bool get_vlev1(uint16_t *value) // U35 connected to AIN1 +bool get_vlev1(uint16_t *value) // U36 connected to AIN3 { bool status = OK; @@ -287,6 +326,17 @@ bool SetDisplayView(WHS_Display_View view ) return display_view; } +bool SetLeftDisplayView(WHS_Left_Display_View view ) +{ + left_display_view = view; + return left_display_view; +} + +bool SetWriteDisplayView(WHS_Left_Display_View view ) +{ + write_display_view = view; + return write_display_view; +} double GetWHSAirFlow(uint8_t OR_Id) { @@ -295,14 +345,16 @@ double GetWHSAirFlow(uint8_t OR_Id) switch (OR_Id) { case DRIER_FLOW_METER: + if (display_view == AVERAGE) { - Q_value = get_average_ORF3_Q(); + Q_value = get_average_Q(DRIER_FLOW_METER); } else // CURRENT { - get_orf_3(&value); - Q_value = get_Q(value-Orf_zero_value[DRIER_FLOW_METER]); + //get_orf_3(&value); + //Q_value = get_Q(value-orf3V0Value); + Q_value = get_Q(DRIER_FLOW_METER); } break; case NU_FLOW_METER: @@ -311,21 +363,19 @@ double GetWHSAirFlow(uint8_t OR_Id) case HEAD_FLOW_METER: if (display_view == AVERAGE) { - Q_value = get_average_ORF1_Q(); + Q_value = get_average_Q(HEAD_FLOW_METER); } else //CURRENT { get_orf_1(&value); - Q_value = get_Q(value-Orf_zero_value[HEAD_FLOW_METER]); + Q_value = get_Q(HEAD_FLOW_METER); } break; default: break; } - ReportWithPackageFilter(WasteFilter,"------------ GetWHSAirFlow -----------------",__FILE__, OR_Id, (int)value, RpWarning, (int) Orf_zero_value[OR_Id], 0); - - return Q_value ;//get_Q((int16_t)value-Orf_zero_value[OR_Id]); + return Q_value ; } diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_MAX11614_ADC/WHS_MAX11614_A2D.h b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_MAX11614_ADC/WHS_MAX11614_A2D.h index 5826b26eb..0a4f73508 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_MAX11614_ADC/WHS_MAX11614_A2D.h +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_MAX11614_ADC/WHS_MAX11614_A2D.h @@ -6,12 +6,36 @@ #include +typedef enum +{ + HEAD_FLOW_METER = 0, + NU_FLOW_METER, + DRIER_FLOW_METER +}WHS_Flow_Meter; + +typedef enum +{ + CURRENT = 0, + AVERAGE +}WHS_Display_View; +typedef enum +{ + HeadAVERAGE = 0, + DrierAVERAGE +}WHS_Left_Display_View; + +typedef enum +{ + HeadCURRENT = 0, + DrierCURRENT +}WHS_Write_Display_View; uint32_t WHS_MAX11614_Init(void); bool Test_WHS_max11614(void); -double get_Q(int16_t num); +//double get_Q(int16_t num); +double get_Q(WHS_Flow_Meter num); uint32_t WHS_MAX11614_Read_allADC(void); bool get_orf_1(uint16_t *value); @@ -23,25 +47,19 @@ bool get_gas_out(uint16_t *value); bool get_cur_fan(uint16_t *value); bool get_cur_vlv1(uint16_t *value); -typedef enum -{ - HEAD_FLOW_METER = 0, - NU_FLOW_METER, - DRIER_FLOW_METER -}WHS_Flow_Meter; -typedef enum -{ - CURRENT = 0, - AVERAGE -}WHS_Display_View; -uint32_t WHS_MAX11614_Load_OrificeZeroValue (uint16_t O1, uint16_t O3); + + + double GetWHSAirFlow(uint8_t OR_Id); uint16_t GetWHSGasSensor(void); uint16_t GetWHSWasteTankLevel(void); bool SetDisplayView(WHS_Display_View view ); -//uint16_t Get_orf1_V0(void); -//uint16_t Get_orf3_V0(void); +bool SetLeftDisplayView(WHS_Left_Display_View view ); +bool SetWriteDisplayView(WHS_Left_Display_View view ); + +uint16_t Get_orf1_V0(void); +uint16_t Get_orf3_V0(void); #endif /* WHS_MAX11614_H_ */ diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.c index ddf2ca9ea..70c6cb157 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/WHS_Card/D_Max5805_ADC_Blower/WHS_Blower.c @@ -20,6 +20,8 @@ #include "StateMachines/Initialization/InitSequence.h" bool Read_Max5805_device_ID(); +double calc_Q_average(WHS_Flow_Meter ORF_id,double Q_temp); +void set_new_Q_average(WHS_Flow_Meter ORF_id,double Q_temp); uint8_t Read_Buf[2] = {0}; #define ORF_BUFF_SIZE 60 @@ -28,10 +30,11 @@ double average_orf3_Q_buff[ORF_BUFF_SIZE] = {0}; double average_Q_orifice1; double average_Q_orifice3; -bool ORF1_flageNewBlowerValue; -bool ORF3_flageNewBlowerValue; -double SetPoint_Q = 7.0; +bool EnableControlLoop = 1; + +double SetPoint_Q = 5.0; bool CofigurationFlow = 1; +uint8_t close_loop_time = 15; int32_t i2c_smbus_write_word_data(int i2cFileDescriptor, uint8_t command_regAddress, uint16_t regValue) { @@ -121,8 +124,6 @@ bool WHS_Set_Volt_Blower_Control(uint16_t volt) } else { - ORF1_flageNewBlowerValue = 1; - ORF3_flageNewBlowerValue = 1; MAX5805_CODE_LOAD( volt); ReportWithPackageFilter(WasteFilter,"------------ WHS_Set_Volt_Blower_Control (volt)-----------------", __FILE__,__LINE__, volt, RpMessage, 0, 0); } @@ -193,113 +194,133 @@ bool WHS_init_Blower() return status; } -double WHS_Blower_Avarege_ORF1() +double WHS_Blower_Avarege(WHS_Flow_Meter ORF_id) { - static uint8_t i = 0 ; - static double sum_orifice_Q = 0; uint16_t orifice_hex_value = 0; + uint16_t V0_value = 0; double Q_temp = 0 ; + double average_Q = 0.0; - get_orf_1( &orifice_hex_value ); - if (ORF1_flageNewBlowerValue) + switch (ORF_id) { - ORF1_flageNewBlowerValue = 0; - Q_temp = get_Q(orifice_hex_value); - sum_orifice_Q = Q_temp*ORF_BUFF_SIZE; - average_Q_orifice1 = Q_temp; - for (i = 0; i < ORF_BUFF_SIZE; i+=1) - { - average_orf1_Q_buff[i] = Q_temp; - } - ReportWithPackageFilter(WasteFilter,"------------ average_Q_orifice1 hex drier new value-----------------", __FILE__,__LINE__,(int)orifice_hex_value, RpMessage, (average_Q_orifice1*1000), 0); + case HEAD_FLOW_METER: + // get_orf_1( &orifice_hex_value ); + // V0_value = Get_orf1_V0(); + average_Q = average_Q_orifice1; + break; + case DRIER_FLOW_METER: + // get_orf_3( &orifice_hex_value ); + // V0_value = Get_orf3_V0(); + average_Q = average_Q_orifice3; + break; + default: + break; } - else - { - if (i == ORF_BUFF_SIZE) - { - i = 0; - } - else - { - i += 1; - } - sum_orifice_Q -= average_orf1_Q_buff[i]; - average_orf1_Q_buff[i] = get_Q(orifice_hex_value); - sum_orifice_Q += average_orf1_Q_buff[i]; - average_Q_orifice1 = sum_orifice_Q / ORF_BUFF_SIZE; - ReportWithPackageFilter(WasteFilter,"------------ average_Q_orifice1 hex head -----------------", __FILE__,__LINE__,(int)orifice_hex_value, RpMessage, (average_Q_orifice1*1000), 0); - } - return average_Q_orifice1; -} -double WHS_Blower_Avarege_ORF3() -{ - static uint8_t i = 0 ; - static double sum_orifice_Q = 0; - uint16_t orifice_hex_value = 0; - double Q_temp = 0 ; - - get_orf_3( &orifice_hex_value ); - if (ORF3_flageNewBlowerValue) + Q_temp = get_Q(ORF_id); + if (fabs(Q_temp - average_Q) > 1.75) { - ORF3_flageNewBlowerValue = 0; - Q_temp = get_Q(orifice_hex_value); - sum_orifice_Q = Q_temp*60; - average_Q_orifice3= Q_temp; - for (i = 0; i < ORF_BUFF_SIZE; i+=1) - { - average_orf3_Q_buff[i] = Q_temp; - } - ReportWithPackageFilter(WasteFilter,"------------ average_Q_orifice3 hex head new value-----------------", __FILE__,__LINE__,(int)orifice_hex_value, RpMessage, (average_Q_orifice3 * 1000), 0); + set_new_Q_average(ORF_id, Q_temp); + average_Q = Q_temp; } else { - if (i == ORF_BUFF_SIZE) - { - i = 0; - } - else - { - i += 1; - } - sum_orifice_Q -= average_orf3_Q_buff[i]; - average_orf3_Q_buff[i] = get_Q(orifice_hex_value); - sum_orifice_Q += average_orf3_Q_buff[i]; - average_Q_orifice3 = sum_orifice_Q /ORF_BUFF_SIZE; + average_Q = calc_Q_average(ORF_id, Q_temp); } - ReportWithPackageFilter(WasteFilter,"------------ average_Q_orifice3 hex head -----------------", __FILE__,__LINE__,(int)orifice_hex_value, RpMessage, (average_Q_orifice3 * 1000), 0); - return average_Q_orifice3; + return average_Q; } -double get_ORF1_Q() +void set_new_Q_average(WHS_Flow_Meter ORF_id,double Q_temp) { - uint16_t tempu16 = 0; - get_orf_1(&tempu16); - return get_Q(tempu16); -} + uint8_t i = 0; -double get_ORF3_Q() -{ - uint16_t tempu16 = 0; - get_orf_3(&tempu16); - return get_Q(tempu16); + switch (ORF_id) + { + case HEAD_FLOW_METER: + average_Q_orifice1 = Q_temp; + for (i = 0; i < ORF_BUFF_SIZE; i+=1) + { + average_orf1_Q_buff[i] = Q_temp; + } + break; + case DRIER_FLOW_METER: + average_Q_orifice3 = Q_temp; + for (i = 0; i < ORF_BUFF_SIZE; i+=1) + { + average_orf3_Q_buff[i] = Q_temp; + } + break; + default: + break; + } } -double get_average_ORF1_Q() +double calc_Q_average(WHS_Flow_Meter ORF_id,double Q_temp) { - return average_Q_orifice1; + static uint8_t i_head = 0 ; + static uint8_t i_drier = 0 ; + double sum_orifice_Q = 0.0; + double Q_average = 0.0; + + switch (ORF_id) + { + case HEAD_FLOW_METER: + if (i_head == ORF_BUFF_SIZE) + { + i_head = 0; + } + else + { + i_head += 1; + } + sum_orifice_Q = (average_Q_orifice1 * ORF_BUFF_SIZE) - average_orf1_Q_buff[i_head]; + average_orf1_Q_buff[i_head] = Q_temp; + sum_orifice_Q += average_orf1_Q_buff[i_head]; + average_Q_orifice1 = sum_orifice_Q /ORF_BUFF_SIZE; + Q_average = average_Q_orifice1; + break; + case DRIER_FLOW_METER: + if (i_drier == ORF_BUFF_SIZE) + { + i_drier = 0; + } + else + { + i_drier += 1; + } + sum_orifice_Q = (average_Q_orifice3 * ORF_BUFF_SIZE) - average_orf3_Q_buff[i_drier]; + average_orf3_Q_buff[i_drier] = Q_temp; + sum_orifice_Q += average_orf3_Q_buff[i_drier]; + average_Q_orifice3 = sum_orifice_Q /ORF_BUFF_SIZE; + Q_average = average_Q_orifice3; + break; + default: + break; + } + return Q_average; } -double get_average_ORF3_Q() +double get_average_Q(WHS_Flow_Meter ORF_id) { - return average_Q_orifice3; + double average_Q = 0.0; + switch (ORF_id) + { + case HEAD_FLOW_METER: + average_Q = average_Q_orifice1; + break; + case DRIER_FLOW_METER: + average_Q = average_Q_orifice3; + break; + default: + break; + } + return average_Q; } bool Test_WHS_blower() { bool status = OK; - //WHS_init_Blower(); WHS_Set_Volt_Blower_Control(0x0fff); //12 bit 5.0v delayms(4000); WHS_Set_Volt_Blower_Control(0x0c00); //12 bit 3.77v @@ -313,57 +334,76 @@ bool Test_WHS_blower() return status; } -#define SET_DYEING_HEAD_ORRIFFICE_SENSOR headairflow //todo -#define LARGE_STEP 100 //todo define the correct number -#define SMALL_STEP 10 //todo define the correct number +#define STEP_100 100 //todo define the correct number +#define STEP_10 10 //todo define the correct number +#define STEP_1 1 //todo define the correct number -bool WHS_Set_Blower_Control_Closed_Loop(double SetPoint_Q) +bool WHS_Set_Blower_Control_Closed_Loop(double Q_value) { - //double average_ORF1_Q = 0; double current_dying_head_flow_Q = 0.0; - uint16_t volt; -double tmp = 0.0; - current_dying_head_flow_Q = get_average_ORF1_Q(); + double tmp = 0.0; + + current_dying_head_flow_Q = get_average_Q(HEAD_FLOW_METER); ReportWithPackageFilter(WasteFilter,"------------ current_dying_head_flow_Q =-----------------", __FILE__,__LINE__, current_dying_head_flow_Q, RpMessage, 0, 0); - ReportWithPackageFilter(WasteFilter,"------------ SET_DYEING_HEAD_ORRIFFICE_SENSOR =-----------------", __FILE__,__LINE__, SET_DYEING_HEAD_ORRIFFICE_SENSOR, RpMessage, current_dying_head_flow_Q, 0); - tmp = fabs((current_dying_head_flow_Q*10) - (SetPoint_Q*10)); + ReportWithPackageFilter(WasteFilter,"------------ SET_DYEING_HEAD_ORRIFFICE_SENSOR =-----------------", __FILE__,__LINE__, (int)(Q_value * 1000), RpMessage, (int)(current_dying_head_flow_Q * 1000), 0); + tmp = fabs((current_dying_head_flow_Q) - (Q_value)); - if (tmp > (0.2 * 10)) + if (tmp > 0.05) { - volt = g_MAX5805_device.CODE;//getBlowerState(); - if (current_dying_head_flow_Q < SetPoint_Q) + volt = g_MAX5805_device.CODE; + if (current_dying_head_flow_Q < Q_value) { - if (( SetPoint_Q - current_dying_head_flow_Q) > 0.5) + if (( Q_value - current_dying_head_flow_Q) > 1) { /* increase blower voltage by large step: */ - ReportWithPackageFilter(WasteFilter,"------------ increase blower voltage by large step:-----------------", __FILE__,__LINE__, volt, RpMessage, LARGE_STEP, 0); - //WHS_Set_Volt_Blower_Control( volt + LARGE_STEP );//call func :Control_Voltage_To_Blower - Control_Voltage_To_Blower(volt + LARGE_STEP); + ReportWithPackageFilter(WasteFilter,"------------ increase blower voltage by 100:-----------------", __FILE__,__LINE__, volt, RpMessage, STEP_100, 0); + Control_Voltage_To_Blower(volt + STEP_100); + close_loop_time = 15; } else { - /* increase blower voltage by small step: */ - ReportWithPackageFilter(WasteFilter,"------------ increase blower voltage by large step:-----------------", __FILE__,__LINE__, volt, RpMessage, SMALL_STEP, 0); - //WHS_Set_Volt_Blower_Control( volt + SMALL_STEP ); - Control_Voltage_To_Blower(volt + SMALL_STEP); + if (( Q_value - current_dying_head_flow_Q) > 0.20) + { + /* increase blower voltage by small step: */ + ReportWithPackageFilter(WasteFilter,"------------ increase blower voltage by 10:-----------------", __FILE__,__LINE__, volt, RpMessage, STEP_10, 0); + Control_Voltage_To_Blower(volt + STEP_10); + close_loop_time = 10; + } + else + { + /* increase blower voltage by small step: */ + ReportWithPackageFilter(WasteFilter,"------------ increase blower voltage by 1:-----------------", __FILE__,__LINE__, volt, RpMessage, STEP_1, 0); + Control_Voltage_To_Blower(volt + STEP_1); + close_loop_time = 5; + } } } else { - if (( current_dying_head_flow_Q - SetPoint_Q) > 0.5) + if (( current_dying_head_flow_Q - Q_value) > 1) { /* decrease blower voltage by large step: */ - ReportWithPackageFilter(WasteFilter,"------------ decrease blower voltage by large step:-----------------", __FILE__,__LINE__, volt, RpMessage, LARGE_STEP, 0); - //WHS_Set_Volt_Blower_Control(volt - LARGE_STEP); - Control_Voltage_To_Blower(volt - LARGE_STEP); + ReportWithPackageFilter(WasteFilter,"------------ decrease blower voltage by 100:-----------------", __FILE__,__LINE__, volt, RpMessage, STEP_100, 0); + Control_Voltage_To_Blower(volt - STEP_100); + close_loop_time = 15; } else { - /* decrease blower voltage by small step: */ - ReportWithPackageFilter(WasteFilter,"------------ decrease blower voltage by small step:-----------------", __FILE__,__LINE__, volt, RpMessage, SMALL_STEP, 0); - //WHS_Set_Volt_Blower_Control( volt - SMALL_STEP ); - Control_Voltage_To_Blower(volt - SMALL_STEP); + if (( current_dying_head_flow_Q - Q_value) > 0.20) + { + /* decrease blower voltage by small step: */ + ReportWithPackageFilter(WasteFilter,"------------ decrease blower voltage by 10:-----------------", __FILE__,__LINE__, volt, RpMessage, STEP_10, 0); + Control_Voltage_To_Blower(volt - STEP_10); + close_loop_time = 10; + } + else + { + /* decrease blower voltage by small step: */ + ReportWithPackageFilter(WasteFilter,"------------ decrease blower voltage by 1:-----------------", __FILE__,__LINE__, volt, RpMessage, STEP_1, 0); + Control_Voltage_To_Blower(volt - STEP_1); + close_loop_time = 5; + } } } } @@ -376,21 +416,40 @@ void WHS_Set_SetPoint_Q_value(double value) CofigurationFlow = 0; } +void WHS_enable_control_loop(double value) // 0=disable 1= enable +{ + EnableControlLoop = value; +} + void WHS_Start_Blower_Control_Closed_Loop () { + + static uint8_t count = 0; + if (GetMachineState() int32_t Write_Max5805_AUXn(bool value); int16_t Write_Max5805_LDACn(bool value); @@ -19,16 +20,14 @@ bool WHS_Set_Volt_Blower_Control(uint16_t volt); uint16_t WHS_Get_Volt_Blower_Control(void); bool Write_MAX5805_REF(void); bool Test_WHS_blower(void); -double WHS_Blower_Avarege_ORF1(void); -double WHS_Blower_Avarege_ORF3(void); -double get_average_ORF1_Q(void); -double get_average_ORF3_Q(void); -double get_ORF1_Q(); -double get_ORF3_Q(); -bool WHS_Set_Blower_Control_Closed_Loop(double SetPoint); -void WHS_Start_Blower_Control_Closed_Loop (); +double WHS_Blower_Avarege(WHS_Flow_Meter ORF_id); +double get_average_Q(WHS_Flow_Meter ORF_id); + +bool WHS_Set_Blower_Control_Closed_Loop(double Q_value); +void WHS_Start_Blower_Control_Closed_Loop (void); double WHS_Get_Blower_Control_Closed_Loop_SetPoint(void); void WHS_Set_SetPoint_Q_value(double value); +void WHS_enable_control_loop(double value); extern double headairflow; /* from Blower.h diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c index 00ce306cf..5170b7cef 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c @@ -726,8 +726,8 @@ uint32_t MillisecLowLoop(uint32_t tick) if (WHS_Type == WHS_TYPE_NEW) { Trigger_WHS_PT100_Read_All(); - WHS_Blower_Avarege_ORF1(); //drier - WHS_Blower_Avarege_ORF3(); //head + WHS_Blower_Avarege(HEAD_FLOW_METER); + WHS_Blower_Avarege(DRIER_FLOW_METER); WHS_Start_Blower_Control_Closed_Loop (); } } diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c index cbe70b444..35a9aef5b 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c @@ -109,11 +109,12 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) } } else - if((request->amount == 0x3E8) && (request->delay <= 0x0fff))// set WHS Blower speed 0x00-0xfff + if(request->amount == 0x3E8) //&& (request->delay <= 0x0fff))// set WHS Blower speed 0x00-0xfff { if (WHS_Type == WHS_TYPE_NEW) { - Trigger_SetWHSBlowerVoltage (request->delay); + WHS_enable_control_loop( request->delay & 0x1000);//disable control loop: 0=disable 1= enable + Trigger_SetWHSBlowerVoltage (request->delay & 0x0FFF); response.progress = 0; response.has_progress = false; } @@ -144,19 +145,38 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) { uint16_t tempu16 = 0; double temp_double = 0.0; + uint8_t display_byte = 0; + uint16_t A2D_data = 0; + if (WHS_Type == WHS_TYPE_NEW) { - - if (request->delay & 0x8000) // bit15 select the chip address - { - SetDisplayView( CURRENT ); - } - else + display_byte = ((request->delay & 0x3000)>>12); + switch (display_byte) { - SetDisplayView( AVERAGE ); + case 0: + //stubManager.Run("ProgressRequest" ,0x3EA, /*DisplayView =*/0x0000); // + SetLeftDisplayView (HeadAVERAGE); + SetWriteDisplayView(DrierAVERAGE); + break; + case 1: + //stubManager.Run("ProgressRequest" ,0x3EA, /*DisplayView =*/0x1000); // + SetLeftDisplayView (HeadAVERAGE); + SetWriteDisplayView(HeadCURRENT); + break; + case 2: + //stubManager.Run("ProgressRequest" ,0x3EA, /*DisplayView =*/0x2000); // + SetLeftDisplayView (DrierAVERAGE); + SetWriteDisplayView(DrierCURRENT); + break; + case 3: + //stubManager.Run("ProgressRequest" ,0x3EA, /*DisplayView =*/0x3000); // + SetLeftDisplayView (HeadCURRENT); + SetWriteDisplayView(DrierCURRENT); + break; } - switch(request->delay )// get A2D + A2D_data = (request->delay & 0x0FFF); + switch(A2D_data )// get A2D { case 0: get_orf_1(&tempu16); @@ -186,16 +206,16 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) tempu16 = 0; //get_cur_vlv2(&tempu16); break; case 10: - temp_double = get_ORF1_Q(); + temp_double = get_Q(HEAD_FLOW_METER); break; case 12: - temp_double = get_ORF3_Q(); + temp_double = get_Q(DRIER_FLOW_METER); break; case 20: - temp_double = get_average_ORF1_Q(); //HEAD + temp_double = get_average_Q(HEAD_FLOW_METER); //HEAD break; case 22: - temp_double = get_average_ORF3_Q(); //Drier + temp_double = get_average_Q(DRIER_FLOW_METER); //Drier break; case 11: -- cgit v1.3.1 From 95aae68e89693fb394d59d19b383571099b6d3d4 Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Sun, 1 Mar 2020 09:15:06 +0200 Subject: fix file handling. set the machine state to error while waiting to the cooler --- Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c | 2 +- Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c | 2 +- .../Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules/Control') diff --git a/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c b/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c index 1ba656657..3b5ba176d 100644 --- a/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c +++ b/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c @@ -717,7 +717,7 @@ FRESULT FileWrite(void * buffer, uint16_t size,char *path, uint32_t timeout) return FR_TIMEOUT; } - Fresult = f_open(FileHandle,path,FA_WRITE | FA_OPEN_ALWAYS); + Fresult = f_open(FileHandle,path,FA_WRITE | FA_OPEN_ALWAYS|FA_CREATE_ALWAYS); if (Fresult == FR_OK) { Fresult = f_write(FileHandle,buffer,size,&Bytes ); diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c index 5170b7cef..da4f04f3b 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c @@ -978,7 +978,7 @@ void MillisecLogInit(void) if (FileHandle == 0) Fresult = FR_DENIED; else - Fresult = f_open(FileHandle,MillisecPath,FA_WRITE | FA_OPEN_ALWAYS); + Fresult = f_open(FileHandle,MillisecPath,FA_WRITE | FA_OPEN_ALWAYS|FA_CREATE_ALWAYS); ROM_IntMasterEnable(); return ; diff --git a/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c b/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c index 9f864c2dc..05559ffae 100644 --- a/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c +++ b/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c @@ -453,6 +453,7 @@ uint32_t InitSequenceDispenserPressureBuildUpTest(void) uint32_t InitSequenceWaitForCoolerCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag) { MachineStateDetail = INIT_SEQUENCE_WAIT_FOR_COOLER; + SetMachineStatus(MACHINE_STATE__Ready); //prevent job while waiting for the cooler if (SafeRemoveControlCallback(HWControlId, InitSequenceWaitForCoolerCallBackFunction )==OK) HWControlId = 0xFF; @@ -477,6 +478,8 @@ uint32_t InitSequenceWaitForCooler(void) } else { + SetMachineStatus(MACHINE_STATE__Error); //prevent job while waiting for the cooler + //cold reset, wait 2 minutes for cooler start // HWControlId = AddControlCallback("Init Cooler", InitSequenceWaitForCoolerCallBackFunction, 2*eOneMinute, TemplateDataReadCBFunction,0,0, 0 ); HWControlId = AddControlCallback("Init Cooler", InitSequenceWaitForCoolerCallBackFunction, 2*eOneSecond, TemplateDataReadCBFunction,0,0, 0 ); -- cgit v1.3.1