thermferm/thermferm.c

changeset 316
73cd31dc6ce1
parent 315
198f3b4bd0d8
child 317
18dd6eadba31
--- a/thermferm/thermferm.c	Tue Feb 17 23:27:47 2015 +0100
+++ b/thermferm/thermferm.c	Thu Feb 19 14:42:55 2015 +0100
@@ -32,6 +32,7 @@
 #include "panel.h"
 #include "futil.h"
 #include "xutil.h"
+#include "pid.h"
 
 
 int			my_shutdown = FALSE;
@@ -845,6 +846,8 @@
 #endif
     int			current_step, valid_step, time_until_now;
     float		previous_target;
+    pid_var		*pid;
+
 
     if (lockprog((char *)"thermferm")) {
 	syslog(LOG_NOTICE, "Can't lock");
@@ -1307,7 +1310,7 @@
 	     */
 	    for (unit = Config.units; unit; unit = unit->next) {
 		if ((unit->mode == UNITMODE_FRIDGE) || (unit->mode == UNITMODE_BEER) || (unit->mode == UNITMODE_PROFILE)) {
-		    double	pTerm, dTerm, iTerm;
+//		    double	pTerm, dTerm, iTerm;
 
 		    sp = unit->beer_set;
 		    pv = unit->beer_temperature / 1000.0;
@@ -1325,19 +1328,47 @@
 		    if (P_err < unit->idle_rangeH && P_err > unit->idle_rangeL) {
 			P_err = 0.0;
 		    }
-		    pTerm = unit->PID_Kp * P_err;
+
+		    pid = (pid_var *)malloc(sizeof(pid_var));
+		    pid->dState = unit->PID_dState;
+		    pid->iState = unit->PID_iState;
+		    pid->iMax = 100.0;
+		    pid->iMin = -100.0;
+		    pid->pGain = unit->PID_Kp;
+		    pid->iGain = unit->PID_Ki;
+		    pid->dGain = unit->PID_Kd;
+
+		    Out = UpdatePID(pid, P_err, pv);
+
+		    if (Out > 100.0)
+			Out = 100.0;
+		    if (Out < -100.0)
+			Out = -100.0;
+
+		    if (debug)
+			fprintf(stdout, "sp=%.2f pv=%.2f dState=%.2f P_err=%.2f iState=%.2f Out=%.2f\n",
+				sp, pv, unit->PID_dState, P_err, unit->PID_iState, Out);
+		    if ((Out >= 1) || (Out <= -1) || (seconds == 60) || unit->heater_state || unit->cooler_state) {
+			syslog(LOG_NOTICE, "sp=%.2f pv=%.2f P_err=%.2f dState=%.2f iState=%.2f Out=%.2f",
+				sp, pv, P_err, unit->PID_dState, unit->PID_iState, Out);
+		    }
+
+		    unit->PID_iState = pid->iState;
+		    unit->PID_dState = pid->dState;
+
+//		    pTerm = unit->PID_Kp * P_err;
 
 		    /*
 		     * Calculate the intergral state with appropriate limiting
 		     */
-		    unit->PID_iState += P_err;
+//		    unit->PID_iState += P_err;
 		    /* Limit integral error */
-		    if (unit->PID_iState < -100.0)
-			unit->PID_iState = -100.0;
-		    if (unit->PID_iState > 100.0)
-			unit->PID_iState = 100.0;
-		    iTerm = unit->PID_iState * unit->PID_Ki;
-		    dTerm = (unit->PID_dState - pv) * unit->PID_Kd;
+//		    if (unit->PID_iState < -100.0)
+//			unit->PID_iState = -100.0;
+//		    if (unit->PID_iState > 100.0)
+//			unit->PID_iState = 100.0;
+//		    iTerm = unit->PID_iState * unit->PID_Ki;
+//		    dTerm = (unit->PID_dState - pv) * unit->PID_Kd;
 
 		    /*
 		     * A postive value means heating, a negative value cooling.
@@ -1346,19 +1377,19 @@
 		     * Increase Kd until a little damping.
 		     * Increase Ki after Kp and Kd are set until longterm convergence.
 		     */
-		    Out = pTerm + dTerm + iTerm;
-		    if (Out > 100.0)
-			Out = 100.0;
-		    if (Out < -100.0)
-			Out = -100.0;
-		    if (debug)
-		    	fprintf(stdout, "sp=%.2f pv=%.2f dState=%.2f P_err=%.2f iState=%.2f Out=%.2f\n",
-					sp, pv, unit->PID_dState, P_err, unit->PID_iState, Out);
-		    if ((Out >= 1) || (Out <= -1) || (seconds == 60) || unit->heater_state || unit->cooler_state) {
-		    	syslog(LOG_NOTICE, "sp=%.2f pv=%.2f P_err=%.2f dState=%.2f iState=%.2f pTerm=%.2f iTerm=%.2f dTerm=%.2f Out=%.2f",
-					sp, pv, P_err, unit->PID_dState, unit->PID_iState, pTerm, iTerm, dTerm, Out);
-		    }
-		    unit->PID_dState = pv;
+//		    Out = pTerm + dTerm + iTerm;
+//		    if (Out > 100.0)
+//			Out = 100.0;
+//		    if (Out < -100.0)
+//			Out = -100.0;
+//		    if (debug)
+//		    	fprintf(stdout, "sp=%.2f pv=%.2f dState=%.2f P_err=%.2f iState=%.2f Out=%.2f\n",
+//					sp, pv, unit->PID_dState, P_err, unit->PID_iState, Out);
+//		    if ((Out >= 1) || (Out <= -1) || (seconds == 60) || unit->heater_state || unit->cooler_state) {
+//		    	syslog(LOG_NOTICE, "sp=%.2f pv=%.2f P_err=%.2f dState=%.2f iState=%.2f pTerm=%.2f iTerm=%.2f dTerm=%.2f Out=%.2f",
+//					sp, pv, P_err, unit->PID_dState, unit->PID_iState, pTerm, iTerm, dTerm, Out);
+//		    }
+//		    unit->PID_dState = pv;
 
 		    if (unit->heater_address) {
 			if (Out >= 1) {

mercurial