Code for the COVR project DROPSAW project test rig (previously used for the Heros testing).
Dependencies: SPTE_10Bar_5V mbed AS5048 SDFileSystem MODSERIAL LCM101_DROPSAW LinearActuator
main.cpp@11:fc82dd22a527, 2020-08-12 (annotated)
- Committer:
- surajgiri
- Date:
- Wed Aug 12 12:05:58 2020 +0000
- Revision:
- 11:fc82dd22a527
- Parent:
- 10:77fcbad99a31
- Child:
- 13:219c16e7d32c
with benchmark v1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
cnckiwi31 | 5:63063a9fa51c | 1 | /** |
cnckiwi31 | 5:63063a9fa51c | 2 | * Author: Allan Veale |
cnckiwi31 | 5:63063a9fa51c | 3 | * Date: 27/11/19 |
cnckiwi31 | 5:63063a9fa51c | 4 | * Purpose: Datalog from the active wearable test rig fitted with the first |
cnckiwi31 | 5:63063a9fa51c | 5 | * realistic (foam tissue) leg |
cnckiwi31 | 5:63063a9fa51c | 6 | */ |
megrootens | 0:3855d4588f76 | 7 | |
cnckiwi31 | 5:63063a9fa51c | 8 | //Both the general mbed header and the test rig bench header are needed |
cnckiwi31 | 5:63063a9fa51c | 9 | #include "mbed.h" |
cnckiwi31 | 5:63063a9fa51c | 10 | #include "bench.h" |
cnckiwi31 | 10:77fcbad99a31 | 11 | |
cnckiwi31 | 5:63063a9fa51c | 12 | //Example experiment method |
surajgiri | 11:fc82dd22a527 | 13 | void runFatigueExperiment0(int cycles, float targetkPa, float inflateTimeOut,float deflateTimeOut); |
surajgiri | 11:fc82dd22a527 | 14 | void runFailureExp0(float targetkPa); |
surajgiri | 11:fc82dd22a527 | 15 | void runBenchmarkExperiment0(); |
surajgiri | 11:fc82dd22a527 | 16 | void runBenchmarkExperiment1(int pwm, int cycles, int logHz); |
megrootens | 0:3855d4588f76 | 17 | |
cnckiwi31 | 10:77fcbad99a31 | 18 | //Methods for testing DAC chip - leave for now |
cnckiwi31 | 10:77fcbad99a31 | 19 | void selectDACB(); |
cnckiwi31 | 10:77fcbad99a31 | 20 | void deselectDACB(); |
cnckiwi31 | 10:77fcbad99a31 | 21 | |
cnckiwi31 | 10:77fcbad99a31 | 22 | void testDAC(); |
cnckiwi31 | 10:77fcbad99a31 | 23 | void testToggleChannel(); |
cnckiwi31 | 10:77fcbad99a31 | 24 | |
cnckiwi31 | 10:77fcbad99a31 | 25 | DigitalOut myled(LED1); |
surajgiri | 11:fc82dd22a527 | 26 | DigitalOut CSA(DAC_CSA); |
cnckiwi31 | 10:77fcbad99a31 | 27 | DigitalOut CSB(DAC_CSB); |
cnckiwi31 | 10:77fcbad99a31 | 28 | SPI spi(DAC_MOSI,DAC_MISO,DAC_SCLK); |
cnckiwi31 | 10:77fcbad99a31 | 29 | |
cnckiwi31 | 5:63063a9fa51c | 30 | // Create bench object - this is used to control the test rig |
cnckiwi31 | 5:63063a9fa51c | 31 | Bench leg; |
megrootens | 0:3855d4588f76 | 32 | |
megrootens | 0:3855d4588f76 | 33 | /** |
cnckiwi31 | 5:63063a9fa51c | 34 | * Main loop |
megrootens | 0:3855d4588f76 | 35 | */ |
megrootens | 0:3855d4588f76 | 36 | int main() |
cnckiwi31 | 5:63063a9fa51c | 37 | { |
surajgiri | 11:fc82dd22a527 | 38 | leg.setLoggingFrequency(10); //Set datalogging frequency |
cnckiwi31 | 5:63063a9fa51c | 39 | |
cnckiwi31 | 5:63063a9fa51c | 40 | /* Two extra columns of data will be recorded in this experiment. |
cnckiwi31 | 5:63063a9fa51c | 41 | One for the target pressure, and the other for the number of sit and |
cnckiwi31 | 5:63063a9fa51c | 42 | stand cycles currently completed in the experiment */ |
surajgiri | 11:fc82dd22a527 | 43 | string colNames[] = {"Target pressure (kPa)","Cycle",}; //add data headings |
cnckiwi31 | 5:63063a9fa51c | 44 | leg.setExtraColumns(colNames,2); |
megrootens | 0:3855d4588f76 | 45 | |
surajgiri | 11:fc82dd22a527 | 46 | float targetP = 350; 0; //Target pressure in kPa |
surajgiri | 11:fc82dd22a527 | 47 | int expCycles = 100; //Number of sit to stand to sit cycles |
cnckiwi31 | 5:63063a9fa51c | 48 | float vals[] = {targetP,0}; //set initial values of data that will be logged |
cnckiwi31 | 5:63063a9fa51c | 49 | leg.setExtraData(vals); |
cnckiwi31 | 4:1cdce6c6c94e | 50 | |
cnckiwi31 | 5:63063a9fa51c | 51 | /* Setup all peripherals on rig, display info about SD card and the |
cnckiwi31 | 5:63063a9fa51c | 52 | user interface menu */ |
cnckiwi31 | 10:77fcbad99a31 | 53 | leg.initialise(); //this gives the 10MHz, normal clock polarity, mode 1 spi we need, pins are same as for encoder |
cnckiwi31 | 10:77fcbad99a31 | 54 | |
megrootens | 0:3855d4588f76 | 55 | |
cnckiwi31 | 5:63063a9fa51c | 56 | |
cnckiwi31 | 5:63063a9fa51c | 57 | /*Run an experiment when the button is pressed to start datalogging and |
cnckiwi31 | 5:63063a9fa51c | 58 | stop it if the button is pressed again to stop datalogging |
cnckiwi31 | 5:63063a9fa51c | 59 | (or when experiment stops - then datalogging stops by itself) */ |
cnckiwi31 | 5:63063a9fa51c | 60 | while (true) { |
cnckiwi31 | 5:63063a9fa51c | 61 | if (leg.isLogging()) { |
surajgiri | 11:fc82dd22a527 | 62 | leg.pc.printf("Logging started"); |
surajgiri | 11:fc82dd22a527 | 63 | //runFatigueExperiment0(expCycles,targetP,10,10); |
surajgiri | 11:fc82dd22a527 | 64 | //runBenchmarkExperiment0(); |
surajgiri | 11:fc82dd22a527 | 65 | runBenchmarkExperiment1(75, 1, 10); |
surajgiri | 11:fc82dd22a527 | 66 | //runFailureExp0(targetP); |
cnckiwi31 | 5:63063a9fa51c | 67 | } |
surajgiri | 11:fc82dd22a527 | 68 | wait(0.5); |
megrootens | 0:3855d4588f76 | 69 | } |
megrootens | 0:3855d4588f76 | 70 | } |
megrootens | 0:3855d4588f76 | 71 | |
cnckiwi31 | 5:63063a9fa51c | 72 | /** |
cnckiwi31 | 5:63063a9fa51c | 73 | * Shows how a demo experiment works. This experiment pressurises the leg to |
cnckiwi31 | 5:63063a9fa51c | 74 | * pressure targetkPa, depressurises it, and then repeats the process cycles |
cnckiwi31 | 5:63063a9fa51c | 75 | * number of times |
cnckiwi31 | 5:63063a9fa51c | 76 | * @param cycles: the number of cycles the leg goes up and down |
cnckiwi31 | 5:63063a9fa51c | 77 | * @param targetkPa: the pressure at which the valve is opened to let the leg go down |
cnckiwi31 | 5:63063a9fa51c | 78 | */ |
surajgiri | 11:fc82dd22a527 | 79 | void runFatigueExperiment0(int cycles, float targetkPa, float inflateTimeOut, float deflateTimeOut) |
megrootens | 0:3855d4588f76 | 80 | { |
surajgiri | 11:fc82dd22a527 | 81 | //leg.pc.printf("\r\nEntered experiment"); |
cnckiwi31 | 5:63063a9fa51c | 82 | //The experiment starts when logging does |
surajgiri | 11:fc82dd22a527 | 83 | Timer flowT;//used to time flow into and out of actuator |
surajgiri | 11:fc82dd22a527 | 84 | float loopTime = 0.1; //(s) time between checking pressure |
surajgiri | 11:fc82dd22a527 | 85 | int num_file = 10; //number of data files to save |
cnckiwi31 | 5:63063a9fa51c | 86 | |
surajgiri | 11:fc82dd22a527 | 87 | for (int i=0; i<num_file; i++) { |
surajgiri | 11:fc82dd22a527 | 88 | |
surajgiri | 11:fc82dd22a527 | 89 | leg.StartLogging(); |
cnckiwi31 | 5:63063a9fa51c | 90 | //Stop the Bench class from printing, so this method can print |
cnckiwi31 | 5:63063a9fa51c | 91 | leg.pausePrint(); |
cnckiwi31 | 5:63063a9fa51c | 92 | |
surajgiri | 11:fc82dd22a527 | 93 | // Pressurise and depressurise the leg cycles number of times |
cnckiwi31 | 5:63063a9fa51c | 94 | for (int i=0; i<cycles; i++) { |
cnckiwi31 | 5:63063a9fa51c | 95 | leg.pc.printf("\r\nCycle: \t%i out of \t%i",i+1,cycles); |
cnckiwi31 | 5:63063a9fa51c | 96 | |
cnckiwi31 | 5:63063a9fa51c | 97 | //Update cycles logged |
cnckiwi31 | 5:63063a9fa51c | 98 | float data[] = {targetkPa,i+1}; |
cnckiwi31 | 5:63063a9fa51c | 99 | leg.setExtraData(data); |
cnckiwi31 | 5:63063a9fa51c | 100 | |
cnckiwi31 | 5:63063a9fa51c | 101 | //Pressurise |
cnckiwi31 | 5:63063a9fa51c | 102 | leg.setValve(true); |
surajgiri | 11:fc82dd22a527 | 103 | flowT.reset(); |
surajgiri | 11:fc82dd22a527 | 104 | flowT.start();// start inflation timer |
surajgiri | 11:fc82dd22a527 | 105 | |
cnckiwi31 | 5:63063a9fa51c | 106 | //Wait until measured pressure reaches target pressure |
surajgiri | 11:fc82dd22a527 | 107 | |
surajgiri | 11:fc82dd22a527 | 108 | while(leg.getPressure0()*100 < targetkPa && flowT.read() < inflateTimeOut) { |
surajgiri | 11:fc82dd22a527 | 109 | |
cnckiwi31 | 5:63063a9fa51c | 110 | //Keep checking logging is going |
surajgiri | 11:fc82dd22a527 | 111 | //experimentRunning = leg.isLogging(); |
surajgiri | 11:fc82dd22a527 | 112 | //leg.pc.printf("\r\nPressure (kPa): \t%7.2f",leg.getPressure0()*100); |
surajgiri | 11:fc82dd22a527 | 113 | if (!leg.isLogging()) { |
surajgiri | 11:fc82dd22a527 | 114 | leg.pc.printf("\r\nExit A"); |
surajgiri | 11:fc82dd22a527 | 115 | //Logging stopped |
surajgiri | 11:fc82dd22a527 | 116 | //leg.pc.printf("\r\nPressurising exit"); |
cnckiwi31 | 5:63063a9fa51c | 117 | leg.setValve(false); //Depressurise |
surajgiri | 11:fc82dd22a527 | 118 | leg.StopLogging(); //Stop logging data |
cnckiwi31 | 5:63063a9fa51c | 119 | leg.resumePrint(); //Let the Bench class print |
cnckiwi31 | 5:63063a9fa51c | 120 | return; |
cnckiwi31 | 5:63063a9fa51c | 121 | } |
surajgiri | 11:fc82dd22a527 | 122 | |
surajgiri | 11:fc82dd22a527 | 123 | leg.LogData(); |
surajgiri | 11:fc82dd22a527 | 124 | wait(loopTime);//Wait a bit |
surajgiri | 11:fc82dd22a527 | 125 | } |
surajgiri | 11:fc82dd22a527 | 126 | |
surajgiri | 11:fc82dd22a527 | 127 | leg.pc.printf("\r\nTimer inflate: \t%7.2f",flowT.read()); |
surajgiri | 11:fc82dd22a527 | 128 | if(flowT.read() >= inflateTimeOut) { |
surajgiri | 11:fc82dd22a527 | 129 | leg.pc.printf("\r\nExit B"); |
surajgiri | 11:fc82dd22a527 | 130 | //Logging stopped |
surajgiri | 11:fc82dd22a527 | 131 | leg.setValve(false); //Depressurise |
surajgiri | 11:fc82dd22a527 | 132 | leg.StopLogging(); //Stop logging data |
surajgiri | 11:fc82dd22a527 | 133 | leg.resumePrint(); //Let the Bench class print |
surajgiri | 11:fc82dd22a527 | 134 | return; |
surajgiri | 11:fc82dd22a527 | 135 | } |
surajgiri | 11:fc82dd22a527 | 136 | |
surajgiri | 11:fc82dd22a527 | 137 | //Depressurise |
surajgiri | 11:fc82dd22a527 | 138 | leg.pausePrint(); |
surajgiri | 11:fc82dd22a527 | 139 | leg.setValve(false); |
surajgiri | 11:fc82dd22a527 | 140 | flowT.reset(); |
surajgiri | 11:fc82dd22a527 | 141 | |
surajgiri | 11:fc82dd22a527 | 142 | /*Wait until depressurised (completely depressurised is |
surajgiri | 11:fc82dd22a527 | 143 | around 10-12 kPa due to current sensor calibration)*/ |
surajgiri | 11:fc82dd22a527 | 144 | while(leg.getPressure0()*100 > 15 && flowT.read() < deflateTimeOut) { |
surajgiri | 11:fc82dd22a527 | 145 | //leg.pc.printf("\r\nDepressurising"); |
surajgiri | 11:fc82dd22a527 | 146 | //Keep checking logging is going |
surajgiri | 11:fc82dd22a527 | 147 | //experimentRunning = leg.isLogging(); |
surajgiri | 11:fc82dd22a527 | 148 | //leg.pc.printf("\r\nPressure (kPa): \t%7.2f",leg.getPressure0()*100); |
surajgiri | 11:fc82dd22a527 | 149 | if (!leg.isLogging()) { |
surajgiri | 11:fc82dd22a527 | 150 | leg.pc.printf("\r\nExit C"); |
surajgiri | 11:fc82dd22a527 | 151 | //Logging stopped |
surajgiri | 11:fc82dd22a527 | 152 | leg.setValve(false); //Depressurise |
surajgiri | 11:fc82dd22a527 | 153 | leg.StopLogging(); //Stop logging data |
surajgiri | 11:fc82dd22a527 | 154 | leg.resumePrint(); //Let the Bench class print |
surajgiri | 11:fc82dd22a527 | 155 | return; |
cnckiwi31 | 5:63063a9fa51c | 156 | } |
megrootens | 0:3855d4588f76 | 157 | |
surajgiri | 11:fc82dd22a527 | 158 | leg.LogData(); |
surajgiri | 11:fc82dd22a527 | 159 | wait(loopTime);//Wait a bit |
surajgiri | 11:fc82dd22a527 | 160 | } |
megrootens | 0:3855d4588f76 | 161 | |
surajgiri | 11:fc82dd22a527 | 162 | leg.pc.printf("\r\nTimer deflate: \t%7.2f",flowT.read()); |
surajgiri | 11:fc82dd22a527 | 163 | if(flowT.read() >= deflateTimeOut) { |
surajgiri | 11:fc82dd22a527 | 164 | leg.pc.printf("\r\nExit D"); |
surajgiri | 11:fc82dd22a527 | 165 | //Logging stopped |
surajgiri | 11:fc82dd22a527 | 166 | leg.setValve(false); //Depressurise |
surajgiri | 11:fc82dd22a527 | 167 | leg.StopLogging(); //Stop logging data |
surajgiri | 11:fc82dd22a527 | 168 | leg.resumePrint(); //Let the Bench class print |
surajgiri | 11:fc82dd22a527 | 169 | return; |
megrootens | 0:3855d4588f76 | 170 | } |
surajgiri | 11:fc82dd22a527 | 171 | } |
surajgiri | 11:fc82dd22a527 | 172 | |
surajgiri | 11:fc82dd22a527 | 173 | // Logging stopped as experiment is fully completed |
surajgiri | 11:fc82dd22a527 | 174 | leg.pc.printf("\r\nExit D"); |
surajgiri | 11:fc82dd22a527 | 175 | leg.setValve(false); //Depressurise |
surajgiri | 11:fc82dd22a527 | 176 | leg.StopLogging(); //Stop logging data |
surajgiri | 11:fc82dd22a527 | 177 | leg.resumePrint(); //Let the Bench class print |
megrootens | 0:3855d4588f76 | 178 | } |
megrootens | 0:3855d4588f76 | 179 | } |
megrootens | 0:3855d4588f76 | 180 | |
surajgiri | 11:fc82dd22a527 | 181 | |
surajgiri | 11:fc82dd22a527 | 182 | void runBenchmarkExperiment0() |
surajgiri | 11:fc82dd22a527 | 183 | { |
surajgiri | 11:fc82dd22a527 | 184 | //Pressurise |
surajgiri | 11:fc82dd22a527 | 185 | leg.StartLogging(); |
surajgiri | 11:fc82dd22a527 | 186 | while(leg.isLogging()) { |
surajgiri | 11:fc82dd22a527 | 187 | leg.setValve(true); |
surajgiri | 11:fc82dd22a527 | 188 | leg.pc.printf("\r\nPressure (kPa): \t%7.2f",leg.getPressure0()*100); |
surajgiri | 11:fc82dd22a527 | 189 | leg.LogData(); |
surajgiri | 11:fc82dd22a527 | 190 | wait(0.1); |
surajgiri | 11:fc82dd22a527 | 191 | } |
surajgiri | 11:fc82dd22a527 | 192 | //Depressurise |
surajgiri | 11:fc82dd22a527 | 193 | leg.pc.printf("\r\nExit Benchmarking Test"); |
surajgiri | 11:fc82dd22a527 | 194 | leg.setValve(false); |
surajgiri | 11:fc82dd22a527 | 195 | leg.StopLogging(); //Stop logging data |
surajgiri | 11:fc82dd22a527 | 196 | leg.resumePrint(); //Let the Bench class print |
surajgiri | 11:fc82dd22a527 | 197 | } |
surajgiri | 11:fc82dd22a527 | 198 | |
surajgiri | 11:fc82dd22a527 | 199 | /** |
surajgiri | 11:fc82dd22a527 | 200 | * A performance test with the linear actuator |
surajgiri | 11:fc82dd22a527 | 201 | * @param pwm: actuator speed |
surajgiri | 11:fc82dd22a527 | 202 | * @param cycles: the number of up and down cycles of the leg |
surajgiri | 11:fc82dd22a527 | 203 | * @param logHz: datalogging frequency |
surajgiri | 11:fc82dd22a527 | 204 | */ |
surajgiri | 11:fc82dd22a527 | 205 | void runBenchmarkExperiment1(int pwm, int cycles, int logHz) |
surajgiri | 11:fc82dd22a527 | 206 | { |
surajgiri | 11:fc82dd22a527 | 207 | int minForce = 5; //N force at which cycle goes from extension to flexion |
surajgiri | 11:fc82dd22a527 | 208 | int maxAngle = 70; //deg angle at which cycle goes from flexion to extension |
surajgiri | 11:fc82dd22a527 | 209 | double logTime = 1/logHz;//s interval between logging data |
surajgiri | 11:fc82dd22a527 | 210 | |
surajgiri | 11:fc82dd22a527 | 211 | //Stop the Bench class from printing, so this method can print |
surajgiri | 11:fc82dd22a527 | 212 | leg.pausePrint(); |
surajgiri | 11:fc82dd22a527 | 213 | |
surajgiri | 11:fc82dd22a527 | 214 | //Pressurise |
surajgiri | 11:fc82dd22a527 | 215 | leg.setValve(true); |
surajgiri | 11:fc82dd22a527 | 216 | Timer t; |
surajgiri | 11:fc82dd22a527 | 217 | t.reset(); |
surajgiri | 11:fc82dd22a527 | 218 | t.start(); |
surajgiri | 11:fc82dd22a527 | 219 | while(leg.isLogging() && t.read() < 3) { |
surajgiri | 11:fc82dd22a527 | 220 | leg.pc.printf("\r\nPressure (kPa): \t%7.2f",leg.getPressure0()*100); |
surajgiri | 11:fc82dd22a527 | 221 | wait(0.2); |
surajgiri | 11:fc82dd22a527 | 222 | } |
surajgiri | 11:fc82dd22a527 | 223 | |
surajgiri | 11:fc82dd22a527 | 224 | leg.StartLogging(); |
surajgiri | 11:fc82dd22a527 | 225 | // in loop |
surajgiri | 11:fc82dd22a527 | 226 | for (int i=0; i<cycles; i++) { |
surajgiri | 11:fc82dd22a527 | 227 | //allow leg to go up until force is below threshold |
surajgiri | 11:fc82dd22a527 | 228 | leg.setPWM(pwm); |
surajgiri | 11:fc82dd22a527 | 229 | leg.setDir(0); |
surajgiri | 11:fc82dd22a527 | 230 | leg.pc.printf("\r\nExtending: \t%i",cycles); |
surajgiri | 11:fc82dd22a527 | 231 | while((leg.getForce() >= minForce) && leg.isLogging()) { |
surajgiri | 11:fc82dd22a527 | 232 | leg.pc.printf("\r\nForce (N): \t%7.2f",leg.getForce()); |
surajgiri | 11:fc82dd22a527 | 233 | leg.LogData(); |
surajgiri | 11:fc82dd22a527 | 234 | wait(logTime); |
surajgiri | 11:fc82dd22a527 | 235 | } |
surajgiri | 11:fc82dd22a527 | 236 | if (!leg.isLogging()) { |
surajgiri | 11:fc82dd22a527 | 237 | leg.pc.printf("\r\nExit A"); |
surajgiri | 11:fc82dd22a527 | 238 | //Logging stopped |
surajgiri | 11:fc82dd22a527 | 239 | leg.setPWM(0); |
surajgiri | 11:fc82dd22a527 | 240 | leg.setValve(false);//Depressurise |
surajgiri | 11:fc82dd22a527 | 241 | leg.StopLogging(); //Stop logging data |
surajgiri | 11:fc82dd22a527 | 242 | leg.resumePrint(); //Let the Bench class print |
surajgiri | 11:fc82dd22a527 | 243 | return; |
surajgiri | 11:fc82dd22a527 | 244 | } |
surajgiri | 11:fc82dd22a527 | 245 | |
surajgiri | 11:fc82dd22a527 | 246 | //allow leg to go down until angle is greater than threshold |
surajgiri | 11:fc82dd22a527 | 247 | leg.setPWM(pwm); |
surajgiri | 11:fc82dd22a527 | 248 | leg.setDir(1); |
surajgiri | 11:fc82dd22a527 | 249 | leg.pc.printf("\r\nFlexing: \t%i",cycles); |
surajgiri | 11:fc82dd22a527 | 250 | while((leg.getDegrees(0) <= maxAngle) && leg.isLogging()) { |
surajgiri | 11:fc82dd22a527 | 251 | leg.pc.printf("\r\nAngle (deg): \t%7.2f",leg.getDegrees(0)); |
surajgiri | 11:fc82dd22a527 | 252 | leg.LogData(); |
surajgiri | 11:fc82dd22a527 | 253 | wait(logTime); |
surajgiri | 11:fc82dd22a527 | 254 | } |
surajgiri | 11:fc82dd22a527 | 255 | if (!leg.isLogging()) { |
surajgiri | 11:fc82dd22a527 | 256 | leg.pc.printf("\r\nExit B"); |
surajgiri | 11:fc82dd22a527 | 257 | //Logging stopped |
surajgiri | 11:fc82dd22a527 | 258 | leg.setPWM(0); |
surajgiri | 11:fc82dd22a527 | 259 | leg.setValve(false);//Depressurise |
surajgiri | 11:fc82dd22a527 | 260 | leg.StopLogging(); //Stop logging data |
surajgiri | 11:fc82dd22a527 | 261 | leg.resumePrint(); //Let the Bench class print |
surajgiri | 11:fc82dd22a527 | 262 | return; |
surajgiri | 11:fc82dd22a527 | 263 | } |
surajgiri | 11:fc82dd22a527 | 264 | } |
surajgiri | 11:fc82dd22a527 | 265 | //Depressurise |
surajgiri | 11:fc82dd22a527 | 266 | leg.pc.printf("\r\nExit Benchmarking Test"); |
surajgiri | 11:fc82dd22a527 | 267 | leg.setPWM(0); |
surajgiri | 11:fc82dd22a527 | 268 | leg.setValve(false); |
surajgiri | 11:fc82dd22a527 | 269 | leg.StopLogging(); //Stop logging data |
surajgiri | 11:fc82dd22a527 | 270 | leg.resumePrint(); //Let the Bench class print |
surajgiri | 11:fc82dd22a527 | 271 | } |
surajgiri | 11:fc82dd22a527 | 272 | |
surajgiri | 11:fc82dd22a527 | 273 | void runFailureExp0(float targetkPa) |
surajgiri | 11:fc82dd22a527 | 274 | { |
surajgiri | 11:fc82dd22a527 | 275 | |
surajgiri | 11:fc82dd22a527 | 276 | //Pressurise |
surajgiri | 11:fc82dd22a527 | 277 | leg.StartLogging(); |
surajgiri | 11:fc82dd22a527 | 278 | while(leg.isLogging()) { |
surajgiri | 11:fc82dd22a527 | 279 | leg.setValve(true); |
surajgiri | 11:fc82dd22a527 | 280 | leg.pc.printf("\r\nPressure (kPa): \t%7.2f",leg.getPressure0()*100); |
surajgiri | 11:fc82dd22a527 | 281 | leg.LogData(); |
surajgiri | 11:fc82dd22a527 | 282 | wait(0.1); |
surajgiri | 11:fc82dd22a527 | 283 | } |
surajgiri | 11:fc82dd22a527 | 284 | //Depressurise |
surajgiri | 11:fc82dd22a527 | 285 | leg.pc.printf("\r\nExit Benchmarking Test"); |
surajgiri | 11:fc82dd22a527 | 286 | leg.setValve(false); |
surajgiri | 11:fc82dd22a527 | 287 | leg.StopLogging(); //Stop logging data |
surajgiri | 11:fc82dd22a527 | 288 | leg.resumePrint(); //Let the Bench class print |
surajgiri | 11:fc82dd22a527 | 289 | } |
surajgiri | 11:fc82dd22a527 | 290 | |
surajgiri | 11:fc82dd22a527 | 291 | |
cnckiwi31 | 10:77fcbad99a31 | 292 | void testDAC() { |
cnckiwi31 | 10:77fcbad99a31 | 293 | //setup SPI to write 8 bit words, mode 1 and turn select lines high |
cnckiwi31 | 10:77fcbad99a31 | 294 | spi.format(8,1); |
cnckiwi31 | 10:77fcbad99a31 | 295 | spi.frequency(200000); |
cnckiwi31 | 10:77fcbad99a31 | 296 | deselectDACB(); |
cnckiwi31 | 10:77fcbad99a31 | 297 | wait_ms(20); |
cnckiwi31 | 10:77fcbad99a31 | 298 | |
cnckiwi31 | 10:77fcbad99a31 | 299 | //Power up DAC |
cnckiwi31 | 10:77fcbad99a31 | 300 | selectDACB(); |
cnckiwi31 | 10:77fcbad99a31 | 301 | spi.write(0xE0); |
cnckiwi31 | 10:77fcbad99a31 | 302 | spi.write(0x00); |
cnckiwi31 | 10:77fcbad99a31 | 303 | deselectDACB(); |
cnckiwi31 | 10:77fcbad99a31 | 304 | |
cnckiwi31 | 10:77fcbad99a31 | 305 | //Write a value to a channel |
cnckiwi31 | 10:77fcbad99a31 | 306 | selectDACB(); |
cnckiwi31 | 10:77fcbad99a31 | 307 | spi.write(0x47); |
cnckiwi31 | 10:77fcbad99a31 | 308 | spi.write(0xFF); |
cnckiwi31 | 10:77fcbad99a31 | 309 | deselectDACB(); |
cnckiwi31 | 10:77fcbad99a31 | 310 | |
megrootens | 0:3855d4588f76 | 311 | |
cnckiwi31 | 10:77fcbad99a31 | 312 | |
cnckiwi31 | 10:77fcbad99a31 | 313 | |
cnckiwi31 | 10:77fcbad99a31 | 314 | /* selectDACB(); |
cnckiwi31 | 10:77fcbad99a31 | 315 | spi.write(0x2F); |
cnckiwi31 | 10:77fcbad99a31 | 316 | spi.write(0xFF); |
cnckiwi31 | 10:77fcbad99a31 | 317 | deselectDACB(); |
cnckiwi31 | 10:77fcbad99a31 | 318 | |
cnckiwi31 | 10:77fcbad99a31 | 319 | selectDACB(); |
cnckiwi31 | 10:77fcbad99a31 | 320 | spi.write(0x60); |
cnckiwi31 | 10:77fcbad99a31 | 321 | spi.write(0x00); |
cnckiwi31 | 10:77fcbad99a31 | 322 | deselectDACB();*/ |
cnckiwi31 | 10:77fcbad99a31 | 323 | |
cnckiwi31 | 10:77fcbad99a31 | 324 | //wait(3); |
cnckiwi31 | 10:77fcbad99a31 | 325 | |
cnckiwi31 | 10:77fcbad99a31 | 326 | //Write a value to a channel |
cnckiwi31 | 10:77fcbad99a31 | 327 | /* selectDACB(); |
cnckiwi31 | 10:77fcbad99a31 | 328 | spi.write(0x40); |
cnckiwi31 | 10:77fcbad99a31 | 329 | spi.write(0x00); |
cnckiwi31 | 10:77fcbad99a31 | 330 | deselectDACB();*/ |
cnckiwi31 | 10:77fcbad99a31 | 331 | |
cnckiwi31 | 10:77fcbad99a31 | 332 | while (true) { |
cnckiwi31 | 10:77fcbad99a31 | 333 | myled = !myled; |
cnckiwi31 | 10:77fcbad99a31 | 334 | |
cnckiwi31 | 10:77fcbad99a31 | 335 | |
cnckiwi31 | 10:77fcbad99a31 | 336 | wait_ms(500); |
cnckiwi31 | 10:77fcbad99a31 | 337 | } |
cnckiwi31 | 10:77fcbad99a31 | 338 | } |
cnckiwi31 | 10:77fcbad99a31 | 339 | |
cnckiwi31 | 10:77fcbad99a31 | 340 | /** Selects DAC B (enable line goes low) |
cnckiwi31 | 10:77fcbad99a31 | 341 | */ |
cnckiwi31 | 10:77fcbad99a31 | 342 | void selectDACB() |
cnckiwi31 | 10:77fcbad99a31 | 343 | { |
cnckiwi31 | 10:77fcbad99a31 | 344 | CSB.write(0); |
cnckiwi31 | 10:77fcbad99a31 | 345 | wait_us(1); |
cnckiwi31 | 10:77fcbad99a31 | 346 | } |
cnckiwi31 | 10:77fcbad99a31 | 347 | |
cnckiwi31 | 10:77fcbad99a31 | 348 | /** Deselects DAC B (enable line goes high) |
cnckiwi31 | 10:77fcbad99a31 | 349 | */ |
cnckiwi31 | 10:77fcbad99a31 | 350 | void deselectDACB() |
cnckiwi31 | 10:77fcbad99a31 | 351 | { |
cnckiwi31 | 10:77fcbad99a31 | 352 | CSB.write(1); |
cnckiwi31 | 10:77fcbad99a31 | 353 | wait_us(1); |
cnckiwi31 | 10:77fcbad99a31 | 354 | } |
cnckiwi31 | 10:77fcbad99a31 | 355 | |
cnckiwi31 | 10:77fcbad99a31 | 356 | void testToggleChannel() |
cnckiwi31 | 10:77fcbad99a31 | 357 | { |
cnckiwi31 | 10:77fcbad99a31 | 358 | // POWER up dac |
cnckiwi31 | 10:77fcbad99a31 | 359 | //select chip |
cnckiwi31 | 10:77fcbad99a31 | 360 | CSB.write(0); |
cnckiwi31 | 10:77fcbad99a31 | 361 | wait_us(1); |
cnckiwi31 | 10:77fcbad99a31 | 362 | |
cnckiwi31 | 10:77fcbad99a31 | 363 | spi.write(0b11100000); |
cnckiwi31 | 10:77fcbad99a31 | 364 | spi.write(0b00000000); |
cnckiwi31 | 10:77fcbad99a31 | 365 | |
cnckiwi31 | 10:77fcbad99a31 | 366 | //deselect chip |
cnckiwi31 | 10:77fcbad99a31 | 367 | CSB.write(1); |
cnckiwi31 | 10:77fcbad99a31 | 368 | wait_us(1); |
cnckiwi31 | 10:77fcbad99a31 | 369 | |
cnckiwi31 | 10:77fcbad99a31 | 370 | |
cnckiwi31 | 10:77fcbad99a31 | 371 | //write output on a |
cnckiwi31 | 10:77fcbad99a31 | 372 | //select chip |
cnckiwi31 | 10:77fcbad99a31 | 373 | CSB.write(0); |
cnckiwi31 | 10:77fcbad99a31 | 374 | wait_us(1); |
cnckiwi31 | 10:77fcbad99a31 | 375 | |
cnckiwi31 | 10:77fcbad99a31 | 376 | spi.write(0b01000011); |
cnckiwi31 | 10:77fcbad99a31 | 377 | spi.write(0b11111111); |
cnckiwi31 | 10:77fcbad99a31 | 378 | |
cnckiwi31 | 10:77fcbad99a31 | 379 | //deselect chip |
cnckiwi31 | 10:77fcbad99a31 | 380 | CSB.write(1); |
cnckiwi31 | 10:77fcbad99a31 | 381 | wait_us(1); |
cnckiwi31 | 10:77fcbad99a31 | 382 | |
cnckiwi31 | 10:77fcbad99a31 | 383 | |
cnckiwi31 | 10:77fcbad99a31 | 384 | //write output on b |
cnckiwi31 | 10:77fcbad99a31 | 385 | //select chip |
cnckiwi31 | 10:77fcbad99a31 | 386 | CSB.write(0); |
cnckiwi31 | 10:77fcbad99a31 | 387 | wait_us(1); |
cnckiwi31 | 10:77fcbad99a31 | 388 | |
cnckiwi31 | 10:77fcbad99a31 | 389 | spi.write(0b01011011); |
cnckiwi31 | 10:77fcbad99a31 | 390 | spi.write(0b11111111); |
cnckiwi31 | 10:77fcbad99a31 | 391 | |
cnckiwi31 | 10:77fcbad99a31 | 392 | //deselect chip |
cnckiwi31 | 10:77fcbad99a31 | 393 | CSB.write(1); |
cnckiwi31 | 10:77fcbad99a31 | 394 | wait_us(1); |
cnckiwi31 | 10:77fcbad99a31 | 395 | |
cnckiwi31 | 10:77fcbad99a31 | 396 | while (true) { |
cnckiwi31 | 10:77fcbad99a31 | 397 | //leg.pc.printf("Hi"); |
cnckiwi31 | 10:77fcbad99a31 | 398 | // POWER up dac |
cnckiwi31 | 10:77fcbad99a31 | 399 | //select chip |
cnckiwi31 | 10:77fcbad99a31 | 400 | CSB.write(0); |
cnckiwi31 | 10:77fcbad99a31 | 401 | wait_us(1); |
cnckiwi31 | 10:77fcbad99a31 | 402 | |
cnckiwi31 | 10:77fcbad99a31 | 403 | spi.write(0b11100000); |
cnckiwi31 | 10:77fcbad99a31 | 404 | spi.write(0b00000000); |
cnckiwi31 | 10:77fcbad99a31 | 405 | |
cnckiwi31 | 10:77fcbad99a31 | 406 | //deselect chip |
cnckiwi31 | 10:77fcbad99a31 | 407 | CSB.write(1); |
cnckiwi31 | 10:77fcbad99a31 | 408 | wait_us(1); |
cnckiwi31 | 10:77fcbad99a31 | 409 | //write output on a |
cnckiwi31 | 10:77fcbad99a31 | 410 | //select chip |
cnckiwi31 | 10:77fcbad99a31 | 411 | CSB.write(0); |
cnckiwi31 | 10:77fcbad99a31 | 412 | wait_us(1); |
cnckiwi31 | 10:77fcbad99a31 | 413 | |
cnckiwi31 | 10:77fcbad99a31 | 414 | spi.write(0b01010011); |
cnckiwi31 | 10:77fcbad99a31 | 415 | spi.write(0b11111111); |
cnckiwi31 | 10:77fcbad99a31 | 416 | |
cnckiwi31 | 10:77fcbad99a31 | 417 | spi.write(0b01001011); |
cnckiwi31 | 10:77fcbad99a31 | 418 | spi.write(0b11111111); |
cnckiwi31 | 10:77fcbad99a31 | 419 | |
cnckiwi31 | 10:77fcbad99a31 | 420 | //deselect chip |
cnckiwi31 | 10:77fcbad99a31 | 421 | CSB.write(1); |
cnckiwi31 | 10:77fcbad99a31 | 422 | wait_us(1); |
cnckiwi31 | 10:77fcbad99a31 | 423 | |
cnckiwi31 | 10:77fcbad99a31 | 424 | wait_ms(100); |
cnckiwi31 | 10:77fcbad99a31 | 425 | |
cnckiwi31 | 10:77fcbad99a31 | 426 | |
cnckiwi31 | 10:77fcbad99a31 | 427 | } |
cnckiwi31 | 10:77fcbad99a31 | 428 | bool ch = true; |
cnckiwi31 | 10:77fcbad99a31 | 429 | while (true) { |
cnckiwi31 | 10:77fcbad99a31 | 430 | //data value |
cnckiwi31 | 10:77fcbad99a31 | 431 | unsigned int data = 0xFFF; |
cnckiwi31 | 10:77fcbad99a31 | 432 | |
cnckiwi31 | 10:77fcbad99a31 | 433 | //if more than 12 bits (0xfff) then set all bits true) |
cnckiwi31 | 10:77fcbad99a31 | 434 | if (data > 0xFFF) { |
cnckiwi31 | 10:77fcbad99a31 | 435 | data = 0xFFF; |
cnckiwi31 | 10:77fcbad99a31 | 436 | } |
cnckiwi31 | 10:77fcbad99a31 | 437 | |
cnckiwi31 | 10:77fcbad99a31 | 438 | //select chip |
cnckiwi31 | 10:77fcbad99a31 | 439 | //bring cs low |
cnckiwi31 | 10:77fcbad99a31 | 440 | CSB.write(0); |
cnckiwi31 | 10:77fcbad99a31 | 441 | //wait a bit (more than 40ns) |
cnckiwi31 | 10:77fcbad99a31 | 442 | wait_us(1); |
cnckiwi31 | 10:77fcbad99a31 | 443 | |
cnckiwi31 | 10:77fcbad99a31 | 444 | //transfer a command (for channel a 0x4<<12 + data masked to 12 bits, for channel b 0x5<<12 + data masked to 12 bits) |
cnckiwi31 | 10:77fcbad99a31 | 445 | |
cnckiwi31 | 10:77fcbad99a31 | 446 | int command = (0x01<<12);//default to channel a |
cnckiwi31 | 10:77fcbad99a31 | 447 | /*if (!ch) { |
cnckiwi31 | 10:77fcbad99a31 | 448 | command = (0x05<<12); |
cnckiwi31 | 10:77fcbad99a31 | 449 | } */ |
cnckiwi31 | 10:77fcbad99a31 | 450 | data = command + (data&0xFFF); |
cnckiwi31 | 10:77fcbad99a31 | 451 | //spi.write(data); |
cnckiwi31 | 10:77fcbad99a31 | 452 | spi.write(data>>8); |
cnckiwi31 | 10:77fcbad99a31 | 453 | spi.write(data & 0x00FF); |
cnckiwi31 | 10:77fcbad99a31 | 454 | //bring cs high |
cnckiwi31 | 10:77fcbad99a31 | 455 | CSB.write(1); |
cnckiwi31 | 10:77fcbad99a31 | 456 | //wait a bit (more than 10-15ns) |
cnckiwi31 | 10:77fcbad99a31 | 457 | wait_us(1); |
cnckiwi31 | 10:77fcbad99a31 | 458 | wait_ms(10); |
cnckiwi31 | 10:77fcbad99a31 | 459 | //leg.pc.printf("\r\nCommand: \t%i",command); |
cnckiwi31 | 10:77fcbad99a31 | 460 | |
cnckiwi31 | 10:77fcbad99a31 | 461 | //leg.pc.printf("\r\nData: \t%i",data); |
cnckiwi31 | 10:77fcbad99a31 | 462 | ch = !ch; |
cnckiwi31 | 10:77fcbad99a31 | 463 | } |
cnckiwi31 | 10:77fcbad99a31 | 464 | } |