@@ -39,30 +39,40 @@ void setup() {
39
39
40
40
void loop () {
41
41
42
- if (_myPID.autoTune ->autoTuneLoop () != _myPID.autoTune ->RUN_PID ) { // running autotune
43
-
44
- Input = avg (_myPID.analogReadFast (inputPin)); // filtered input
45
- analogWrite (outputPin, Output);
46
- }
47
-
48
- if (_myPID.autoTune ->autoTuneLoop () == _myPID.autoTune ->NEW_TUNINGS ) { // get new tunings
49
- _myPID.autoTune ->setAutoTuneConstants (&Kp, &Ki, &Kd); // set new tunings
50
- _myPID.clearAutoTune (); // releases memory used by AutoTune object
51
- _myPID.SetMode (QuickPID::AUTOMATIC); // setup PID
52
- _myPID.SetTunings (Kp, Ki, Kd, POn); // apply new tunings to PID
53
- Setpoint = 500 ;
54
- }
55
-
56
- if (_myPID.autoTune ->autoTuneLoop () == _myPID.autoTune ->RUN_PID ) { // running PID
57
- if (printOrPlotter == 0 ) { // plotter
58
- Serial.print (" Setpoint:" ); Serial.print (Setpoint); Serial.print (" ," );
59
- Serial.print (" Input:" ); Serial.print (Input); Serial.print (" ," );
60
- Serial.print (" Output:" ); Serial.print (Output); Serial.println ();
61
- }
62
- Input = _myPID.analogReadFast (inputPin);
42
+ if (_myPID.autoTune ) // Avoid deferencing nullptr after _myPID.clearAutoTune()
43
+ {
44
+ uint8_t autoTuningCurrentStage = autoTuneLoop ();
45
+ if (autoTuningCurrentStage < _myPID.autoTune ->RUN_PID )
46
+ {
47
+ Input = avg (_myPID.analogReadFast (inputPin)); // filtered input
48
+ analogWrite (outputPin, Output);
49
+
50
+ if (autoTuningCurrentStage == _myPID.autoTune ->NEW_TUNINGS ) // get new tunings
51
+ {
52
+ _myPID.autoTune ->setAutoTuneConstants (&Kp, &Ki, &Kd); // set new tunings
53
+ _myPID.SetMode (QuickPID::AUTOMATIC); // setup PID
54
+ _myPID.SetTunings (Kp, Ki, Kd, POn); // apply new tunings to PID
55
+ Setpoint = 500 ;
56
+ }
57
+ }
58
+ else // RUN_PID stage
59
+ {
60
+ if (printOrPlotter == 0 ) // plotter
61
+ {
62
+ _myPID.clearAutoTune (); // releases memory used by AutoTune object
63
+ Serial.print (" Setpoint:" ); Serial.print (Setpoint); Serial.print (" ," );
64
+ Serial.print (" Input:" ); Serial.print (Input); Serial.print (" ," );
65
+ Serial.print (" Output:" ); Serial.print (Output); Serial.println ();
66
+ }
67
+ }
68
+
69
+ }
70
+ else // Autotune already done (or not created)
71
+ {
72
+ Input = _myPID.analogReadFast (inputPin);
63
73
_myPID.Compute ();
64
74
analogWrite (outputPin, Output);
65
- }
75
+ }
66
76
}
67
77
68
78
float avg (int inputVal) {
0 commit comments