|
| 1 | +/******************************************************************** |
| 2 | + QuickPID Autotune Example (using Temperature Control Lab) |
| 3 | + http://apmonitor.com/pdc/index.php/Main/ArduinoTemperatureControl |
| 4 | + ********************************************************************/ |
| 5 | + |
| 6 | +#include <sTune.h> |
| 7 | +#include <QuickPID.h> |
| 8 | + |
| 9 | +const uint8_t inputPin = 0; |
| 10 | +const uint8_t outputPin = 3; |
| 11 | + |
| 12 | +//user settings |
| 13 | +const uint32_t testTimeSec = 300; |
| 14 | +const float outputStart = 0; |
| 15 | +const float outputStep = 20; |
| 16 | +const uint16_t samples = 500; |
| 17 | +const uint32_t settleTimeSec = 10; |
| 18 | + |
| 19 | +//input constants |
| 20 | +const float mvResolution = 3300 / 1024.0f; |
| 21 | +const float bias = 50; |
| 22 | + |
| 23 | +float Input = 0, Output = 0, Setpoint = 30, Kp = 0, Ki = 0, Kd = 0; |
| 24 | + |
| 25 | +QuickPID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, |
| 26 | + myPID.pMode::pOnError, |
| 27 | + myPID.dMode::dOnMeas, |
| 28 | + myPID.iAwMode::iAwClamp, |
| 29 | + myPID.Action::reverse); |
| 30 | + |
| 31 | +sTune tuner = sTune(&Input, &Output, tuner.zieglerNicholsPID, tuner.directIP, tuner.printALL); |
| 32 | +/* zieglerNicholsPI directIP serialOFF |
| 33 | + zieglerNicholsPID direct5T printALL |
| 34 | + tyreusLuybenPI reverseIP printSUMMARY |
| 35 | + tyreusLuybenPID reverse5T printDEBUG |
| 36 | + cianconeMarlinPI printPIDTUNER |
| 37 | + cianconeMarlinPID serialPLOTTER |
| 38 | + amigofPID |
| 39 | + pessenIntegralPID |
| 40 | + someOvershootPID |
| 41 | + noOvershootPID |
| 42 | +*/ |
| 43 | +void setup() { |
| 44 | + analogReference(EXTERNAL); |
| 45 | + Serial.begin(115200); |
| 46 | + analogWrite(outputPin, outputStart); |
| 47 | + tuner.Configure(outputStart, outputStep, testTimeSec, settleTimeSec, samples); |
| 48 | +} |
| 49 | + |
| 50 | +void loop() { |
| 51 | + |
| 52 | + switch (tuner.Run()) { |
| 53 | + case tuner.inOut: |
| 54 | + Input = (analogRead(inputPin) / mvResolution) - bias; |
| 55 | + analogWrite(outputPin, Output); |
| 56 | + break; |
| 57 | + |
| 58 | + case tuner.tunings: |
| 59 | + tuner.SetAutoTunings(&Kp, &Ki, &Kd); |
| 60 | + myPID.SetMode(myPID.Control::automatic); |
| 61 | + myPID.SetSampleTimeUs((testTimeSec * 1000000) / samples); |
| 62 | + myPID.SetTunings(Kp, Ki, Kd); |
| 63 | + break; |
| 64 | + |
| 65 | + case tuner.runPid: |
| 66 | + Input = (analogRead(inputPin) / mvResolution) - bias; |
| 67 | + myPID.Compute(); |
| 68 | + analogWrite(outputPin, Output); |
| 69 | + break; |
| 70 | + } |
| 71 | +} |
0 commit comments