baseline build
Dependencies: FastPWM mbed-os mbed
PowerController.cpp@1:909f2393bc01, 2017-06-19 (annotated)
- Committer:
- jrhodes5150
- Date:
- Mon Jun 19 16:04:47 2017 +0000
- Revision:
- 1:909f2393bc01
- Parent:
- 0:8a420ac6394e
added fastPWM
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jrhodes5150 | 0:8a420ac6394e | 1 | |
jrhodes5150 | 0:8a420ac6394e | 2 | #include "mbed.h" |
jrhodes5150 | 0:8a420ac6394e | 3 | #include "PowerController.h" |
jrhodes5150 | 0:8a420ac6394e | 4 | #include "MillisecondCounter.h" |
jrhodes5150 | 0:8a420ac6394e | 5 | #include "CMSerial.h" |
jrhodes5150 | 0:8a420ac6394e | 6 | #include "math.h" |
jrhodes5150 | 0:8a420ac6394e | 7 | #include "DebugPort.h" |
jrhodes5150 | 0:8a420ac6394e | 8 | |
jrhodes5150 | 0:8a420ac6394e | 9 | DebugPort pc; |
jrhodes5150 | 0:8a420ac6394e | 10 | PowerController::PowerController(void) : led3(LED3), |
jrhodes5150 | 0:8a420ac6394e | 11 | led4(LED4), |
jrhodes5150 | 0:8a420ac6394e | 12 | ADC(), |
jrhodes5150 | 0:8a420ac6394e | 13 | acquisitionTimer(this, &PowerController::AcquireData), |
jrhodes5150 | 0:8a420ac6394e | 14 | pidTimer(this, &PowerController::ProcessPID) |
jrhodes5150 | 0:8a420ac6394e | 15 | { |
jrhodes5150 | 0:8a420ac6394e | 16 | |
jrhodes5150 | 0:8a420ac6394e | 17 | thread.start(this, &PowerController::ThreadEntry); |
jrhodes5150 | 0:8a420ac6394e | 18 | |
jrhodes5150 | 0:8a420ac6394e | 19 | |
jrhodes5150 | 0:8a420ac6394e | 20 | } |
jrhodes5150 | 0:8a420ac6394e | 21 | |
jrhodes5150 | 0:8a420ac6394e | 22 | void PowerController::ThreadEntry(void) |
jrhodes5150 | 0:8a420ac6394e | 23 | { |
jrhodes5150 | 0:8a420ac6394e | 24 | |
jrhodes5150 | 0:8a420ac6394e | 25 | ioControl.Activate(); |
jrhodes5150 | 0:8a420ac6394e | 26 | ioControl.Deactivate(); |
jrhodes5150 | 0:8a420ac6394e | 27 | |
jrhodes5150 | 0:8a420ac6394e | 28 | for(;;) { |
jrhodes5150 | 0:8a420ac6394e | 29 | led3 = (GetTime_ms() / 1000) & 1; |
jrhodes5150 | 0:8a420ac6394e | 30 | Device.deviceConfig.voltageSensed = 0.0; |
jrhodes5150 | 0:8a420ac6394e | 31 | Device.deviceConfig.currentSensed = 0.0; |
jrhodes5150 | 0:8a420ac6394e | 32 | Device.deviceConfig.sensedResistance = 0.0; |
jrhodes5150 | 0:8a420ac6394e | 33 | Device.deviceConfig.sensedPower = 0.0; |
jrhodes5150 | 0:8a420ac6394e | 34 | // Wait for an activation |
jrhodes5150 | 0:8a420ac6394e | 35 | if( ioControl.isActivateSwitchOn() && ioControl.hasFalling()) { |
jrhodes5150 | 0:8a420ac6394e | 36 | Device.deviceConfig.doneBit = 0; |
jrhodes5150 | 0:8a420ac6394e | 37 | // Start acquiring data |
jrhodes5150 | 0:8a420ac6394e | 38 | myTime = GetTime_ms(); |
jrhodes5150 | 0:8a420ac6394e | 39 | loopTimer = 0; |
jrhodes5150 | 0:8a420ac6394e | 40 | Device.ClearAcquisitionData(); |
jrhodes5150 | 0:8a420ac6394e | 41 | switch (Device.deviceConfig.outputMode) { |
jrhodes5150 | 0:8a420ac6394e | 42 | case OMRamp: |
jrhodes5150 | 0:8a420ac6394e | 43 | ExecuteRamp(); |
jrhodes5150 | 0:8a420ac6394e | 44 | break; |
jrhodes5150 | 0:8a420ac6394e | 45 | case OMConstantVoltage: |
jrhodes5150 | 0:8a420ac6394e | 46 | ExecuteConstantVoltage(); |
jrhodes5150 | 0:8a420ac6394e | 47 | break; |
jrhodes5150 | 0:8a420ac6394e | 48 | case OMConstantPower: |
jrhodes5150 | 0:8a420ac6394e | 49 | ExecuteConstantPower(); |
jrhodes5150 | 0:8a420ac6394e | 50 | break; |
jrhodes5150 | 0:8a420ac6394e | 51 | case OMCalibrate: |
jrhodes5150 | 0:8a420ac6394e | 52 | Calibrate(); |
jrhodes5150 | 0:8a420ac6394e | 53 | break; |
jrhodes5150 | 0:8a420ac6394e | 54 | default: |
jrhodes5150 | 0:8a420ac6394e | 55 | break; |
jrhodes5150 | 0:8a420ac6394e | 56 | } |
jrhodes5150 | 0:8a420ac6394e | 57 | Device.deviceConfig.doneBit = 1; |
jrhodes5150 | 0:8a420ac6394e | 58 | ioControl.SetOutputVoltage(0); |
jrhodes5150 | 0:8a420ac6394e | 59 | ioControl.Deactivate(); |
jrhodes5150 | 0:8a420ac6394e | 60 | |
jrhodes5150 | 0:8a420ac6394e | 61 | led4 = 0; |
jrhodes5150 | 0:8a420ac6394e | 62 | |
jrhodes5150 | 0:8a420ac6394e | 63 | // pause to get a couple more samples |
jrhodes5150 | 0:8a420ac6394e | 64 | rtos::Thread::wait(Device.deviceConfig.msSamplePeriod * 2); |
jrhodes5150 | 0:8a420ac6394e | 65 | acquisitionTimer.stop(); |
jrhodes5150 | 0:8a420ac6394e | 66 | } |
jrhodes5150 | 0:8a420ac6394e | 67 | // let others run |
jrhodes5150 | 0:8a420ac6394e | 68 | rtos::Thread::wait(1); |
jrhodes5150 | 0:8a420ac6394e | 69 | } |
jrhodes5150 | 0:8a420ac6394e | 70 | } |
jrhodes5150 | 0:8a420ac6394e | 71 | |
jrhodes5150 | 0:8a420ac6394e | 72 | void PowerController::ExecuteRamp(void) |
jrhodes5150 | 0:8a420ac6394e | 73 | { |
jrhodes5150 | 0:8a420ac6394e | 74 | // Set initial output voltage. |
jrhodes5150 | 0:8a420ac6394e | 75 | ioControl.SetOutputVoltage(Device.deviceConfig.startVoltage); |
jrhodes5150 | 0:8a420ac6394e | 76 | ioControl.SetPWMFrequency(Device.deviceConfig.pwmFrequency); |
jrhodes5150 | 0:8a420ac6394e | 77 | |
jrhodes5150 | 0:8a420ac6394e | 78 | loopTimer = 0; |
jrhodes5150 | 0:8a420ac6394e | 79 | double resistance; |
jrhodes5150 | 0:8a420ac6394e | 80 | unsigned powerStartTime = GetTime_ms(); |
jrhodes5150 | 0:8a420ac6394e | 81 | led4 = 1; |
jrhodes5150 | 0:8a420ac6394e | 82 | if(Device.deviceConfig.msOpenLoopDuration > 0) { |
jrhodes5150 | 0:8a420ac6394e | 83 | // Begin activation |
jrhodes5150 | 0:8a420ac6394e | 84 | pid.SetTarget(Device.deviceConfig.startVoltage); // used to put the voltage into the Acquisition Data |
jrhodes5150 | 0:8a420ac6394e | 85 | // Start acquiring data |
jrhodes5150 | 0:8a420ac6394e | 86 | acquisitionTimer.start(Device.deviceConfig.msSamplePeriod); |
jrhodes5150 | 0:8a420ac6394e | 87 | |
jrhodes5150 | 0:8a420ac6394e | 88 | |
jrhodes5150 | 0:8a420ac6394e | 89 | ioControl.Activate(); |
jrhodes5150 | 0:8a420ac6394e | 90 | //OPEN LOOP Control loop |
jrhodes5150 | 0:8a420ac6394e | 91 | |
jrhodes5150 | 0:8a420ac6394e | 92 | |
jrhodes5150 | 0:8a420ac6394e | 93 | for (;;) { |
jrhodes5150 | 0:8a420ac6394e | 94 | loopTimer = GetTime_ms() - powerStartTime; |
jrhodes5150 | 0:8a420ac6394e | 95 | if (loopTimer > (Device.deviceConfig.msOpenLoopDuration)) |
jrhodes5150 | 0:8a420ac6394e | 96 | break; |
jrhodes5150 | 0:8a420ac6394e | 97 | if (!ioControl.isActivateSwitchOn()) |
jrhodes5150 | 0:8a420ac6394e | 98 | break; |
jrhodes5150 | 0:8a420ac6394e | 99 | } |
jrhodes5150 | 0:8a420ac6394e | 100 | } |
jrhodes5150 | 0:8a420ac6394e | 101 | if(Device.deviceConfig.msRampDuration >0) { |
jrhodes5150 | 0:8a420ac6394e | 102 | resistance = Device.deviceConfig.startVoltage/ADC.GetSensedCurrent(); |
jrhodes5150 | 0:8a420ac6394e | 103 | |
jrhodes5150 | 0:8a420ac6394e | 104 | // Calculate the voltage from the difference needed from the end and start power. |
jrhodes5150 | 0:8a420ac6394e | 105 | double endVoltage = sqrt(Device.deviceConfig.rampEndPower * resistance); |
jrhodes5150 | 0:8a420ac6394e | 106 | double startVoltage = sqrt(Device.deviceConfig.rampStartPower * resistance); |
jrhodes5150 | 0:8a420ac6394e | 107 | double voltageDelta = endVoltage - startVoltage; |
jrhodes5150 | 0:8a420ac6394e | 108 | |
jrhodes5150 | 0:8a420ac6394e | 109 | |
jrhodes5150 | 0:8a420ac6394e | 110 | // Calculate the voltagePerMS to find the step value for the ramp time |
jrhodes5150 | 0:8a420ac6394e | 111 | double voltagePerMs = voltageDelta / (Device.deviceConfig.msRampDuration); |
jrhodes5150 | 0:8a420ac6394e | 112 | |
jrhodes5150 | 0:8a420ac6394e | 113 | // Set the Ramp starting Voltage |
jrhodes5150 | 0:8a420ac6394e | 114 | ioControl.ChangeOutputVoltage( startVoltage ); |
jrhodes5150 | 0:8a420ac6394e | 115 | |
jrhodes5150 | 0:8a420ac6394e | 116 | // We want to loop until our Ramp duration is complete or the activation switch has been depressed. |
jrhodes5150 | 0:8a420ac6394e | 117 | // Because we don't know how long the loop takes, we need to check the loop time and set the new output |
jrhodes5150 | 0:8a420ac6394e | 118 | // voltage based on the number of milliseconds that have passed during the loop. Since our discrete voltage |
jrhodes5150 | 0:8a420ac6394e | 119 | // increments are the change needed/millisecond, if our loop is faster than 1 ms, we should see a nice clean |
jrhodes5150 | 0:8a420ac6394e | 120 | // ramp. If it is slower than a millisecond, the ramp will be jagged. |
jrhodes5150 | 0:8a420ac6394e | 121 | unsigned startTime = GetTime_ms(); |
jrhodes5150 | 0:8a420ac6394e | 122 | unsigned elapsedTime = 0; |
jrhodes5150 | 0:8a420ac6394e | 123 | double setVoltage = startVoltage; |
jrhodes5150 | 0:8a420ac6394e | 124 | |
jrhodes5150 | 0:8a420ac6394e | 125 | // Begin activation |
jrhodes5150 | 0:8a420ac6394e | 126 | pid.SetTarget(setVoltage); // used to put the voltage into the Acquisition Data |
jrhodes5150 | 0:8a420ac6394e | 127 | for (;;) { |
jrhodes5150 | 0:8a420ac6394e | 128 | // Determine how long it took us to go through the loop. The first time this should be zero |
jrhodes5150 | 0:8a420ac6394e | 129 | elapsedTime = GetTime_ms() - startTime; |
jrhodes5150 | 0:8a420ac6394e | 130 | loopTimer = GetTime_ms() - powerStartTime; |
jrhodes5150 | 0:8a420ac6394e | 131 | // Break out of the loop if we have activated longer than the ramp duration + the open loop duration. |
jrhodes5150 | 0:8a420ac6394e | 132 | if ( elapsedTime > ( Device.deviceConfig.msRampDuration ) + ( Device.deviceConfig.msOpenLoopDuration )) { |
jrhodes5150 | 0:8a420ac6394e | 133 | break; |
jrhodes5150 | 0:8a420ac6394e | 134 | } |
jrhodes5150 | 0:8a420ac6394e | 135 | // Double check that the user is still activating. |
jrhodes5150 | 0:8a420ac6394e | 136 | if ( !ioControl.isActivateSwitchOn() ) { |
jrhodes5150 | 0:8a420ac6394e | 137 | break; |
jrhodes5150 | 0:8a420ac6394e | 138 | } |
jrhodes5150 | 0:8a420ac6394e | 139 | |
jrhodes5150 | 0:8a420ac6394e | 140 | // Now, set out output voltage to the last voltage plus however many steps we need to catch up. That is, if it took |
jrhodes5150 | 0:8a420ac6394e | 141 | // 4 ms to get through the loop the first time, we should set the new voltage to the last voltage + 4 ms worth of steps. |
jrhodes5150 | 0:8a420ac6394e | 142 | setVoltage = (startVoltage + (voltagePerMs * elapsedTime)); |
jrhodes5150 | 0:8a420ac6394e | 143 | pid.SetTarget(setVoltage); // used to put the voltage into the Acquisition Data only |
jrhodes5150 | 0:8a420ac6394e | 144 | // Make sure that we don't exceed the max voltage |
jrhodes5150 | 0:8a420ac6394e | 145 | if ( setVoltage < endVoltage ) { |
jrhodes5150 | 0:8a420ac6394e | 146 | ioControl.ChangeOutputVoltage( setVoltage ); |
jrhodes5150 | 0:8a420ac6394e | 147 | } |
jrhodes5150 | 0:8a420ac6394e | 148 | rtos::Thread::wait(1); |
jrhodes5150 | 0:8a420ac6394e | 149 | } |
jrhodes5150 | 0:8a420ac6394e | 150 | } |
jrhodes5150 | 0:8a420ac6394e | 151 | //start PID Control |
jrhodes5150 | 0:8a420ac6394e | 152 | |
jrhodes5150 | 0:8a420ac6394e | 153 | pid.Reset(); |
jrhodes5150 | 0:8a420ac6394e | 154 | pid.SetOutputRange(0,3.3); |
jrhodes5150 | 0:8a420ac6394e | 155 | pid.SetTarget(Device.deviceConfig.rampEndPower); |
jrhodes5150 | 0:8a420ac6394e | 156 | Device.deviceConfig.voltageSensed = ADC.GetSensedVoltage(); |
jrhodes5150 | 0:8a420ac6394e | 157 | Device.deviceConfig.currentSensed = ADC.GetSensedCurrent(); |
jrhodes5150 | 0:8a420ac6394e | 158 | pid.SetPID(Device.deviceConfig.kp,Device.deviceConfig.ki,Device.deviceConfig.kd); |
jrhodes5150 | 0:8a420ac6394e | 159 | ioControl.SetLimits(Device.deviceConfig.vLim, Device.deviceConfig.iLim); |
jrhodes5150 | 0:8a420ac6394e | 160 | for(;;) { |
jrhodes5150 | 0:8a420ac6394e | 161 | loopTimer = GetTime_ms() - powerStartTime; |
jrhodes5150 | 0:8a420ac6394e | 162 | if(loopTimer > (Device.deviceConfig.TotalDurationSeconds )) |
jrhodes5150 | 0:8a420ac6394e | 163 | break; |
jrhodes5150 | 0:8a420ac6394e | 164 | if(!ioControl.isActivateSwitchOn()) |
jrhodes5150 | 0:8a420ac6394e | 165 | break; |
jrhodes5150 | 0:8a420ac6394e | 166 | Device.deviceConfig.voltageSensed = ADC.GetSensedVoltage(); |
jrhodes5150 | 0:8a420ac6394e | 167 | Device.deviceConfig.currentSensed = ADC.GetSensedCurrent(); |
jrhodes5150 | 0:8a420ac6394e | 168 | Device.deviceConfig.sensedResistance = ADC.GetResistance(); |
jrhodes5150 | 0:8a420ac6394e | 169 | Device.deviceConfig.sensedPower = Device.deviceConfig.voltageSensed * Device.deviceConfig.currentSensed ; |
jrhodes5150 | 0:8a420ac6394e | 170 | if(Device.deviceConfig.sensedResistance > 200) |
jrhodes5150 | 0:8a420ac6394e | 171 | pid.SetTarget(25); |
jrhodes5150 | 0:8a420ac6394e | 172 | else |
jrhodes5150 | 0:8a420ac6394e | 173 | pid.SetTarget(Device.deviceConfig.rampEndPower); |
jrhodes5150 | 0:8a420ac6394e | 174 | |
jrhodes5150 | 0:8a420ac6394e | 175 | ProcessPID(); |
jrhodes5150 | 0:8a420ac6394e | 176 | // set output |
jrhodes5150 | 0:8a420ac6394e | 177 | double pidout = pid.GetOutput(); |
jrhodes5150 | 0:8a420ac6394e | 178 | ioControl.SetHVControl(pidout); |
jrhodes5150 | 0:8a420ac6394e | 179 | rtos::Thread::wait(1); |
jrhodes5150 | 0:8a420ac6394e | 180 | } |
jrhodes5150 | 0:8a420ac6394e | 181 | |
jrhodes5150 | 0:8a420ac6394e | 182 | |
jrhodes5150 | 0:8a420ac6394e | 183 | pidTimer.stop(); |
jrhodes5150 | 0:8a420ac6394e | 184 | ioControl.Deactivate(); |
jrhodes5150 | 0:8a420ac6394e | 185 | } |
jrhodes5150 | 0:8a420ac6394e | 186 | //---------------------------------------------------------------------------------------------------------------------------------- |
jrhodes5150 | 0:8a420ac6394e | 187 | void PowerController::ExecuteConstantVoltage(void) |
jrhodes5150 | 0:8a420ac6394e | 188 | { |
jrhodes5150 | 0:8a420ac6394e | 189 | led4 = 1; |
jrhodes5150 | 0:8a420ac6394e | 190 | int powerStartTime = GetTime_ms(); |
jrhodes5150 | 0:8a420ac6394e | 191 | ioControl.SetOutputVoltage(Device.deviceConfig.constantVoltage); |
jrhodes5150 | 0:8a420ac6394e | 192 | ioControl.SetPWMFrequency(Device.deviceConfig.pwmFrequency); |
jrhodes5150 | 0:8a420ac6394e | 193 | ioControl.SetLimits(Device.deviceConfig.vLim, Device.deviceConfig.iLim); |
jrhodes5150 | 0:8a420ac6394e | 194 | pid.SetTarget(Device.deviceConfig.constantVoltage); // so Target voltage shows in Windows |
jrhodes5150 | 0:8a420ac6394e | 195 | ioControl.Activate(); |
jrhodes5150 | 0:8a420ac6394e | 196 | |
jrhodes5150 | 0:8a420ac6394e | 197 | acquisitionTimer.start(Device.deviceConfig.msSamplePeriod); |
jrhodes5150 | 0:8a420ac6394e | 198 | for (;;) { |
jrhodes5150 | 0:8a420ac6394e | 199 | loopTimer = GetTime_ms() - powerStartTime; |
jrhodes5150 | 0:8a420ac6394e | 200 | if (loopTimer > (Device.deviceConfig.TotalDurationSeconds )) |
jrhodes5150 | 0:8a420ac6394e | 201 | break; |
jrhodes5150 | 0:8a420ac6394e | 202 | if (!ioControl.isActivateSwitchOn()) |
jrhodes5150 | 0:8a420ac6394e | 203 | break; |
jrhodes5150 | 0:8a420ac6394e | 204 | Device.deviceConfig.voltageSensed = ADC.GetSensedVoltage(); |
jrhodes5150 | 0:8a420ac6394e | 205 | Device.deviceConfig.currentSensed = ADC.GetSensedCurrent(); |
jrhodes5150 | 0:8a420ac6394e | 206 | Device.deviceConfig.sensedResistance = ADC.GetResistance(); |
jrhodes5150 | 0:8a420ac6394e | 207 | pc.Print("R: ", Device.deviceConfig.sensedResistance); |
jrhodes5150 | 0:8a420ac6394e | 208 | } |
jrhodes5150 | 0:8a420ac6394e | 209 | |
jrhodes5150 | 0:8a420ac6394e | 210 | } |
jrhodes5150 | 0:8a420ac6394e | 211 | //-------------------------------------------------------------------------------------------------------------------------------------------------- |
jrhodes5150 | 0:8a420ac6394e | 212 | void PowerController::ExecuteConstantPower(void) |
jrhodes5150 | 0:8a420ac6394e | 213 | { |
jrhodes5150 | 0:8a420ac6394e | 214 | |
jrhodes5150 | 0:8a420ac6394e | 215 | // Set our initial time |
jrhodes5150 | 0:8a420ac6394e | 216 | pid.Reset(); |
jrhodes5150 | 0:8a420ac6394e | 217 | pid.SetPID(Device.deviceConfig.kp,Device.deviceConfig.ki,Device.deviceConfig.kd); |
jrhodes5150 | 0:8a420ac6394e | 218 | pid.SetOutputRange(0,3.3); |
jrhodes5150 | 0:8a420ac6394e | 219 | pid.SetTarget(Device.deviceConfig.constantPower); |
jrhodes5150 | 0:8a420ac6394e | 220 | |
jrhodes5150 | 0:8a420ac6394e | 221 | // set output voltage |
jrhodes5150 | 0:8a420ac6394e | 222 | ioControl.SetOutputVoltage(10); |
jrhodes5150 | 0:8a420ac6394e | 223 | ioControl.SetPWMFrequency(Device.deviceConfig.pwmFrequency); |
jrhodes5150 | 0:8a420ac6394e | 224 | ioControl.SetLimits(Device.deviceConfig.vLim, Device.deviceConfig.iLim); |
jrhodes5150 | 0:8a420ac6394e | 225 | // Start acquiring data |
jrhodes5150 | 0:8a420ac6394e | 226 | acquisitionTimer.start(Device.deviceConfig.msSamplePeriod); |
jrhodes5150 | 0:8a420ac6394e | 227 | loopTimer = 0; |
jrhodes5150 | 0:8a420ac6394e | 228 | ioControl.Activate(); |
jrhodes5150 | 0:8a420ac6394e | 229 | rtos::Thread::wait(1); |
jrhodes5150 | 0:8a420ac6394e | 230 | |
jrhodes5150 | 0:8a420ac6394e | 231 | Device.deviceConfig.voltageSensed = ADC.GetSensedVoltage(); |
jrhodes5150 | 0:8a420ac6394e | 232 | Device.deviceConfig.currentSensed = ADC.GetSensedCurrent(); |
jrhodes5150 | 0:8a420ac6394e | 233 | led4 = 1; |
jrhodes5150 | 0:8a420ac6394e | 234 | unsigned powerStartTime = GetTime_ms(); |
jrhodes5150 | 0:8a420ac6394e | 235 | for(;;) { |
jrhodes5150 | 0:8a420ac6394e | 236 | loopTimer = GetTime_ms() - powerStartTime; |
jrhodes5150 | 0:8a420ac6394e | 237 | |
jrhodes5150 | 0:8a420ac6394e | 238 | if(loopTimer > (Device.deviceConfig.TotalDurationSeconds )) |
jrhodes5150 | 0:8a420ac6394e | 239 | break; |
jrhodes5150 | 0:8a420ac6394e | 240 | if(!ioControl.isActivateSwitchOn()) |
jrhodes5150 | 0:8a420ac6394e | 241 | break; |
jrhodes5150 | 0:8a420ac6394e | 242 | Device.deviceConfig.voltageSensed = ADC.GetSensedVoltage(); |
jrhodes5150 | 0:8a420ac6394e | 243 | Device.deviceConfig.currentSensed = ADC.GetSensedCurrent(); |
jrhodes5150 | 0:8a420ac6394e | 244 | Device.deviceConfig.sensedResistance = ADC.GetResistance(); |
jrhodes5150 | 0:8a420ac6394e | 245 | Device.deviceConfig.sensedPower = Device.deviceConfig.voltageSensed * Device.deviceConfig.currentSensed; |
jrhodes5150 | 0:8a420ac6394e | 246 | if(ADC.GetResistance() > 200) { |
jrhodes5150 | 0:8a420ac6394e | 247 | pid.SetTarget(25); |
jrhodes5150 | 0:8a420ac6394e | 248 | } else { |
jrhodes5150 | 0:8a420ac6394e | 249 | pid.SetTarget(Device.deviceConfig.constantPower); |
jrhodes5150 | 0:8a420ac6394e | 250 | } |
jrhodes5150 | 0:8a420ac6394e | 251 | ProcessPID(); |
jrhodes5150 | 0:8a420ac6394e | 252 | // set output |
jrhodes5150 | 0:8a420ac6394e | 253 | double pidout = pid.GetOutput(); |
jrhodes5150 | 0:8a420ac6394e | 254 | ioControl.SetHVControl(pidout); |
jrhodes5150 | 0:8a420ac6394e | 255 | rtos::Thread::wait(1); |
jrhodes5150 | 0:8a420ac6394e | 256 | } |
jrhodes5150 | 0:8a420ac6394e | 257 | |
jrhodes5150 | 0:8a420ac6394e | 258 | |
jrhodes5150 | 0:8a420ac6394e | 259 | pidTimer.stop(); |
jrhodes5150 | 0:8a420ac6394e | 260 | |
jrhodes5150 | 0:8a420ac6394e | 261 | |
jrhodes5150 | 0:8a420ac6394e | 262 | } |
jrhodes5150 | 0:8a420ac6394e | 263 | //----------------------------------------------------------------------------------------------------------------- |
jrhodes5150 | 0:8a420ac6394e | 264 | void PowerController::Calibrate(void) |
jrhodes5150 | 0:8a420ac6394e | 265 | { |
jrhodes5150 | 0:8a420ac6394e | 266 | |
jrhodes5150 | 0:8a420ac6394e | 267 | Device.deviceConfig.pwrCalHigh = 1; |
jrhodes5150 | 0:8a420ac6394e | 268 | Device.deviceConfig.pwrCalLow = 1; |
jrhodes5150 | 0:8a420ac6394e | 269 | ioControl.HVcalControl(Device.deviceConfig.voltageCal/10000); |
jrhodes5150 | 0:8a420ac6394e | 270 | ioControl.Activate(); |
jrhodes5150 | 0:8a420ac6394e | 271 | |
jrhodes5150 | 0:8a420ac6394e | 272 | for(;;) { |
jrhodes5150 | 0:8a420ac6394e | 273 | ioControl.HVcalControl(Device.deviceConfig.voltageCal/10000); |
jrhodes5150 | 0:8a420ac6394e | 274 | |
jrhodes5150 | 0:8a420ac6394e | 275 | if (!ioControl.isActivateSwitchOn()) |
jrhodes5150 | 0:8a420ac6394e | 276 | break; |
jrhodes5150 | 0:8a420ac6394e | 277 | rtos::Thread::wait(1); |
jrhodes5150 | 0:8a420ac6394e | 278 | } |
jrhodes5150 | 0:8a420ac6394e | 279 | acquisitionTimer.start(Device.deviceConfig.msSamplePeriod); |
jrhodes5150 | 0:8a420ac6394e | 280 | Device.deviceConfig.pwrCalLow = ADC.GetSensedPower(); |
jrhodes5150 | 0:8a420ac6394e | 281 | Device.deviceConfig.vCalLow = ADC.GetSensedVoltage(); |
jrhodes5150 | 0:8a420ac6394e | 282 | |
jrhodes5150 | 0:8a420ac6394e | 283 | acquisitionTimer.stop(); |
jrhodes5150 | 0:8a420ac6394e | 284 | ioControl.Deactivate(); |
jrhodes5150 | 0:8a420ac6394e | 285 | for(;;) { |
jrhodes5150 | 0:8a420ac6394e | 286 | if( ioControl.isActivateSwitchOn() && ioControl.hasFalling()) |
jrhodes5150 | 0:8a420ac6394e | 287 | break; |
jrhodes5150 | 0:8a420ac6394e | 288 | rtos::Thread::wait(1); |
jrhodes5150 | 0:8a420ac6394e | 289 | } |
jrhodes5150 | 0:8a420ac6394e | 290 | ioControl.HVcalControl(Device.deviceConfig.voltageCal/10000); |
jrhodes5150 | 0:8a420ac6394e | 291 | ioControl.Activate(); |
jrhodes5150 | 0:8a420ac6394e | 292 | |
jrhodes5150 | 0:8a420ac6394e | 293 | for(;;) { |
jrhodes5150 | 0:8a420ac6394e | 294 | ioControl.HVcalControl(Device.deviceConfig.voltageCal/10000); |
jrhodes5150 | 0:8a420ac6394e | 295 | |
jrhodes5150 | 0:8a420ac6394e | 296 | if (!ioControl.isActivateSwitchOn()) |
jrhodes5150 | 0:8a420ac6394e | 297 | break; |
jrhodes5150 | 0:8a420ac6394e | 298 | rtos::Thread::wait(1); |
jrhodes5150 | 0:8a420ac6394e | 299 | } |
jrhodes5150 | 0:8a420ac6394e | 300 | acquisitionTimer.start(Device.deviceConfig.msSamplePeriod); |
jrhodes5150 | 0:8a420ac6394e | 301 | Device.deviceConfig.pwrCalHigh = ADC.GetSensedPower(); |
jrhodes5150 | 0:8a420ac6394e | 302 | Device.deviceConfig.vCalHigh = ADC.GetSensedVoltage(); |
jrhodes5150 | 0:8a420ac6394e | 303 | |
jrhodes5150 | 0:8a420ac6394e | 304 | acquisitionTimer.stop(); |
jrhodes5150 | 0:8a420ac6394e | 305 | ioControl.Deactivate(); |
jrhodes5150 | 0:8a420ac6394e | 306 | |
jrhodes5150 | 0:8a420ac6394e | 307 | FILE *fp = fopen("/local/out.txt", "w"); // Open "out.txt" on the local file system for writing |
jrhodes5150 | 0:8a420ac6394e | 308 | fprintf(fp," %f \n\r",Device.deviceConfig.pwrCalLow ); |
jrhodes5150 | 0:8a420ac6394e | 309 | fprintf(fp," %f \n\r",Device.deviceConfig.pwrCalHigh ); |
jrhodes5150 | 0:8a420ac6394e | 310 | fprintf(fp," %f \n\r",Device.deviceConfig.vCalLow ); |
jrhodes5150 | 0:8a420ac6394e | 311 | fprintf(fp," %f \n\r",Device.deviceConfig.vCalHigh ); |
jrhodes5150 | 0:8a420ac6394e | 312 | if(Device.deviceConfig.kp != 10000) { |
jrhodes5150 | 0:8a420ac6394e | 313 | fprintf(fp," %f \n\r",Device.deviceConfig.kp ); |
jrhodes5150 | 0:8a420ac6394e | 314 | fprintf(fp," %f \n\r",Device.deviceConfig.ki); |
jrhodes5150 | 0:8a420ac6394e | 315 | fprintf(fp," %f \n\r",Device.deviceConfig.kd); |
jrhodes5150 | 0:8a420ac6394e | 316 | } else { |
jrhodes5150 | 0:8a420ac6394e | 317 | fprintf(fp," %f \n\r",0.0 ); |
jrhodes5150 | 0:8a420ac6394e | 318 | fprintf(fp," %f \n\r",0.0); |
jrhodes5150 | 0:8a420ac6394e | 319 | fprintf(fp," %f \n\r",0.0); |
jrhodes5150 | 0:8a420ac6394e | 320 | } |
jrhodes5150 | 0:8a420ac6394e | 321 | fclose(fp); |
jrhodes5150 | 0:8a420ac6394e | 322 | } |
jrhodes5150 | 0:8a420ac6394e | 323 | //------------------------------------------------------------------------------------------------------------------ |
jrhodes5150 | 0:8a420ac6394e | 324 | |
jrhodes5150 | 0:8a420ac6394e | 325 | void PowerController::AcquireData(void) |
jrhodes5150 | 0:8a420ac6394e | 326 | { |
jrhodes5150 | 0:8a420ac6394e | 327 | int elaspedTime = GetTime_ms() - myTime; |
jrhodes5150 | 0:8a420ac6394e | 328 | AcquisitionData data; |
jrhodes5150 | 0:8a420ac6394e | 329 | data.timestampMilliseconds = elaspedTime; |
jrhodes5150 | 0:8a420ac6394e | 330 | data.vSense = Device.deviceConfig.voltageSensed ; |
jrhodes5150 | 0:8a420ac6394e | 331 | data.iSense = Device.deviceConfig.currentSensed; |
jrhodes5150 | 0:8a420ac6394e | 332 | data.vRMS = ADC.GetRMSVoltage(); |
jrhodes5150 | 0:8a420ac6394e | 333 | data.iRMS = ADC.GetRMSCurrent(); |
jrhodes5150 | 0:8a420ac6394e | 334 | data.targetVoltage = pid.GetTarget(); |
jrhodes5150 | 0:8a420ac6394e | 335 | data.power = Device.deviceConfig.sensedPower; |
jrhodes5150 | 0:8a420ac6394e | 336 | data.resistence = Device.deviceConfig.sensedResistance; |
jrhodes5150 | 0:8a420ac6394e | 337 | Device.AddAcquisitionSample(data); |
jrhodes5150 | 0:8a420ac6394e | 338 | } |
jrhodes5150 | 0:8a420ac6394e | 339 | |
jrhodes5150 | 0:8a420ac6394e | 340 | void PowerController::ProcessPID(void) |
jrhodes5150 | 0:8a420ac6394e | 341 | { |
jrhodes5150 | 0:8a420ac6394e | 342 | double snsV = Device.deviceConfig.voltageSensed; |
jrhodes5150 | 0:8a420ac6394e | 343 | double snsI = Device.deviceConfig.currentSensed; |
jrhodes5150 | 0:8a420ac6394e | 344 | double snsPowerCal = snsV * snsI; |
jrhodes5150 | 0:8a420ac6394e | 345 | double snsPower = OffsetAndGain(Device.deviceConfig.pwrCalLow,Device.deviceConfig.pwrCalHigh ,50,100,snsPowerCal); |
jrhodes5150 | 0:8a420ac6394e | 346 | double hvcontrol = ioControl.GetHVControl(); |
jrhodes5150 | 0:8a420ac6394e | 347 | rtos::Thread::wait(10); |
jrhodes5150 | 0:8a420ac6394e | 348 | pc.Print("P: ", snsPowerCal); |
jrhodes5150 | 0:8a420ac6394e | 349 | pc.Print("Pcal: ", snsPower); |
jrhodes5150 | 0:8a420ac6394e | 350 | pc.Print("H: ", hvcontrol); |
jrhodes5150 | 0:8a420ac6394e | 351 | pid.AddSample(snsPower, hvcontrol); |
jrhodes5150 | 0:8a420ac6394e | 352 | } |
jrhodes5150 | 0:8a420ac6394e | 353 | |
jrhodes5150 | 0:8a420ac6394e | 354 | double PowerController::OffsetAndGain(double min, double max, double refMin, double refMax, double inVal) |
jrhodes5150 | 0:8a420ac6394e | 355 | { |
jrhodes5150 | 0:8a420ac6394e | 356 | return ((inVal - min) * (refMax - refMin))/ (max - min) + refMin; |
jrhodes5150 | 0:8a420ac6394e | 357 | } |
jrhodes5150 | 0:8a420ac6394e | 358 |