Carbon Fibre / Classic_PID
Committer:
acodd
Date:
Wed May 27 07:12:53 2015 +0000
Revision:
5:b9ae2b80dfcd
Parent:
4:7b42de70b65f
Removed some scale factor correction from part of the loop.
;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ms523 0:3a0d53c1740f 1 #include "mbed.h"
ms523 0:3a0d53c1740f 2 #include "Classic_PID.h"
ms523 0:3a0d53c1740f 3
ms523 0:3a0d53c1740f 4 // Create object
ms523 0:3a0d53c1740f 5 Classic_PID::Classic_PID(float Kp, float Ki, float Kd, float kvelff)
ms523 0:3a0d53c1740f 6 {
ms523 0:3a0d53c1740f 7
ms523 0:3a0d53c1740f 8 // Save paramaters
ms523 0:3a0d53c1740f 9 _Kp = Kp;
ms523 0:3a0d53c1740f 10 _Ki = Ki;
ms523 0:3a0d53c1740f 11 _Kd = Kd;
ms523 0:3a0d53c1740f 12 _kvelff = kvelff;
ms523 0:3a0d53c1740f 13 }
ms523 0:3a0d53c1740f 14
ms523 0:3a0d53c1740f 15 // Set Methods
ms523 0:3a0d53c1740f 16 void Classic_PID::setSetPoint(float sp)
ms523 0:3a0d53c1740f 17 {
ms523 0:3a0d53c1740f 18
ms523 0:3a0d53c1740f 19 _setPoint = sp;
ms523 0:3a0d53c1740f 20
ms523 0:3a0d53c1740f 21 }
ms523 0:3a0d53c1740f 22
ms523 0:3a0d53c1740f 23 void Classic_PID::setProcessValue(float pv)
ms523 0:3a0d53c1740f 24 {
ms523 0:3a0d53c1740f 25
ms523 0:3a0d53c1740f 26 _processVariable = pv;
ms523 0:3a0d53c1740f 27
ms523 0:3a0d53c1740f 28 }
ms523 0:3a0d53c1740f 29
ms523 0:3a0d53c1740f 30 float Classic_PID::compute(void)
ms523 0:3a0d53c1740f 31 {
ms523 0:3a0d53c1740f 32 int _error = _setPoint - _processVariable; // Work out the instantaneous error
ms523 4:7b42de70b65f 33
ms523 0:3a0d53c1740f 34 // Calculate the individual parts of the PID algorithm
ms523 0:3a0d53c1740f 35 float Proportional = _Kp * (_error - _lastError); // Calculate the Proportional part
ms523 0:3a0d53c1740f 36 float Intergral = _Ki * _error; // Calculate the Intergral part
ms523 4:7b42de70b65f 37
ms523 0:3a0d53c1740f 38 // Calculate the output
ms523 4:7b42de70b65f 39 _output = _lastOutput + Proportional + Intergral;
ms523 4:7b42de70b65f 40 /*
ms523 4:7b42de70b65f 41 // decay to stop creep...
ms523 4:7b42de70b65f 42 if(_setPoint == 0) {
ms523 4:7b42de70b65f 43 if(_output > 0) {
ms523 4:7b42de70b65f 44 _output -= 0.0001;
ms523 4:7b42de70b65f 45 } else if(_output < 0) {
ms523 4:7b42de70b65f 46 _output += 0.0001;
ms523 4:7b42de70b65f 47 }
ms523 4:7b42de70b65f 48 }
ms523 4:7b42de70b65f 49 */
ms523 0:3a0d53c1740f 50 // Check for wind-up
ms523 1:f85ca5649d55 51 if(_output > _maxLimit)
ms523 4:7b42de70b65f 52 _output = _maxLimit;
ms523 1:f85ca5649d55 53 if(_output < _minLimit)
ms523 4:7b42de70b65f 54 _output = _minLimit;
ms523 4:7b42de70b65f 55
ms523 0:3a0d53c1740f 56 // Save the outputs for the next time round the loop
ms523 4:7b42de70b65f 57 _lastOutput = _output; // Save the ouput
ms523 0:3a0d53c1740f 58 _lastError = _error;
ms523 0:3a0d53c1740f 59
ms523 0:3a0d53c1740f 60 // Return the new output
ms523 0:3a0d53c1740f 61 return(_output); // Return the PI loop output (duty cycle)
ms523 0:3a0d53c1740f 62 }
ms523 0:3a0d53c1740f 63
ms523 0:3a0d53c1740f 64 void Classic_PID::setKp(float Kp)
ms523 0:3a0d53c1740f 65 {
ms523 0:3a0d53c1740f 66
ms523 0:3a0d53c1740f 67 _Kp = Kp;
ms523 0:3a0d53c1740f 68
ms523 0:3a0d53c1740f 69 }
ms523 0:3a0d53c1740f 70
ms523 0:3a0d53c1740f 71 void Classic_PID::setKi(float Ki)
ms523 0:3a0d53c1740f 72 {
ms523 0:3a0d53c1740f 73
ms523 0:3a0d53c1740f 74 _Ki = Ki;
ms523 0:3a0d53c1740f 75 _sumError = 0;
ms523 0:3a0d53c1740f 76
ms523 0:3a0d53c1740f 77 }
ms523 0:3a0d53c1740f 78
ms523 0:3a0d53c1740f 79 float Classic_PID::getKp(void)
ms523 0:3a0d53c1740f 80 {
ms523 0:3a0d53c1740f 81
ms523 0:3a0d53c1740f 82 return(_Kp);
ms523 0:3a0d53c1740f 83
ms523 0:3a0d53c1740f 84 }
ms523 0:3a0d53c1740f 85
ms523 0:3a0d53c1740f 86 float Classic_PID::getKi(void)
ms523 0:3a0d53c1740f 87 {
ms523 0:3a0d53c1740f 88
ms523 0:3a0d53c1740f 89 return(_Ki);
ms523 0:3a0d53c1740f 90
ms523 0:3a0d53c1740f 91 }
ms523 0:3a0d53c1740f 92
ms523 0:3a0d53c1740f 93 float Classic_PID::getKvelff(void)
ms523 0:3a0d53c1740f 94 {
ms523 0:3a0d53c1740f 95
ms523 0:3a0d53c1740f 96 return(_kvelff);
ms523 0:3a0d53c1740f 97
ms523 0:3a0d53c1740f 98 }
ms523 0:3a0d53c1740f 99
ms523 0:3a0d53c1740f 100 float Classic_PID::compute_ff(void)
ms523 0:3a0d53c1740f 101 {
ms523 0:3a0d53c1740f 102 int _error = _setPoint - _processVariable; // Work out the instantaneous error
ms523 4:7b42de70b65f 103
ms523 0:3a0d53c1740f 104 // Calculate the individual parts of the PID algorithm
ms523 0:3a0d53c1740f 105 float Proportional = _Kp * _error; // Calculate the Proportional part
ms523 4:7b42de70b65f 106 _sumError += _error; // Add this error to the sum of errors
ms523 1:f85ca5649d55 107 if(_sumError > 1000)
ms523 1:f85ca5649d55 108 _sumError = 1000;
ms523 0:3a0d53c1740f 109 float Intergral = _Ki * _sumError; // Calculate the Intergral part
ms523 4:7b42de70b65f 110
ms523 0:3a0d53c1740f 111 // Calculate the output
ms523 4:7b42de70b65f 112 _output = (_setPoint * _kvelff) + Proportional + Intergral;
ms523 4:7b42de70b65f 113
ms523 0:3a0d53c1740f 114 // Check for wind-up
ms523 1:f85ca5649d55 115 if(_output > _maxLimit)
ms523 4:7b42de70b65f 116 _output = _maxLimit;
ms523 1:f85ca5649d55 117 if(_output < _minLimit)
ms523 4:7b42de70b65f 118 _output = _minLimit;
ms523 4:7b42de70b65f 119
ms523 0:3a0d53c1740f 120 // Return the new output
ms523 0:3a0d53c1740f 121 return(_output); // Return the PI loop output (duty cycle)
ms523 0:3a0d53c1740f 122 }
ms523 0:3a0d53c1740f 123
ms523 0:3a0d53c1740f 124 void Classic_PID::setKvelff(float Kvelff)
ms523 0:3a0d53c1740f 125 {
ms523 0:3a0d53c1740f 126
acodd 5:b9ae2b80dfcd 127 _kvelff = Kvelff;
ms523 0:3a0d53c1740f 128
ms523 1:f85ca5649d55 129 }
ms523 1:f85ca5649d55 130
ms523 1:f85ca5649d55 131 void Classic_PID::setProcessLimits(float maxLimit, float minLimit)
ms523 1:f85ca5649d55 132 {
ms523 1:f85ca5649d55 133
ms523 1:f85ca5649d55 134 _maxLimit = maxLimit;
ms523 1:f85ca5649d55 135 _minLimit = minLimit;
ms523 1:f85ca5649d55 136
ms523 1:f85ca5649d55 137 }
ms523 1:f85ca5649d55 138
ms523 1:f85ca5649d55 139 float Classic_PID::getSetPoint(void)
ms523 1:f85ca5649d55 140 {
ms523 1:f85ca5649d55 141
ms523 1:f85ca5649d55 142 return(_setPoint);
ms523 1:f85ca5649d55 143
ms523 0:3a0d53c1740f 144 }