Simple PID Controller with Integral Windup Supports creating a diagnostics message to send to a GUI

Revision:
3:c169d08a9d0b
Parent:
2:dd64c2cf9066
diff -r dd64c2cf9066 -r c169d08a9d0b PidController.cpp
--- a/PidController.cpp	Tue Sep 05 05:18:52 2017 +0000
+++ b/PidController.cpp	Wed Sep 06 23:45:40 2017 +0000
@@ -48,10 +48,10 @@
         if (CV < minLimit){CV= minLimit;}
         
         
-        if (collectDiagnostics){BuildDiagMessage(SP,PV, CV*scalar, K_p*error, IntegralAction, DerivativeAction);}
+        if (collectDiagnostics){BuildDiagMessage(SP,PV, CV, K_p*error, IntegralAction, DerivativeAction);}
         
         //Convert from mm/s to 0-100%
-        return (int)(CV*scalar)*10;
+        return (int)(CV*scalar);
     }
 
 void PidController::UpdateSettings(float Bias, float PropGain, float IntGain, float DiffGain, float OutputMin, float OutputMax, float OutputScale){
@@ -66,12 +66,18 @@
 
 void PidController::StartDiag(void){
     elapsedTime =0;
+    collectDiagnostics = true;
     }
-    
-void PidController::BuildDiagMessage(float SP, float PV, float PWM, float PropAction, float IntAction, float DifAction){
-    sprintf(diagMsg, "P %d %0.4f, %0.4f %0.1f", // %0.4f %0.4f %0.4f\n", 
-                    elapsedTime, SP, PV, PWM);// PropAction, IntAction, DifAction);
-    elapsedTime += RATE;
-    if (elapsedTime > 32000){EndDiag();}
+
+void PidController::EndDiag(void){
+    collectDiagnostics = false;
+
     }
 
+void PidController::BuildDiagMessage(float SetPoint, float ProcessVar, float PWM, float PropAction, float IntAction, float DifAction){
+    sprintf(diagMsg, "P %d %0.4f %0.4f %0.1f %0.4f %0.4f %0.4f\n", 
+                    elapsedTime, SetPoint, ProcessVar, PWM, PropAction, IntAction, DifAction);
+    elapsedTime += RATE;
+    if (elapsedTime > 32000){sprintf(diagMsg, "R");}
+    }
+