Dependencies:   RPCInterface mbed

Committer:
protodriveev
Date:
Mon May 07 16:14:45 2012 +0000
Revision:
0:2dbd366be5fd

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
protodriveev 0:2dbd366be5fd 1 /******************************************************************************
protodriveev 0:2dbd366be5fd 2 *********************** Protodrive ***********************
protodriveev 0:2dbd366be5fd 3 ************* Andrew Botelho & William Price *************
protodriveev 0:2dbd366be5fd 4 ******************************************************************************/
protodriveev 0:2dbd366be5fd 5
protodriveev 0:2dbd366be5fd 6 #include "mbed.h"
protodriveev 0:2dbd366be5fd 7 #include "SerialRPCInterface.h"
protodriveev 0:2dbd366be5fd 8 #include "RPCVariable.h"
protodriveev 0:2dbd366be5fd 9
protodriveev 0:2dbd366be5fd 10 /***********************************************************/
protodriveev 0:2dbd366be5fd 11 /*Constants */
protodriveev 0:2dbd366be5fd 12 /***********************************************************/
protodriveev 0:2dbd366be5fd 13 #define MATLAB_INTERFACE //matlab used as an interface
protodriveev 0:2dbd366be5fd 14 //#define SERIAL_INTERFACE //Terminal used as an interface. Mainly for debugging
protodriveev 0:2dbd366be5fd 15
protodriveev 0:2dbd366be5fd 16 #define CURRENT_SENSOR_ON //turn on current sensor
protodriveev 0:2dbd366be5fd 17 //#define DEBUG
protodriveev 0:2dbd366be5fd 18 //#define LIGHTS_CURRENT_CONTROL //power flow light control is determined by the current sensor
protodriveev 0:2dbd366be5fd 19 #define LIGHTS_LOAD_CONTROL //power flow light control is determined by the voltage demand placed on the motors
protodriveev 0:2dbd366be5fd 20
protodriveev 0:2dbd366be5fd 21 /**********************Power sources options***************/
protodriveev 0:2dbd366be5fd 22 /*Instruction: There are 3 power source options for the DUT
protodriveev 0:2dbd366be5fd 23 and two for the load. Uncomment the option that you want to
protodriveev 0:2dbd366be5fd 24 use and comment options that you do not want to use. The DUT
protodriveev 0:2dbd366be5fd 25 and load should each only have one option uncommented.
protodriveev 0:2dbd366be5fd 26 */
protodriveev 0:2dbd366be5fd 27
protodriveev 0:2dbd366be5fd 28 //DUT
protodriveev 0:2dbd366be5fd 29 //1. External supply
protodriveev 0:2dbd366be5fd 30 //#define DUT_EXTERNAL_POWER_ENABLE
protodriveev 0:2dbd366be5fd 31
protodriveev 0:2dbd366be5fd 32 //2. Just DUT batt enabled
protodriveev 0:2dbd366be5fd 33 #define DUT_BATT_ENABLE
protodriveev 0:2dbd366be5fd 34
protodriveev 0:2dbd366be5fd 35 //3. DUT batt and cap enabled
protodriveev 0:2dbd366be5fd 36 //#define DUT_BATT_CAP_ENABLE
protodriveev 0:2dbd366be5fd 37
protodriveev 0:2dbd366be5fd 38 //Load
protodriveev 0:2dbd366be5fd 39 //1. External Supply
protodriveev 0:2dbd366be5fd 40 //#define LOAD_EXTERNAL_POWER_ENABLE
protodriveev 0:2dbd366be5fd 41
protodriveev 0:2dbd366be5fd 42 //2. Load batt enabled
protodriveev 0:2dbd366be5fd 43 #define LOAD_BATT_ENABLE
protodriveev 0:2dbd366be5fd 44
protodriveev 0:2dbd366be5fd 45 /***********************************************************/
protodriveev 0:2dbd366be5fd 46 /*Global Variables */
protodriveev 0:2dbd366be5fd 47 /***********************************************************/
protodriveev 0:2dbd366be5fd 48 float v_DUT_batt, v_load_batt, v_cap, speed, current;
protodriveev 0:2dbd366be5fd 49 int big_error,regen;
protodriveev 0:2dbd366be5fd 50 int foo = 1;
protodriveev 0:2dbd366be5fd 51
protodriveev 0:2dbd366be5fd 52 //motor direction and load
protodriveev 0:2dbd366be5fd 53 float DUT_input = 0; //DUT duty cycle demand variable
protodriveev 0:2dbd366be5fd 54 float load_input = 0; //Load duty cycle demand variable
protodriveev 0:2dbd366be5fd 55 float DUT_input_direc = 1; //DUT direction variable. Default to forward
protodriveev 0:2dbd366be5fd 56 float load_input_direc = 0; //Load direction variable. Default to reverse. This means it will NOT oppose the DUT
protodriveev 0:2dbd366be5fd 57
protodriveev 0:2dbd366be5fd 58 /***********************************************************/
protodriveev 0:2dbd366be5fd 59 /*Pin Setup */
protodriveev 0:2dbd366be5fd 60 /***********************************************************/
protodriveev 0:2dbd366be5fd 61 //mbed LEDS
protodriveev 0:2dbd366be5fd 62 DigitalOut big_error_led(LED1); //error LED
protodriveev 0:2dbd366be5fd 63
protodriveev 0:2dbd366be5fd 64 //Board LEDs
protodriveev 0:2dbd366be5fd 65 DigitalOut leftArrow(p29); //setting high turns on green left arrow LEDS
protodriveev 0:2dbd366be5fd 66 DigitalOut greenLine(p28); //setting high turns on green centerline LEDS
protodriveev 0:2dbd366be5fd 67 DigitalOut orangeLine(p27); //setting high turns on orange centerline LEDS
protodriveev 0:2dbd366be5fd 68 DigitalOut rightArrow(p26); //setting high turns on orange right arrow LEDS
protodriveev 0:2dbd366be5fd 69
protodriveev 0:2dbd366be5fd 70 DigitalOut load_batt_green(p25); //setting high will turn on the load batt green LED
protodriveev 0:2dbd366be5fd 71 DigitalOut load_batt_orange(p24); //setting high will turn on the load batt orange LED
protodriveev 0:2dbd366be5fd 72 DigitalOut DUT_batt_green(p10); //setting high will turn on the DUT batt green LED
protodriveev 0:2dbd366be5fd 73 DigitalOut DUT_batt_orange(p11); //setting high will turn on the DUT batt orange LED
protodriveev 0:2dbd366be5fd 74
protodriveev 0:2dbd366be5fd 75 DigitalOut cap_green(p12); //setting high will turn on the cap green LED
protodriveev 0:2dbd366be5fd 76 DigitalOut cap_orange(p13); //setting high will turn on the cap orange LED
protodriveev 0:2dbd366be5fd 77
protodriveev 0:2dbd366be5fd 78 #ifdef CURRENT_SENSOR_ON
protodriveev 0:2dbd366be5fd 79 AnalogIn current_sense(p15); //current sensor on p15
protodriveev 0:2dbd366be5fd 80 #else
protodriveev 0:2dbd366be5fd 81 DigitalOut place_holder15(p15); //sets p15 as a DigitalOut that will be set low, to reduce noise on analog in pins
protodriveev 0:2dbd366be5fd 82 #endif
protodriveev 0:2dbd366be5fd 83
protodriveev 0:2dbd366be5fd 84 //sets p15 and p18 as a DigitalOut that will be set low, to reduce noise on analog in pins
protodriveev 0:2dbd366be5fd 85 DigitalOut place_holder16(p16);
protodriveev 0:2dbd366be5fd 86 DigitalOut place_holder18(p18);
protodriveev 0:2dbd366be5fd 87
protodriveev 0:2dbd366be5fd 88 #ifdef LOAD_BATT_ENABLE
protodriveev 0:2dbd366be5fd 89 AnalogIn v_load_batt_measure(p17); //Analog in from load battery
protodriveev 0:2dbd366be5fd 90 #endif
protodriveev 0:2dbd366be5fd 91
protodriveev 0:2dbd366be5fd 92 #ifdef DUT_BATT_ENABLE
protodriveev 0:2dbd366be5fd 93 AnalogIn v_DUT_batt_measure(p20); //Analog in from drive battery
protodriveev 0:2dbd366be5fd 94 DigitalOut place_holder19(p19); //sets p19 as a DigitalOut that will be set low, to reduce noise on analog in pins
protodriveev 0:2dbd366be5fd 95 #endif
protodriveev 0:2dbd366be5fd 96
protodriveev 0:2dbd366be5fd 97 #ifdef DUT_BATT_CAP_ENABLE
protodriveev 0:2dbd366be5fd 98 AnalogIn v_DUT_batt_measure(p20); //Analog in from drive battery
protodriveev 0:2dbd366be5fd 99 AnalogIn v_cap_measure(p19); //Analog in from super cap
protodriveev 0:2dbd366be5fd 100 #endif
protodriveev 0:2dbd366be5fd 101
protodriveev 0:2dbd366be5fd 102 DigitalIn kill_switch(p9); //switch to disable running program
protodriveev 0:2dbd366be5fd 103
protodriveev 0:2dbd366be5fd 104 //matlab interface
protodriveev 0:2dbd366be5fd 105 #ifdef MATLAB_INTERFACE
protodriveev 0:2dbd366be5fd 106 //tie program variables to RPC variables used in Matlab
protodriveev 0:2dbd366be5fd 107 RPCVariable<float> RPC_DUT_input(&DUT_input, "DUT_input");
protodriveev 0:2dbd366be5fd 108 RPCVariable<float> RPC_load_input(&load_input, "load_input");
protodriveev 0:2dbd366be5fd 109 RPCVariable<float> RPC_DUT_input_direc(&DUT_input_direc, "DUT_input_direc");
protodriveev 0:2dbd366be5fd 110 RPCVariable<float> RPC_load_input_direc(&load_input_direc,"load_input_direc");
protodriveev 0:2dbd366be5fd 111 RPCVariable<float> RPC_current(&current, "current");
protodriveev 0:2dbd366be5fd 112 RPCVariable<float> RPC_speed(&speed, "speed");
protodriveev 0:2dbd366be5fd 113 RPCVariable<float> RPC_v_DUT_batt(&v_DUT_batt, "v_DUT_batt");
protodriveev 0:2dbd366be5fd 114 RPCVariable<float> RPC_v_load_batt(&v_DUT_batt, "v_load_batt");
protodriveev 0:2dbd366be5fd 115 RPCVariable<float> RPC_v_cap(&v_DUT_batt, "v_cap");
protodriveev 0:2dbd366be5fd 116 #endif
protodriveev 0:2dbd366be5fd 117
protodriveev 0:2dbd366be5fd 118 /***********************************************************/
protodriveev 0:2dbd366be5fd 119 /*Terminals */
protodriveev 0:2dbd366be5fd 120 /***********************************************************/
protodriveev 0:2dbd366be5fd 121
protodriveev 0:2dbd366be5fd 122 #ifdef MATLAB_INTERFACE
protodriveev 0:2dbd366be5fd 123 SerialRPCInterface SerialInterface(USBTX, USBRX);//establich RPC serial connection
protodriveev 0:2dbd366be5fd 124 #endif
protodriveev 0:2dbd366be5fd 125
protodriveev 0:2dbd366be5fd 126 #ifdef SERIAL_INTERFACE
protodriveev 0:2dbd366be5fd 127 Serial pc(USBTX, USBRX); //Establish serial
protodriveev 0:2dbd366be5fd 128 #endif
protodriveev 0:2dbd366be5fd 129
protodriveev 0:2dbd366be5fd 130 /***********************************************************/
protodriveev 0:2dbd366be5fd 131 /*Other Includes */
protodriveev 0:2dbd366be5fd 132 /***********************************************************/
protodriveev 0:2dbd366be5fd 133
protodriveev 0:2dbd366be5fd 134 #include "power_sources.h"
protodriveev 0:2dbd366be5fd 135 #include "measurement.h"
protodriveev 0:2dbd366be5fd 136 #include "motor_control.h"
protodriveev 0:2dbd366be5fd 137
protodriveev 0:2dbd366be5fd 138 /***********************************************************/
protodriveev 0:2dbd366be5fd 139 /*Subroutines */
protodriveev 0:2dbd366be5fd 140 /***********************************************************/
protodriveev 0:2dbd366be5fd 141
protodriveev 0:2dbd366be5fd 142 //LED control
protodriveev 0:2dbd366be5fd 143 void all_LEDS_flash() { //a demo program that just switches LEDs between green and orange
protodriveev 0:2dbd366be5fd 144 if (foo == 0) {
protodriveev 0:2dbd366be5fd 145 leftArrow = 0;
protodriveev 0:2dbd366be5fd 146 greenLine = 0;
protodriveev 0:2dbd366be5fd 147 orangeLine = 1;
protodriveev 0:2dbd366be5fd 148 rightArrow = 1;
protodriveev 0:2dbd366be5fd 149 load_batt_green = 0;
protodriveev 0:2dbd366be5fd 150 load_batt_orange = 1;
protodriveev 0:2dbd366be5fd 151 DUT_batt_green = 0;
protodriveev 0:2dbd366be5fd 152 DUT_batt_orange = 1;
protodriveev 0:2dbd366be5fd 153 cap_green = 0;
protodriveev 0:2dbd366be5fd 154 cap_orange = 1;
protodriveev 0:2dbd366be5fd 155 foo = 1;
protodriveev 0:2dbd366be5fd 156 } else {
protodriveev 0:2dbd366be5fd 157 leftArrow = 1;
protodriveev 0:2dbd366be5fd 158 greenLine = 1;
protodriveev 0:2dbd366be5fd 159 orangeLine = 0;
protodriveev 0:2dbd366be5fd 160 rightArrow = 0;
protodriveev 0:2dbd366be5fd 161 load_batt_green = 1;
protodriveev 0:2dbd366be5fd 162 load_batt_orange = 0;
protodriveev 0:2dbd366be5fd 163 DUT_batt_green = 1;
protodriveev 0:2dbd366be5fd 164 DUT_batt_orange = 0;
protodriveev 0:2dbd366be5fd 165 cap_green = 1;
protodriveev 0:2dbd366be5fd 166 cap_orange = 0;
protodriveev 0:2dbd366be5fd 167 foo = 0;
protodriveev 0:2dbd366be5fd 168 }
protodriveev 0:2dbd366be5fd 169 }
protodriveev 0:2dbd366be5fd 170
protodriveev 0:2dbd366be5fd 171 //turn all LEDs off
protodriveev 0:2dbd366be5fd 172 void all_LEDS_off() {
protodriveev 0:2dbd366be5fd 173 load_batt_green = 1;
protodriveev 0:2dbd366be5fd 174 load_batt_orange = 1;
protodriveev 0:2dbd366be5fd 175 leftArrow = 1;
protodriveev 0:2dbd366be5fd 176 greenLine = 1;
protodriveev 0:2dbd366be5fd 177 orangeLine = 1;
protodriveev 0:2dbd366be5fd 178 rightArrow = 1;
protodriveev 0:2dbd366be5fd 179 DUT_batt_green = 1;
protodriveev 0:2dbd366be5fd 180 DUT_batt_orange = 1;
protodriveev 0:2dbd366be5fd 181 cap_green = 1;
protodriveev 0:2dbd366be5fd 182 cap_orange = 1;
protodriveev 0:2dbd366be5fd 183 }
protodriveev 0:2dbd366be5fd 184
protodriveev 0:2dbd366be5fd 185 //turns on the green LEDs indicating regen
protodriveev 0:2dbd366be5fd 186 void regen_LEDS() {
protodriveev 0:2dbd366be5fd 187 load_batt_green = 1;
protodriveev 0:2dbd366be5fd 188 load_batt_orange = 0;
protodriveev 0:2dbd366be5fd 189 leftArrow = 0;
protodriveev 0:2dbd366be5fd 190 greenLine = 0;
protodriveev 0:2dbd366be5fd 191 orangeLine = 1;
protodriveev 0:2dbd366be5fd 192 rightArrow = 1;
protodriveev 0:2dbd366be5fd 193 if (!relay) {
protodriveev 0:2dbd366be5fd 194 DUT_batt_green = 0;
protodriveev 0:2dbd366be5fd 195 DUT_batt_orange = 1;
protodriveev 0:2dbd366be5fd 196 cap_green = 1;
protodriveev 0:2dbd366be5fd 197 cap_orange = 1;
protodriveev 0:2dbd366be5fd 198 } else {
protodriveev 0:2dbd366be5fd 199 DUT_batt_green = 1;
protodriveev 0:2dbd366be5fd 200 DUT_batt_orange = 1;
protodriveev 0:2dbd366be5fd 201 cap_green = 0;
protodriveev 0:2dbd366be5fd 202 cap_orange = 1;
protodriveev 0:2dbd366be5fd 203 }
protodriveev 0:2dbd366be5fd 204 }
protodriveev 0:2dbd366be5fd 205
protodriveev 0:2dbd366be5fd 206 //turns on the orange LEDs indicating drive mode (power flowing out of the vehicle)
protodriveev 0:2dbd366be5fd 207 void drive_LEDS() {
protodriveev 0:2dbd366be5fd 208 load_batt_green = 0;
protodriveev 0:2dbd366be5fd 209 load_batt_orange = 1;
protodriveev 0:2dbd366be5fd 210 leftArrow = 1;
protodriveev 0:2dbd366be5fd 211 greenLine = 1;
protodriveev 0:2dbd366be5fd 212 orangeLine = 0;
protodriveev 0:2dbd366be5fd 213 rightArrow = 0;
protodriveev 0:2dbd366be5fd 214 if (!relay) {
protodriveev 0:2dbd366be5fd 215 DUT_batt_green = 1;
protodriveev 0:2dbd366be5fd 216 DUT_batt_orange = 0;
protodriveev 0:2dbd366be5fd 217 cap_green = 1;
protodriveev 0:2dbd366be5fd 218 cap_orange = 1;
protodriveev 0:2dbd366be5fd 219 } else {
protodriveev 0:2dbd366be5fd 220 DUT_batt_green = 1;
protodriveev 0:2dbd366be5fd 221 DUT_batt_orange = 1;
protodriveev 0:2dbd366be5fd 222 cap_green = 1;
protodriveev 0:2dbd366be5fd 223 cap_orange = 0;
protodriveev 0:2dbd366be5fd 224 }
protodriveev 0:2dbd366be5fd 225 }
protodriveev 0:2dbd366be5fd 226 /***********************************************************/
protodriveev 0:2dbd366be5fd 227 /*Main program setup */
protodriveev 0:2dbd366be5fd 228 /***********************************************************/
protodriveev 0:2dbd366be5fd 229
protodriveev 0:2dbd366be5fd 230 int main() {
protodriveev 0:2dbd366be5fd 231
protodriveev 0:2dbd366be5fd 232 Timer timer; //create a timer for the main loop
protodriveev 0:2dbd366be5fd 233 init_pwm(); //initialize PWM
protodriveev 0:2dbd366be5fd 234
protodriveev 0:2dbd366be5fd 235 /***********************************************************/
protodriveev 0:2dbd366be5fd 236 /*Main Loop */
protodriveev 0:2dbd366be5fd 237 /***********************************************************/
protodriveev 0:2dbd366be5fd 238 while (1) {
protodriveev 0:2dbd366be5fd 239 while (kill_switch ==0) {//run demo while waiting for kill switch to be turned on
protodriveev 0:2dbd366be5fd 240 all_LEDS_flash(); //switch LEDs between green and orange
protodriveev 0:2dbd366be5fd 241 wait(.5); //wait 0.5s
protodriveev 0:2dbd366be5fd 242 }
protodriveev 0:2dbd366be5fd 243
protodriveev 0:2dbd366be5fd 244 // System initializations
protodriveev 0:2dbd366be5fd 245 DUT_direction.write(1); //set forward
protodriveev 0:2dbd366be5fd 246 load_direction.write(0); //set reverse. This ensures both motors will apply a torque on the coupler in the same direction
protodriveev 0:2dbd366be5fd 247
protodriveev 0:2dbd366be5fd 248 //initialize system variables to 0
protodriveev 0:2dbd366be5fd 249 speed = 0;
protodriveev 0:2dbd366be5fd 250 current = 0;
protodriveev 0:2dbd366be5fd 251 big_error = 0;
protodriveev 0:2dbd366be5fd 252 big_error_led = 0;
protodriveev 0:2dbd366be5fd 253 relay = 0; //turn on battery by default
protodriveev 0:2dbd366be5fd 254
protodriveev 0:2dbd366be5fd 255 //main loop timer variables
protodriveev 0:2dbd366be5fd 256 int slow_timer = 0;
protodriveev 0:2dbd366be5fd 257 int fast_timer = 0;
protodriveev 0:2dbd366be5fd 258
protodriveev 0:2dbd366be5fd 259 timer.start(); //start loop timer
protodriveev 0:2dbd366be5fd 260 all_LEDS_off(); //turn off LEDs
protodriveev 0:2dbd366be5fd 261 wait(.5); //wait 0.5s before starting
protodriveev 0:2dbd366be5fd 262
protodriveev 0:2dbd366be5fd 263 #ifdef DEBUG //debugging code
protodriveev 0:2dbd366be5fd 264 DUT_input = 0.75;
protodriveev 0:2dbd366be5fd 265 load_input = 0.25;
protodriveev 0:2dbd366be5fd 266 #endif
protodriveev 0:2dbd366be5fd 267
protodriveev 0:2dbd366be5fd 268 #ifdef DUT_BATT_ENABLE
protodriveev 0:2dbd366be5fd 269 place_holder19 = 0; //set DigitalOut pin low to reduce noise on adjacent AnalogIn pins
protodriveev 0:2dbd366be5fd 270 #endif
protodriveev 0:2dbd366be5fd 271
protodriveev 0:2dbd366be5fd 272 //set unused Analog pins to ground
protodriveev 0:2dbd366be5fd 273 #ifndef CURRENT_SENSOR_ON
protodriveev 0:2dbd366be5fd 274 place_holder15 = 0; //set DigitalOut pin low to reduce noise on adjacent AnalogIn pins
protodriveev 0:2dbd366be5fd 275 #endif
protodriveev 0:2dbd366be5fd 276 place_holder16 = 0; //set DigitalOut pin low to reduce noise on adjacent AnalogIn pins
protodriveev 0:2dbd366be5fd 277 place_holder18 = 0; //set DigitalOut pin low to reduce noise on adjacent AnalogIn pins
protodriveev 0:2dbd366be5fd 278
protodriveev 0:2dbd366be5fd 279 while (kill_switch == 1 && big_error == 0) {//while the kill switch is on and there are no errors
protodriveev 0:2dbd366be5fd 280
protodriveev 0:2dbd366be5fd 281 // --- SLOW LOOP (1) Hz ---
protodriveev 0:2dbd366be5fd 282 if (timer.read_ms() - slow_timer >= 1000) {
protodriveev 0:2dbd366be5fd 283 slow_timer = timer.read_ms(); //read timer value in miliseconds
protodriveev 0:2dbd366be5fd 284 big_error = checkBattVoltages(); //check batt voltages to ensure they are in the correct voltage range
protodriveev 0:2dbd366be5fd 285 if (big_error == 1) {
protodriveev 0:2dbd366be5fd 286 big_error_led = 1;
protodriveev 0:2dbd366be5fd 287 }
protodriveev 0:2dbd366be5fd 288 //measure voltages
protodriveev 0:2dbd366be5fd 289 #ifdef LOAD_BATT_ENABLE
protodriveev 0:2dbd366be5fd 290 v_load_batt = get_voltage(v_load_batt_measure); //measure load batt voltage
protodriveev 0:2dbd366be5fd 291 #ifdef SERIAL_INTERFACE
protodriveev 0:2dbd366be5fd 292 pc.printf("Analog In (p17): %f ", v_load_batt); //print load voltage to terminal
protodriveev 0:2dbd366be5fd 293 #endif
protodriveev 0:2dbd366be5fd 294 #endif
protodriveev 0:2dbd366be5fd 295
protodriveev 0:2dbd366be5fd 296 #ifdef DUT_BATT_ENABLE
protodriveev 0:2dbd366be5fd 297 v_DUT_batt =get_voltage(v_DUT_batt_measure); //measure DUT batt voltage
protodriveev 0:2dbd366be5fd 298 #ifdef SERIAL_INTERFACE
protodriveev 0:2dbd366be5fd 299 pc.printf("Analog In (p20): %f ", v_DUT_batt); //print load voltage to terminal
protodriveev 0:2dbd366be5fd 300 #endif
protodriveev 0:2dbd366be5fd 301 #endif
protodriveev 0:2dbd366be5fd 302
protodriveev 0:2dbd366be5fd 303
protodriveev 0:2dbd366be5fd 304 #ifdef DUT_BATT_CAP_ENABLE
protodriveev 0:2dbd366be5fd 305 v_cap = get_voltage(v_cap_measure); //measure cap voltage
protodriveev 0:2dbd366be5fd 306 v_DUT_batt =get_voltage(v_DUT_batt_measure); //measure DUT batt voltage
protodriveev 0:2dbd366be5fd 307 #ifdef SERIAL_INTERFACE
protodriveev 0:2dbd366be5fd 308 pc.printf("Analog In (p19): %f Analog In (p20): %f Speed: %f Current: %f\r\n", v_cap, v_DUT_batt, speed, current); //print cap voltage, DUT batt voltage, speed, current to terminal
protodriveev 0:2dbd366be5fd 309 #endif
protodriveev 0:2dbd366be5fd 310 #endif
protodriveev 0:2dbd366be5fd 311 }
protodriveev 0:2dbd366be5fd 312
protodriveev 0:2dbd366be5fd 313 // --- FAST LOOP (100 Hz) ---
protodriveev 0:2dbd366be5fd 314 if (timer.read_ms() - fast_timer >= 10) {
protodriveev 0:2dbd366be5fd 315 fast_timer = timer.read_ms(); //read time in ms
protodriveev 0:2dbd366be5fd 316 set_duty(DUT_input,load_input); //set the duty cycle
protodriveev 0:2dbd366be5fd 317 get_speed(); //update motor speed
protodriveev 0:2dbd366be5fd 318
protodriveev 0:2dbd366be5fd 319 #ifdef CURRENT_SENSOR_ON
protodriveev 0:2dbd366be5fd 320 get_current(); //update current
protodriveev 0:2dbd366be5fd 321 #endif
protodriveev 0:2dbd366be5fd 322
protodriveev 0:2dbd366be5fd 323 #ifdef LIGHTS_LOAD_CONTROL //controls the board LEDs based on the value of the DUT and Load motor duty cycle
protodriveev 0:2dbd366be5fd 324 //turn on green LEDs if in regen mode, and orange LEDs if in drive mode.
protodriveev 0:2dbd366be5fd 325 if (DUT_input >= load_input && (DUT_input != 0 || load_input != 0)) {//check if not in regen mode
protodriveev 0:2dbd366be5fd 326 regen = 0; //set regen flag low
protodriveev 0:2dbd366be5fd 327 drive_LEDS(); //turn on orange LEDs
protodriveev 0:2dbd366be5fd 328 } else if (DUT_input < load_input && (DUT_input != 0 || load_input != 0)) {//check if in regen mode
protodriveev 0:2dbd366be5fd 329 regen = 1; //set regen flag high
protodriveev 0:2dbd366be5fd 330 regen_LEDS(); //turn on green LEDs
protodriveev 0:2dbd366be5fd 331 } else {// DUT is niether flowing into or out of DUT
protodriveev 0:2dbd366be5fd 332 regen = 0; //set regen flag low
protodriveev 0:2dbd366be5fd 333 all_LEDS_off();// LEDs off
protodriveev 0:2dbd366be5fd 334 }
protodriveev 0:2dbd366be5fd 335 #endif
protodriveev 0:2dbd366be5fd 336
protodriveev 0:2dbd366be5fd 337 #ifdef LIGHTS_CURRENT_CONTROL //controls the board LEDs based on the value of the DUT and Load motor currents
protodriveev 0:2dbd366be5fd 338 //turn on green LEDs if in regen mode, and orange LEDs if in drive mode.
protodriveev 0:2dbd366be5fd 339 if (current > 0) {
protodriveev 0:2dbd366be5fd 340 regen = 0; //set regen flag low
protodriveev 0:2dbd366be5fd 341 drive_LEDS(); //turn on orange LEDs
protodriveev 0:2dbd366be5fd 342 } else if (current < 0) {
protodriveev 0:2dbd366be5fd 343 regen = 1; //set regen flag high
protodriveev 0:2dbd366be5fd 344 regen_LEDS(); //turn on green LEDs
protodriveev 0:2dbd366be5fd 345 } else {
protodriveev 0:2dbd366be5fd 346 regen = 0; //set regen flag low
protodriveev 0:2dbd366be5fd 347 all_LEDS_off(); // LEDs off
protodriveev 0:2dbd366be5fd 348 }
protodriveev 0:2dbd366be5fd 349 #endif
protodriveev 0:2dbd366be5fd 350
protodriveev 0:2dbd366be5fd 351 #ifdef DUT_BATT_CAP_ENABLE
protodriveev 0:2dbd366be5fd 352 superCapControl();
protodriveev 0:2dbd366be5fd 353 #endif
protodriveev 0:2dbd366be5fd 354 }
protodriveev 0:2dbd366be5fd 355
protodriveev 0:2dbd366be5fd 356 // reset timer if 1000 seconds have elapsed
protodriveev 0:2dbd366be5fd 357 if (timer.read() >= 1000) {
protodriveev 0:2dbd366be5fd 358 timer.reset();
protodriveev 0:2dbd366be5fd 359 slow_timer = 0;
protodriveev 0:2dbd366be5fd 360 fast_timer = 0;
protodriveev 0:2dbd366be5fd 361 }
protodriveev 0:2dbd366be5fd 362 }
protodriveev 0:2dbd366be5fd 363 //turn off motors
protodriveev 0:2dbd366be5fd 364 load_motor =0;
protodriveev 0:2dbd366be5fd 365 DUT_motor = 0;
protodriveev 0:2dbd366be5fd 366 timer.stop();
protodriveev 0:2dbd366be5fd 367 timer.reset();
protodriveev 0:2dbd366be5fd 368 }
protodriveev 0:2dbd366be5fd 369
protodriveev 0:2dbd366be5fd 370 }