baseline build

Dependencies:   FastPWM mbed-os mbed

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?

UserRevisionLine numberNew 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