|
1 | 1 | /**********************************************************************************
|
2 |
| - QuickPID Library for Arduino - Version 2.4.3 |
| 2 | + QuickPID Library for Arduino - Version 2.4.4 |
3 | 3 | by dlloydev https://github.com/Dlloydev/QuickPID
|
4 | 4 | Based on the Arduino PID Library and work on AutoTunePID class
|
5 | 5 | by gnalbandian (Gonzalo). Licensed under the MIT License.
|
@@ -65,18 +65,13 @@ bool QuickPID::Compute() {
|
65 | 65 | dmTerm = kdm * dInput;
|
66 | 66 | deTerm = -kde * error;
|
67 | 67 |
|
68 |
| - outputSum += iTerm; |
69 |
| - if (outputSum > outMax) iTerm -= outputSum - outMax; // integral anti-windup |
70 |
| - else if (outputSum < outMin) iTerm += outMin - outputSum; |
| 68 | + outputSum += iTerm; // include integral amount |
| 69 | + if (outputSum > outMax) outputSum -= outputSum - outMax; // early integral anti-windup at outMax |
| 70 | + else if (outputSum < outMin) outputSum += outMin - outputSum; // early integral anti-windup at outMin |
| 71 | + outputSum = constrain(outputSum, outMin, outMax); // integral anti-windup clamp |
| 72 | + outputSum = constrain(outputSum - pmTerm, outMin, outMax); // include pmTerm and clamp |
| 73 | + *myOutput = constrain(outputSum + peTerm + dmTerm - deTerm, outMin, outMax); // totalize, clamp and drive the output |
71 | 74 |
|
72 |
| - float output = peTerm; |
73 |
| - outputSum -= pmTerm; |
74 |
| - outputSum = constrain(outputSum, outMin, outMax); |
75 |
| - |
76 |
| - output += outputSum - deTerm + dmTerm; |
77 |
| - output = constrain(output, outMin, outMax); |
78 |
| - |
79 |
| - *myOutput = output; |
80 | 75 | lastInput = input;
|
81 | 76 | lastTime = now;
|
82 | 77 | return true;
|
@@ -399,26 +394,14 @@ void AutoTunePID::setAutoTuneConstants(float * kp, float * ki, float * kd) {
|
399 | 394 | }
|
400 | 395 |
|
401 | 396 | /* Utility************************************************************/
|
402 |
| - |
| 397 | +// https://github.com/avandalen/avdweb_AnalogReadFast |
403 | 398 | int QuickPID::analogReadFast(int ADCpin) {
|
404 | 399 | #if defined(__AVR_ATmega328P__)
|
405 | 400 | byte ADCregOriginal = ADCSRA;
|
406 | 401 | ADCSRA = (ADCSRA & B11111000) | 5; // 32 prescaler
|
407 | 402 | int adc = analogRead(ADCpin);
|
408 | 403 | ADCSRA = ADCregOriginal;
|
409 | 404 | return adc;
|
410 |
| -#elif defined(__AVR_ATtiny_Zero_One__) || defined(__AVR_ATmega_Zero__) |
411 |
| - byte ADCregOriginal = ADC0_CTRLC; |
412 |
| - ADC0_CTRLC = 0x54; // reduced cap, Vdd ref, 32 prescaler |
413 |
| - int adc = analogRead(ADCpin); |
414 |
| - ADC0_CTRLC = ADCregOriginal; |
415 |
| - return adc; |
416 |
| -#elif defined(__AVR_DA__) |
417 |
| - byte ADCregOriginal = ADC0.CTRLC; |
418 |
| - ADC0.CTRLC = ADC_PRESC_DIV32_gc; // 32 prescaler |
419 |
| - int adc = analogRead(ADCpin); |
420 |
| - ADC0.CTRLC = ADCregOriginal; |
421 |
| - return adc; |
422 | 405 | #else
|
423 | 406 | return analogRead(ADCpin);
|
424 | 407 | # endif
|
|
0 commit comments