Przeglądaj źródła

原控制方式打印

yidong.fan 1 miesiąc temu
rodzic
commit
9b8f7f6585

+ 50 - 41
WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/EEPROM.c

@@ -276,10 +276,7 @@ void Read_Sys_EE_03(void){
         EE_StrRead(0x338, (unsigned char*) &TempPara[4].fB,  4);        
         EE_StrRead(0x33C, (unsigned char*) &TempPara[5].fK1, 4);         
         EE_StrRead(0x340, (unsigned char*) &TempPara[5].fK2, 4);        
-        EE_StrRead(0x344, (unsigned char*) &TempPara[5].fB,  4);         
-        EE_StrRead(0x348, (unsigned char*) &TempPara[6].fK1, 4);         
-        EE_StrRead(0x34c, (unsigned char*) &TempPara[6].fK2, 4);        
-        EE_StrRead(0x350, (unsigned char*) &TempPara[6].fB,  4);               
+        EE_StrRead(0x344, (unsigned char*) &TempPara[5].fB,  4);               
    
         EE_StrRead(0x390, (unsigned char*) &TempPara[0].TTk1, 4);            
         EE_StrRead(0x394, (unsigned char*) &TempPara[0].TTk2, 4);      
@@ -319,21 +316,9 @@ void Read_Sys_EE_03(void){
         EE_StrRead(0x454, (unsigned char*) &TempChn[5].HOTtemp, 4);
         EE_StrRead(0x458, (unsigned char*) &TempChn[5].CODEtemp,4);
 
-
-        for(i=0;i<6;i++){   
-			 EE_StrRead(0x460+i*24, (unsigned char*) &TempPara[i].iKp[0],4);
-			 EE_StrRead(0x464+i*24, (unsigned char*) &TempPara[i].iKi[0],4);
-			 EE_StrRead(0x468+i*24, (unsigned char*) &TempPara[i].iKd[0],4);
-			 EE_StrRead(0x46c+i*24, (unsigned char*) &TempPara[i].iKp[1],4);
-			 EE_StrRead(0x470+i*24, (unsigned char*) &TempPara[i].iKi[1],4);
-			 EE_StrRead(0x474+i*24, (unsigned char*) &TempPara[i].iKd[1],4);
-			 EE_StrRead(0x6A0+i*4, (unsigned char*) &TempChn[i].OverTempthreshold,4);
-			 EE_StrRead(0x6B8+i*4, (unsigned char*) &TempChn[i].OverTempCoolthreshold,4);
-        }     
-
         for (i = 0; i < 6; i++) {
-            EE_StrRead(0x5C0 + 4 * i, (unsigned char*) &TempPara[i].fPowerCoef, 4);  
-            EE_StrRead(0x5C4 + 4 * i, (unsigned char*) &TempPara[i].fPowerCoefdown, 4); 
+            EE_StrRead(0x498 + 4 * i, (unsigned char*) &TempPara[i].fPowerCoef, 4);  
+            EE_StrRead(0x4C8 + 4 * i, (unsigned char*) &TempPara[i].fPowerCoefdown, 4); 
         }        
              
     }   
@@ -390,31 +375,55 @@ void Read_Sys_EE_05(void){
         
         CAPTarget_temp[0] = g_tEE.CAPTarget_temp[0];
         CAPTarget_temp[1] = g_tEE.CAPTarget_temp[1]; 
-   
-
-//        for(i=0;i<6;i++){         
-//            TempPara[i].iKp[0]=5000;
-//            TempPara[i].iKp[1]=5000;
-//            TempPara[i].iKp[2]=5000;
-//
-//            TempPara[i].iKi[0]=20;
-//            TempPara[i].iKi[1]=20;
-//            TempPara[i].iKi[2]=20;
-//
-//            TempPara[i].iKd[0]=8000;
-//            TempPara[i].iKd[1]=8000;
-//            TempPara[i].iKd[2]=8000;
-//
-//            TempPara[i].HoldPWMa = 0.9197;               
-//            TempPara[i].HoldPWMb = 60.465;             
-//            TempPara[i].HoldPWMc = -1572.1;                
-//            
-//            TempPara[i].HoldPWMa1 = 0.9197;               
-//            TempPara[i].HoldPWMb1 = 60.465;              
-//            TempPara[i].HoldPWMc1 = -1572.1;                      
-//        }        
+        
+        
+//        EE_StrRead(0x58E, (unsigned char*) &g_tEE.P0, 2);          //
+//        EE_StrRead(0x590, (unsigned char*) &g_tEE.I0, 2);          //      
+//        EE_StrRead(0x592, (unsigned char*) &g_tEE.D0, 2);          //
+//        EE_StrRead(0x594, (unsigned char*) &g_tEE.P1, 2);          //
+//        EE_StrRead(0x596, (unsigned char*) &g_tEE.I1, 2);          //      
+//        EE_StrRead(0x598, (unsigned char*) &g_tEE.D1, 2);          //
+//        EE_StrRead(0x59A, (unsigned char*) &g_tEE.P2, 2);          //
+//        EE_StrRead(0x59C, (unsigned char*) &g_tEE.I2, 2);          //      
+//        EE_StrRead(0x59E, (unsigned char*) &g_tEE.D2, 2);          //
 //        
+//        EE_StrRead(0x5A0, (unsigned char*) &g_tEE.WK1, 4);         //
+//        EE_StrRead(0x5A4, (unsigned char*) &g_tEE.WK2, 4);         //      
+//        EE_StrRead(0x5A8, (unsigned char*) &g_tEE.WB, 4);          //
 //        
+//        EE_StrRead(0x5B4, (unsigned char*) &g_tEE.WK11, 4);         //
+//        EE_StrRead(0x5B8, (unsigned char*) &g_tEE.WK22, 4);         //      
+//        EE_StrRead(0x5BC, (unsigned char*) &g_tEE.WB1, 4);          //        
+//
+//        EE_StrRead(0x5AC, (unsigned char*) &g_tEE.UP, 4);         //      
+//        EE_StrRead(0x5B0, (unsigned char*) &g_tEE.DOWN, 4);       //       
+//        
+//        EE_StrRead(0x5C0, (unsigned char*) &delays, 2);          //  
+//         EE_StrRead(0x5C2, (unsigned char*) &delays, 2);          //  
+
+        for(i=0;i<6;i++){         
+            TempPara[i].iKp[0]=5000;
+            TempPara[i].iKp[1]=5000;
+            TempPara[i].iKp[2]=5000;
+
+            TempPara[i].iKi[0]=20;
+            TempPara[i].iKi[1]=20;
+            TempPara[i].iKi[2]=20;
+
+            TempPara[i].iKd[0]=8000;
+            TempPara[i].iKd[1]=8000;
+            TempPara[i].iKd[2]=8000;
+
+            TempPara[i].HoldPWMa = 0.9197;               
+            TempPara[i].HoldPWMb = 60.465;             
+            TempPara[i].HoldPWMc = -1572.1;                
+            
+            TempPara[i].HoldPWMa1 = 0.9197;               
+            TempPara[i].HoldPWMb1 = 60.465;              
+            TempPara[i].HoldPWMc1 = -1572.1;                      
+        }        
+        
+        
         
     }  
 }

+ 3 - 2
WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/Interrupt.c

@@ -278,8 +278,7 @@ void __attribute__((interrupt,auto_psv)) _T6Interrupt (void)
         ms100conter++;
 		if(ms100conter%100 == 0){
 			s10flag = 1;
-		}
-		printtempFlag = 1;	   
+		}	   
     }
 
     
@@ -306,6 +305,8 @@ void __attribute__((interrupt,auto_psv)) _T4Interrupt (void)
 //    STU2 = ~STU2;
     IFS1bits.T4IF = 0;
     T4CONbits.TON = 0;//off the T4  for 1ms    
+	
+	printtempFlag = 1;
 
     for(i=0;i<9;i++){
         TempAD=0;

+ 206 - 105
WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/PWM.c

@@ -49,11 +49,11 @@ void InitPWM(void)
 /*******************************************************************************
  * 函数名称:SetPWM
  *******************************************************************************/
-void SetPWM(unsigned char ucChannel , float pwmvalue)
+void SetPWM(unsigned char ucChannel , long uiDuty)
 {
-	long uiDuty;
-    if(pwmvalue > 0){ 
-        uiDuty =(long)(pwmvalue * TempPara[ucChannel].fPowerCoef) ;
+    if(uiDuty > 0){ 
+        uiDuty =(long)((float)uiDuty * TempPara[ucChannel].fPowerCoef) ;
+		TempPara[ucChannel].realVlOutR = uiDuty;
         switch(ucChannel){
             case 0:
                 PDC1 = uiDuty;
@@ -84,7 +84,39 @@ void SetPWM(unsigned char ucChannel , float pwmvalue)
            
         }
     }else{
-            uiDuty =(long)(pwmvalue * TempPara[ucChannel].fPowerCoefdown) ;
+        if((TempChn[ucChannel].cOverTempCnter == 0)&&(TempChn[ucChannel].cHeatOrRefrig == 1)){
+		TempPara[ucChannel].realVlOutR = 0;
+            switch(ucChannel){
+                case 0:
+                    SDC1 = 0;
+                    PDC1 = 0;
+                    break;
+                case 1:
+                    SDC2 = 0;
+                    PDC2 = 0;//加热
+                    break;
+                case 2:
+                    SDC3 = 0;
+                    PDC3 = 0;//加热
+                    break;
+                case 3:
+                    SDC4 = 0;
+                    PDC4 = 0;//加热
+                    break;
+                case 4:
+                    SDC5 = 0;
+                    PDC5 = 0;//加热
+                    break; 
+                case 5:
+                    SDC6 = 0;
+                    PDC6 = 0;//加热
+                    break;                                  
+                default:
+                    break;                
+            }
+        }else{
+            uiDuty =(long)((float)uiDuty * TempPara[ucChannel].fPowerCoefdown) ;
+		    TempPara[ucChannel].realVlOutR = uiDuty;
             switch(ucChannel){
                 case 0:
                     SDC1 = -uiDuty;
@@ -114,6 +146,7 @@ void SetPWM(unsigned char ucChannel , float pwmvalue)
                     break;                
             }
         }
+    }
 }
 
 
@@ -160,9 +193,6 @@ void CAPPeltierCtrler(void){
 void PeltierCtrler(void)
 {
     unsigned char i;   
-	float tempOutP; 
-	float errOutP;
-	float divOutP;
     for(i=0;i<6;i++)
     {
         
@@ -170,88 +200,167 @@ void PeltierCtrler(void)
             SetPWM (i,0);            
             continue;
         }   
-		switch(TempChn[i].pidst){
-			case PID_OVERHEAT:{
-				/*采用第一路PID配置*/
-			    TempPara[i].fErrLast = TempPara[i].fErr;
-				TempPara[i].fErr=TempChn[i].fTubeTargetTemp - TempChn[i].fCurrentTemperature;              
-                TempPara[i].fVlOut = TempPara[i].iKp[1] * TempPara[i].fErr;
-				if(abs(TempPara[i].fVlOutP) < 100){
-                	TempPara[i].fSum += TempPara[i].fErr; 
-				}
-                TempPara[i].fVlSum = TempPara[i].iKi[1] * TempPara[i].fSum; 
-                divOutP = TempPara[i].iKd[1]*(TempPara[i].fErr - TempPara[i].fErrLast);  
-                TempPara[i].fVlOutP = TempPara[i].fVlOut + TempPara[i].fVlSum + divOutP;
-				if(TempChn[i].cHeatOrRefrig == 1){
-					if(TempChn[i].fCurrentTemperature >(TempChn[i].fTubeTargetTemp + TempChn[i].OverTempthreshold)){					
-						TempChn[i].pidst= PID_OVERHEATLAST;
-						TempChn[i].pidRumtime = 0;
-        				TempChn[i].cHeatOrRefrig = 2;								
-					Van_Device_Printf(2," ch%d go to st:%d  cur:%f,at:%f + :%f\n\r",i,TempChn[i].pidst,TempChn[i].fCurrentTemperature,
-						TempChn[i].fTubeTargetTemp,TempChn[i].OverTempthreshold);
-					}
-				}else if(TempChn[i].cHeatOrRefrig == 0){
-					if(TempChn[i].fCurrentTemperature <(TempChn[i].fTubeTargetTemp + TempChn[i].OverTempCoolthreshold)){					
-						TempChn[i].pidst= PID_OVERHEATLAST;
-						TempChn[i].pidRumtime = 0;
-        				TempChn[i].cHeatOrRefrig = 2;	
-					Van_Device_Printf(2," ch%d go to st:%d cur:%f,at:%f + :%f \n\r",i,TempChn[i].pidst,TempChn[i].fCurrentTemperature,
-							TempChn[i].fTubeTargetTemp,TempChn[i].OverTempCoolthreshold);
-					}
-				}
-			}break;
-			case PID_OVERHEATLAST:{
-				/*过充维持阶段,加热功率不变*/
-				TempChn[i].pidRumtime++;
-				if(TempChn[i].pidRumtime>= TempChn[i].timer0){
-					TempChn[i].pidst= PID_NORMAL;
-					/*维持功率不变,*/
-					TempPara[i].fSum = (TempChn[i].fCurrentTemperature - TempChn[i].fBlockTargetTemp)*TempPara[i].iKp[1]/TempPara[i].iKi[1];					
-					TempPara[i].fSum += TempPara[i].fVlOutP/TempPara[i].iKi[1];
-					Van_Device_Printf(2," ch%d go to st:%d  cur:%f,time:%d  \n\r",i,TempChn[i].pidst,TempChn[i].fCurrentTemperature,TempChn[i].pidRumtime);
-					TempChn[i].pidRumtime = 0;
-					TempChn[i].fistAriv = 0;
-				}
-			}break;
-			case PID_NORMAL:{
-				/*采用第一路PID配置*/
-			    TempPara[i].fErrLast = TempPara[i].fErr;
-				TempPara[i].fErr=TempChn[i].fBlockTargetTemp - TempChn[i].fCurrentTemperature;              
-                TempPara[i].fVlOut = TempPara[i].iKp[1] * TempPara[i].fErr;
-//				if(abs(TempPara[i].fVlOutP) < 100){
-//				}
+        if(TempChn[i].cOverTempCnter){//
+            TempPara[i].fErr=TempChn[i].fTubeTargetTemp - TempChn[i].fCurrentTemperature;  
+            TempChn[i].fHoldPWM = TempPara[i].HoldPWMa * TempChn[i].fTubeTargetTemp * TempChn[i].fTubeTargetTemp + TempPara[i].HoldPWMb * TempChn[i].fTubeTargetTemp + TempPara[i].HoldPWMc;
+        }
+        else{// block mode
+            TempPara[i].fErr = TempChn[i].fBlockTargetTemp - TempChn[i].fCurrentTemperature;
+            TempChn[i].fHoldPWM = TempPara[i].HoldPWMa * TempChn[i].fBlockTargetTemp * TempChn[i].fBlockTargetTemp + TempPara[i].HoldPWMb * TempChn[i].fBlockTargetTemp + TempPara[i].HoldPWMc;
+        }
+        if((TempChn[i].cCtrlMode !=1)&&(TempChn[i].cCtrlMode !=3)){
+            if (fabs(TempPara[i].fErr) < 0.05) {
+//                TempChn[i].cBlockTempAriv = 1;
+                TempChn[i].FallingTempCter = 0;               
+                TempPara[i].fVlOutP = TempPara[i].iKp[2] * TempPara[i].fErr;
+                TempPara[i].fSum += TempPara[i].fErr; 
+                TempPara[i].fVlSum = TempPara[i].iKi[2] * TempPara[i].fSum; 
+                TempPara[i].fVlOut = TempPara[i].iKd[2]*(TempPara[i].fErr - TempPara[i].fErrLast);           
+                TempPara[i].fVlOutP += TempPara[i].fVlOut + TempPara[i].fVlSum;
+            } else if (fabs(TempPara[i].fErr) < 0.1) {
+//                TempChn[i].cBlockTempAriv = 1;
+                TempChn[i].FallingTempCter = 0;             
+                TempPara[i].fVlOutP = TempPara[i].iKp[2] * TempPara[i].fErr;
                 TempPara[i].fSum += TempPara[i].fErr; 
-                TempPara[i].fVlSum = TempPara[i].iKi[1] * TempPara[i].fSum; 
-                divOutP = TempPara[i].iKd[1]*(TempPara[i].fErr - TempPara[i].fErrLast);  
-                TempPara[i].fVlOutP = TempPara[i].fVlOut + TempPara[i].fVlSum + divOutP;
-				if(((TempChn[i].fBlockTargetTemp - 0.5)<TempChn[i].fCurrentTemperature)&&((TempChn[i].fBlockTargetTemp + 0.5)>TempChn[i].fCurrentTemperature)){
-					TempChn[i].pidRumtime++;
-				}else{
-					TempChn[i].pidRumtime = 0;
-				}
-				if(TempChn[i].pidRumtime > TEMP_HOLD_TIME){
-					TempChn[i].cTubeTempAriv = 1;	
-					if(TempChn[i].fistAriv == 0){
-						Van_Device_Printf(2," ch%d go to st:%d cur:%f,time:%d\n\r",i,TempChn[i].pidst,TempChn[i].fCurrentTemperature,TempChn[i].pidRumtime);
-						TempChn[i].fistAriv = 1;
-					}
-				}
-			}break;
-				default:
-					TempChn[i].pidst = PID_IDL;
-					TempPara[i].fVlOutP = 0;
-					break;
-		}    
-		 if(TempPara[i].fVlOutP > TempChn[i].MAXPWM){
-             TempPara[i].fVlOutP = TempChn[i].MAXPWM;
-         }
-         else if(TempPara[i].fVlOutP < -TempChn[i].MAXPWM){
-             TempPara[i].fVlOutP = -TempChn[i].MAXPWM;
-         }
-		SetPWM (i,TempPara[i].fVlOutP);
-//		if(i==2){
-//	    	Van_Device_Printf(2,"ch%d: %3f %3f=%3f+%3f+%3f\n\r",i,TempChn[i].fCurrentTemperature,TempPara[i].fVlOutP, TempPara[i].fVlOut,TempPara[i].fVlSum,divOutP);
-//		}
+                TempPara[i].fVlSum = TempPara[i].iKi[2] * TempPara[i].fSum; 
+                TempPara[i].fVlOut = TempPara[i].iKd[2]*(TempPara[i].fErr - TempPara[i].fErrLast);          
+                TempPara[i].fVlOutP += TempPara[i].fVlOut + TempPara[i].fVlSum;
+            } else if (fabs(TempPara[i].fErr) < 0.5) {
+//                TempChn[i].cBlockTempAriv = 1;
+                TempChn[i].FallingTempCter = 0;             
+                TempPara[i].fVlOutP = TempPara[i].iKp[2] * TempPara[i].fErr;
+                TempPara[i].fSum += TempPara[i].fErr; 
+                TempPara[i].fVlSum = TempPara[i].iKi[2] * TempPara[i].fSum; 
+                TempPara[i].fVlOut = TempPara[i].iKd[2]*(TempPara[i].fErr - TempPara[i].fErrLast);          
+                TempPara[i].fVlOutP += TempPara[i].fVlOut + TempPara[i].fVlSum;
+            } else if (fabs(TempPara[i].fErr) < 1) {
+//                TempChn[i].cBlockTempAriv = 1;
+                TempChn[i].FallingTempCter = 0;             
+                TempPara[i].fVlOutP = TempPara[i].iKp[1] * TempPara[i].fErr;
+                TempPara[i].fSum += TempPara[i].fErr;
+                TempPara[i].fVlSum = TempPara[i].iKi[1] * TempPara[i].fSum;
+                TempPara[i].fVlOut = TempPara[i].iKd[1]*(TempPara[i].fErr - TempPara[i].fErrLast);
+                TempPara[i].fVlOutP += TempPara[i].fVlOut + TempPara[i].fVlSum;
+            } else if (fabs(TempPara[i].fErr) <= MODEMRANGE) {
+//                TempChn[i].cBlockTempAriv = 1;
+                TempChn[i].FallingTempCter = 0;           
+                TempPara[i].fVlOutP = TempPara[i].iKp[0] * TempPara[i].fErr;
+                TempPara[i].fSum += TempPara[i].fErr; 
+                TempPara[i].fVlSum = TempPara[i].iKi[0] * TempPara[i].fSum;                      
+                TempPara[i].fVlOut = TempPara[i].iKd[0]*(TempPara[i].fErr - TempPara[i].fErrLast); 
+                TempPara[i].fVlOutP += TempPara[i].fVlOut + TempPara[i].fVlSum; 
+            }
+            else {
+                TempPara[i].fSum = 0;
+                if ((TempPara[i].fErr > MODEMRANGE)){
+                    TempPara[i].fVlOutP = 100000;
+                }
+                else if ((TempPara[i].fErr < -MODEMRANGE)){
+                    TempPara[i].fVlOutP = -100000;
+                }
+            }          
+            TempPara[i].fDerr=TempPara[i].fErr - TempPara[i].fErrLast;
+
+//            TempChn[i].fHoldPWM = 0;
+//            TempPara[i].fVlOutP += TempChn[i].fHoldPWM;
+//            TempPara[i].fErrLast = TempPara[i].fErr;  
+//
+//            if(TempPara[i].fVlOutP > TempChn[i].MAXPWM){
+//                TempPara[i].fVlOutP = TempChn[i].MAXPWM;
+//            }
+//            else if(TempPara[i].fVlOutP < -TempChn[i].MAXPWM){
+//                TempPara[i].fVlOutP = -TempChn[i].MAXPWM;
+//            }
+ 
+            if((TempChn[i].cOverTempCnter == 0)&&(TempChn[i].cHeatOrRefrig == 0)&&(g_uiOverTempCnter[i] <= g_tEE.uiOverTempCnter)){
+                TempPara[i].fVlOutP = TempChn[i].fHoldPWM;    
+                TempPara[i].fErrLast = TempPara[i].fErr;
+                g_uiOverTempCnter[i]++;
+            }else{
+                TempPara[i].fVlOutP += TempChn[i].fHoldPWM;    
+                TempPara[i].fErrLast = TempPara[i].fErr;   
+            }    
+            
+            if(TempChn[i].cHeatOrRefrig == 1){
+                if(TempChn[i].fBlockTargetTemp < TempChn[i].fCurrentTemperature){
+                   TempChn[i].cBlockTempAriv = 1;  
+                }  
+            }else if(TempChn[i].cHeatOrRefrig == 0){
+                if(TempChn[i].fBlockTargetTemp > TempChn[i].fCurrentTemperature){
+                   TempChn[i].cBlockTempAriv = 1;  
+                }                
+            }else if(TempChn[i].cHeatOrRefrig == 2){
+                   TempChn[i].cBlockTempAriv = 1;
+            }else{   
+            }
+            
+            if(TempPara[i].fVlOutP > TempChn[i].MAXPWM){
+                TempPara[i].fVlOutP = TempChn[i].MAXPWM;
+            }
+            else if(TempPara[i].fVlOutP < -TempChn[i].MAXPWM){
+                TempPara[i].fVlOutP = -TempChn[i].MAXPWM;
+            }
+
+            if(TempPara[i].fVlOutP >=TempChn[i].MAXPWM){
+                TempPara[i].fVlOutR +=4000;
+            }
+            else if(TempPara[i].fVlOutP <= -TempChn[i].MAXPWM){
+                TempPara[i].fVlOutR -=4000;
+            }
+            if((TempPara[i].fVlOutR < 0)&&(TempPara[i].fVlOutP > 0)){  
+                TempPara[i].fVlOutR =0;
+            }
+            else {
+                TempPara[i].fVlOutR =TempPara[i].fVlOutP;
+            }
+            if(TempPara[i].fVlOutR > TempChn[i].MAXPWM){ 
+                TempPara[i].fVlOutR = TempChn[i].MAXPWM;
+            }
+            else if(TempPara[i].fVlOutR < -TempChn[i].MAXPWM){ 
+                TempPara[i].fVlOutR = -TempChn[i].MAXPWM;
+            }
+   
+            SetPWM (i,TempPara[i].fVlOutR);
+            if(TempPara[i].fVlOutR > 0){
+               g_uiGetPWM[i] = (unsigned int)TempPara[i].fVlOutR; 
+            }else{
+               g_uiGetPWM[i] = 0;
+            }          
+        }
+        else if(TempChn[i].cCtrlMode ==1){
+        }
+        else if(TempChn[i].cCtrlMode ==3){
+        }
+
+        if(TempChn[i].fCurrentTemperature > 120.0) {
+            TempChn[i].PeltierOvertempCnter++;
+            if(TempChn[i].PeltierOvertempCnter >= 10){
+                SetPWM (i,0);
+            }
+        }
+        else if(TempChn[i].fCurrentTemperature < -1){
+            TempChn[i].PeltierOvertempCnter++;
+            if(TempChn[i].PeltierOvertempCnter >= 10){
+                SetPWM (i,0);
+            }
+        }
+        else{
+            TempChn[i].PeltierOvertempCnter=0;
+        }
+
+        TempChn[i].TimerForPeltier++;
+        if(TempChn[i].TimerForPeltier >= TempChn[i].timer0 ){
+            TempChn[i].TimerForPeltier = 0;
+            if(FallingTempCter!=0) FallingTempCter--;
+            if((TempChn[i].cPeltierRun != 0)&&(TempChn[i].cCtrlMode !=1)){
+                if(TempChn[i].cBlockTempAriv && TempChn[i].cOverTempCnter){
+                    TempChn[i].cOverTempCnter--;
+                }
+                if(!TempChn[i].cOverTempCnter && !TempChn[i].cTubeTempAriv){
+                    TempChn[i].cTubeTempAriv = 1;
+                }
+            }
+        }          
     }
 }
 
@@ -284,25 +393,19 @@ unsigned char ScheduleOperate(unsigned char chn)
     {
         TempChn[chn].cHeatOrRefrig = 1;
         TempChn[chn].fTubeTargetTemp = TempChn[chn].fBlockTargetTemp + TempChn[chn].HOTtemp;
-		TempChn[chn].pidst = PID_OVERHEAT;
-		Van_Device_Printf(2,"\n\rch%d go to st:%d H T:%f O:%f A%f C:%d %f\n\r",chn,TempChn[chn].pidst,
-			TempChn[chn].fBlockTargetTemp,TempChn[chn].fTubeTargetTemp,TempChn[chn].HOTtemp,TempChn[chn].cOverTempCnter,TempChn[chn].OverTempthreshold);
     }
 
-    else if(TempChn[chn].fBlockTargetTemp < TempChn[chn].fCurrentTemperature + TempChn[chn].CODEtemp)
+    else if(TempChn[chn].fBlockTargetTemp < TempChn[chn].fCurrentTemperature - TempChn[chn].CODEtemp)
     {
         TempChn[chn].cHeatOrRefrig = 0;
-        TempChn[chn].fTubeTargetTemp = TempChn[chn].fBlockTargetTemp + TempChn[chn].CODEtemp;
-		TempChn[chn].pidst = PID_OVERHEAT;
-		Van_Device_Printf(2,"go to st:%d  C T:%f O:%f A%f C:%d %f\n\r",TempChn[chn].pidst,
-			TempChn[chn].fBlockTargetTemp,TempChn[chn].fTubeTargetTemp,TempChn[chn].CODEtemp,TempChn[chn].cOverTempCnter,TempChn[chn].OverTempCoolthreshold);
+        TempChn[chn].fTubeTargetTemp = TempChn[chn].fBlockTargetTemp - TempChn[chn].CODEtemp;
     }
     else
     {
-        TempChn[chn].cHeatOrRefrig = 2;		
-		Van_Device_Printf(2,"heat ch%d with over:goal:%f\n\r",chn,TempChn[chn].fBlockTargetTemp);
+        TempChn[chn].cHeatOrRefrig = 2;
+//        TempChn[chn].cBlockTempAriv = 1;       
+//                    Run.TubeAriv = 1;
         TempChn[chn].fTubeTargetTemp = TempChn[chn].fBlockTargetTemp;
-		TempChn[chn].pidst = PID_NORMAL;
 
         if(fabs(TempChn[chn].fBlockTargetTemp - TempChn[chn].fCurrentTemperature) < 2) 
             TempChn[chn].cOverTempCnter = 1;//5
@@ -323,8 +426,6 @@ unsigned char ScheduleOperate(unsigned char chn)
                 TempChn[chn].cHeatOrRefrig = 0;
             }
         }
-		
-		Van_Device_Printf(2,"heat with over:goal:%f overtime:%d\n\r",TempChn[chn].fBlockTargetTemp,TempChn[chn].cOverTempCnter);
     }
     return 0;
 }
@@ -367,9 +468,9 @@ void InitTempCtlr(){
     }
     
     for(i=0;i<6;i++){         
-        TempPara[i].iKp[0]=TempPara[i].iKp[1]=TempPara[i].iKp[2]=12.5;
-        TempPara[i].iKi[0]=TempPara[i].iKi[1]=TempPara[i].iKi[2]=0.05;
-        TempPara[i].iKd[0]=TempPara[i].iKd[1]=TempPara[i].iKd[2]=0;
+        TempPara[i].iKp[0]=TempPara[i].iKp[1]=TempPara[i].iKp[2]=5000;
+        TempPara[i].iKi[0]=TempPara[i].iKi[1]=TempPara[i].iKi[2]=20;
+        TempPara[i].iKd[0]=TempPara[i].iKd[1]=TempPara[i].iKd[2]=8000;
         
         TempPara[i].HoldPWMa = 0.9197;
         TempPara[i].HoldPWMb = 60.465;

+ 5 - 4
WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/PWM.h

@@ -101,9 +101,10 @@ typedef struct __TEMPPARA{
     float fVlOutP;
     float fVlOut;
     float fVlOutR;
-    float iKp[3];
-    float iKi[3];
-    float iKd[3];
+    float realVlOutR;
+    short iKp[3];
+    short iKi[3];
+    short iKd[3];
     float fPowerCoef;
     float fPowerCoefdown;
     float HoldPWMa;
@@ -141,7 +142,7 @@ TEMPCTRLEXTERN unsigned int set_Target_temp;
 
 TEMPCTRLEXTERN void PeltierCtrler(void);
 TEMPCTRLEXTERN void CAPPeltierCtrler(void);
-TEMPCTRLEXTERN void SetPWM(unsigned char ucChannel , float pwmvalue);
+TEMPCTRLEXTERN void SetPWM(unsigned char ucChannel ,long uiDuty);
 TEMPCTRLEXTERN void InitPWM(void);
 TEMPCTRLEXTERN void InitTempCtlr(void);
 TEMPCTRLEXTERN unsigned char ScheduleOperate(unsigned char chn);

+ 1 - 1
WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/main.c

@@ -146,7 +146,7 @@ int main(void) {
             printtempFlag = 0;   
 			for(i=0;i<6;i++){
 				*(float *)(buf+0+i*20)=TempChn[i].fCurrentTemperature;
-				*(float *)(buf+4+i*20)=TempPara[i].fVlOutP;
+				*(float *)(buf+4+i*20)=TempPara[i].realVlOutR;
 				*(float *)(buf+8+i*20)=TempPara[i].fVlOut;
 				*(float *)(buf+12+i*20)=TempPara[i].fVlSum;
 				*(float *)(buf+16+i*20)=TempChn[i].pidst;