HeRoS: read out and log joint angles and force sensor data from the leg test bench. Now with additional features to read pressure sensors and set the null values of the pressure and force sensors

Dependencies:   SPTE_10Bar_5V mbed AS5048 SDFileSystem MODSERIAL PinDetect Valve LCM101

Fork of heros_leg_readout_torque_addition by K K

Committer:
cnckiwi31
Date:
Mon Feb 17 15:15:24 2020 +0000
Revision:
10:77fcbad99a31
Parent:
5:63063a9fa51c
Child:
11:b0a6faaa5e9f
Latest commit

Who changed what in which revision?

UserRevisionLine numberNew 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"
megrootens 0:3855d4588f76 11
cnckiwi31 10:77fcbad99a31 12
cnckiwi31 5:63063a9fa51c 13 //Example experiment method
cnckiwi31 5:63063a9fa51c 14 void runDemoExperiment0(int cycles, float targetkPa);
megrootens 0:3855d4588f76 15
cnckiwi31 10:77fcbad99a31 16 //Methods for testing DAC chip - leave for now
cnckiwi31 10:77fcbad99a31 17 void selectDACB();
cnckiwi31 10:77fcbad99a31 18 void deselectDACB();
cnckiwi31 10:77fcbad99a31 19
cnckiwi31 10:77fcbad99a31 20 void testDAC();
cnckiwi31 10:77fcbad99a31 21 void testToggleChannel();
cnckiwi31 10:77fcbad99a31 22
cnckiwi31 10:77fcbad99a31 23 DigitalOut myled(LED1);
cnckiwi31 10:77fcbad99a31 24 DigitalOut CSA(DAC_CSA);
cnckiwi31 10:77fcbad99a31 25 DigitalOut CSB(DAC_CSB);
cnckiwi31 10:77fcbad99a31 26 SPI spi(DAC_MOSI,DAC_MISO,DAC_SCLK);
cnckiwi31 10:77fcbad99a31 27
cnckiwi31 5:63063a9fa51c 28 // Create bench object - this is used to control the test rig
cnckiwi31 5:63063a9fa51c 29 Bench leg;
megrootens 0:3855d4588f76 30
megrootens 0:3855d4588f76 31 /**
cnckiwi31 5:63063a9fa51c 32 * Main loop
megrootens 0:3855d4588f76 33 */
megrootens 0:3855d4588f76 34 int main()
cnckiwi31 5:63063a9fa51c 35 {
cnckiwi31 5:63063a9fa51c 36 leg.setLoggingFrequency(100); //Set datalogging frequency
cnckiwi31 5:63063a9fa51c 37
cnckiwi31 5:63063a9fa51c 38 /* Two extra columns of data will be recorded in this experiment.
cnckiwi31 5:63063a9fa51c 39 One for the target pressure, and the other for the number of sit and
cnckiwi31 5:63063a9fa51c 40 stand cycles currently completed in the experiment */
cnckiwi31 5:63063a9fa51c 41 string colNames[] = {"Target pressure (kPa)","Cycle"}; //add data headings
cnckiwi31 5:63063a9fa51c 42 leg.setExtraColumns(colNames,2);
megrootens 0:3855d4588f76 43
cnckiwi31 5:63063a9fa51c 44 float targetP = 200; //Target pressure in kPa
cnckiwi31 5:63063a9fa51c 45 int expCycles = 2; //Number of sit to stand to sit cycles
cnckiwi31 5:63063a9fa51c 46 float vals[] = {targetP,0}; //set initial values of data that will be logged
cnckiwi31 5:63063a9fa51c 47 leg.setExtraData(vals);
cnckiwi31 4:1cdce6c6c94e 48
cnckiwi31 5:63063a9fa51c 49 /* Setup all peripherals on rig, display info about SD card and the
cnckiwi31 5:63063a9fa51c 50 user interface menu */
cnckiwi31 10:77fcbad99a31 51 leg.initialise(); //this gives the 10MHz, normal clock polarity, mode 1 spi we need, pins are same as for encoder
cnckiwi31 10:77fcbad99a31 52
megrootens 0:3855d4588f76 53
cnckiwi31 5:63063a9fa51c 54
cnckiwi31 5:63063a9fa51c 55 /*Run an experiment when the button is pressed to start datalogging and
cnckiwi31 5:63063a9fa51c 56 stop it if the button is pressed again to stop datalogging
cnckiwi31 5:63063a9fa51c 57 (or when experiment stops - then datalogging stops by itself) */
cnckiwi31 5:63063a9fa51c 58 while (true) {
cnckiwi31 5:63063a9fa51c 59 if (leg.isLogging()) {
cnckiwi31 5:63063a9fa51c 60 runDemoExperiment0(expCycles,targetP);
cnckiwi31 5:63063a9fa51c 61 }
megrootens 0:3855d4588f76 62 }
megrootens 0:3855d4588f76 63 }
megrootens 0:3855d4588f76 64
cnckiwi31 5:63063a9fa51c 65 /**
cnckiwi31 5:63063a9fa51c 66 * Shows how a demo experiment works. This experiment pressurises the leg to
cnckiwi31 5:63063a9fa51c 67 * pressure targetkPa, depressurises it, and then repeats the process cycles
cnckiwi31 5:63063a9fa51c 68 * number of times
cnckiwi31 5:63063a9fa51c 69 * @param cycles: the number of cycles the leg goes up and down
cnckiwi31 5:63063a9fa51c 70 * @param targetkPa: the pressure at which the valve is opened to let the leg go down
cnckiwi31 5:63063a9fa51c 71 */
cnckiwi31 5:63063a9fa51c 72 void runDemoExperiment0(int cycles, float targetkPa)
megrootens 0:3855d4588f76 73 {
cnckiwi31 5:63063a9fa51c 74 //The experiment starts when logging does
cnckiwi31 5:63063a9fa51c 75 bool experimentRunning = leg.isLogging();
cnckiwi31 5:63063a9fa51c 76
cnckiwi31 5:63063a9fa51c 77 //Stop the Bench class from printing, so this method can print
cnckiwi31 5:63063a9fa51c 78 leg.pausePrint();
cnckiwi31 5:63063a9fa51c 79
cnckiwi31 5:63063a9fa51c 80 if (experimentRunning) {
cnckiwi31 5:63063a9fa51c 81 // Pressurise and depressurise the leg cycles number of times
cnckiwi31 5:63063a9fa51c 82 for (int i=0; i<cycles; i++) {
cnckiwi31 5:63063a9fa51c 83 leg.pc.printf("\r\nCycle: \t%i out of \t%i",i+1,cycles);
cnckiwi31 5:63063a9fa51c 84
cnckiwi31 5:63063a9fa51c 85 //Update cycles logged
cnckiwi31 5:63063a9fa51c 86 float data[] = {targetkPa,i+1};
cnckiwi31 5:63063a9fa51c 87 leg.setExtraData(data);
cnckiwi31 5:63063a9fa51c 88
cnckiwi31 5:63063a9fa51c 89 //Pressurise
cnckiwi31 5:63063a9fa51c 90 leg.setValve(true);
megrootens 0:3855d4588f76 91
cnckiwi31 5:63063a9fa51c 92 //Wait until measured pressure reaches target pressure
cnckiwi31 5:63063a9fa51c 93 float measureP = 0;
cnckiwi31 5:63063a9fa51c 94 while(measureP < targetkPa) {
cnckiwi31 5:63063a9fa51c 95 //Keep checking logging is going
cnckiwi31 5:63063a9fa51c 96 experimentRunning = leg.isLogging();
cnckiwi31 5:63063a9fa51c 97
cnckiwi31 5:63063a9fa51c 98 if (experimentRunning) {
cnckiwi31 5:63063a9fa51c 99 measureP = leg.getPressure0()*100;//Conversion of bar to kPa
cnckiwi31 10:77fcbad99a31 100 wait(0.05);//Wait a bit
cnckiwi31 5:63063a9fa51c 101 } else { //Logging stopped
cnckiwi31 5:63063a9fa51c 102 leg.stopLogging(); //Stop logging data
cnckiwi31 5:63063a9fa51c 103 leg.setValve(false); //Depressurise
cnckiwi31 5:63063a9fa51c 104 leg.resumePrint(); //Let the Bench class print
cnckiwi31 5:63063a9fa51c 105 return;
cnckiwi31 5:63063a9fa51c 106 }
cnckiwi31 5:63063a9fa51c 107 }
megrootens 0:3855d4588f76 108
cnckiwi31 5:63063a9fa51c 109 //Depressurise
cnckiwi31 5:63063a9fa51c 110 leg.setValve(false);
megrootens 0:3855d4588f76 111
cnckiwi31 5:63063a9fa51c 112 /*Wait until depressurised (completely depressurised is
cnckiwi31 5:63063a9fa51c 113 around 10-12 kPa due to current sensor calibration)*/
cnckiwi31 5:63063a9fa51c 114 while(measureP > 15) {
cnckiwi31 5:63063a9fa51c 115 //Keep checking logging is going
cnckiwi31 5:63063a9fa51c 116 experimentRunning = leg.isLogging();
cnckiwi31 5:63063a9fa51c 117
cnckiwi31 5:63063a9fa51c 118 if (experimentRunning) {
cnckiwi31 5:63063a9fa51c 119 measureP = leg.getPressure0()*100;//Conversion of bar to kpa
cnckiwi31 10:77fcbad99a31 120 wait(0.05);//Wait a bit
cnckiwi31 5:63063a9fa51c 121 } else { //Logging stopped
cnckiwi31 5:63063a9fa51c 122 leg.stopLogging(); //Stop logging data
cnckiwi31 5:63063a9fa51c 123 leg.resumePrint(); //Let the Bench class print
cnckiwi31 5:63063a9fa51c 124 return;
cnckiwi31 5:63063a9fa51c 125 }
megrootens 0:3855d4588f76 126 }
megrootens 0:3855d4588f76 127 }
cnckiwi31 5:63063a9fa51c 128 // Logging stopped as experiment is fully completed
cnckiwi31 5:63063a9fa51c 129 leg.stopLogging(); //Stop logging data
cnckiwi31 5:63063a9fa51c 130 leg.resumePrint(); //Let the Bench class print
megrootens 0:3855d4588f76 131 }
megrootens 0:3855d4588f76 132 }
megrootens 0:3855d4588f76 133
cnckiwi31 10:77fcbad99a31 134 void testDAC() {
cnckiwi31 10:77fcbad99a31 135 //setup SPI to write 8 bit words, mode 1 and turn select lines high
cnckiwi31 10:77fcbad99a31 136 spi.format(8,1);
cnckiwi31 10:77fcbad99a31 137 spi.frequency(200000);
cnckiwi31 10:77fcbad99a31 138 deselectDACB();
cnckiwi31 10:77fcbad99a31 139 wait_ms(20);
cnckiwi31 10:77fcbad99a31 140
cnckiwi31 10:77fcbad99a31 141 //Power up DAC
cnckiwi31 10:77fcbad99a31 142 selectDACB();
cnckiwi31 10:77fcbad99a31 143 spi.write(0xE0);
cnckiwi31 10:77fcbad99a31 144 spi.write(0x00);
cnckiwi31 10:77fcbad99a31 145 deselectDACB();
cnckiwi31 10:77fcbad99a31 146
cnckiwi31 10:77fcbad99a31 147 //Write a value to a channel
cnckiwi31 10:77fcbad99a31 148 selectDACB();
cnckiwi31 10:77fcbad99a31 149 spi.write(0x47);
cnckiwi31 10:77fcbad99a31 150 spi.write(0xFF);
cnckiwi31 10:77fcbad99a31 151 deselectDACB();
cnckiwi31 10:77fcbad99a31 152
megrootens 0:3855d4588f76 153
cnckiwi31 10:77fcbad99a31 154
cnckiwi31 10:77fcbad99a31 155
cnckiwi31 10:77fcbad99a31 156 /* selectDACB();
cnckiwi31 10:77fcbad99a31 157 spi.write(0x2F);
cnckiwi31 10:77fcbad99a31 158 spi.write(0xFF);
cnckiwi31 10:77fcbad99a31 159 deselectDACB();
cnckiwi31 10:77fcbad99a31 160
cnckiwi31 10:77fcbad99a31 161 selectDACB();
cnckiwi31 10:77fcbad99a31 162 spi.write(0x60);
cnckiwi31 10:77fcbad99a31 163 spi.write(0x00);
cnckiwi31 10:77fcbad99a31 164 deselectDACB();*/
cnckiwi31 10:77fcbad99a31 165
cnckiwi31 10:77fcbad99a31 166 //wait(3);
cnckiwi31 10:77fcbad99a31 167
cnckiwi31 10:77fcbad99a31 168 //Write a value to a channel
cnckiwi31 10:77fcbad99a31 169 /* selectDACB();
cnckiwi31 10:77fcbad99a31 170 spi.write(0x40);
cnckiwi31 10:77fcbad99a31 171 spi.write(0x00);
cnckiwi31 10:77fcbad99a31 172 deselectDACB();*/
cnckiwi31 10:77fcbad99a31 173
cnckiwi31 10:77fcbad99a31 174 while (true) {
cnckiwi31 10:77fcbad99a31 175 myled = !myled;
cnckiwi31 10:77fcbad99a31 176
cnckiwi31 10:77fcbad99a31 177
cnckiwi31 10:77fcbad99a31 178 wait_ms(500);
cnckiwi31 10:77fcbad99a31 179 }
cnckiwi31 10:77fcbad99a31 180 }
cnckiwi31 10:77fcbad99a31 181
cnckiwi31 10:77fcbad99a31 182 /** Selects DAC B (enable line goes low)
cnckiwi31 10:77fcbad99a31 183 */
cnckiwi31 10:77fcbad99a31 184 void selectDACB()
cnckiwi31 10:77fcbad99a31 185 {
cnckiwi31 10:77fcbad99a31 186 CSB.write(0);
cnckiwi31 10:77fcbad99a31 187 wait_us(1);
cnckiwi31 10:77fcbad99a31 188 }
cnckiwi31 10:77fcbad99a31 189
cnckiwi31 10:77fcbad99a31 190 /** Deselects DAC B (enable line goes high)
cnckiwi31 10:77fcbad99a31 191 */
cnckiwi31 10:77fcbad99a31 192 void deselectDACB()
cnckiwi31 10:77fcbad99a31 193 {
cnckiwi31 10:77fcbad99a31 194 CSB.write(1);
cnckiwi31 10:77fcbad99a31 195 wait_us(1);
cnckiwi31 10:77fcbad99a31 196 }
cnckiwi31 10:77fcbad99a31 197
cnckiwi31 10:77fcbad99a31 198 void testToggleChannel()
cnckiwi31 10:77fcbad99a31 199 {
cnckiwi31 10:77fcbad99a31 200 // POWER up dac
cnckiwi31 10:77fcbad99a31 201 //select chip
cnckiwi31 10:77fcbad99a31 202 CSB.write(0);
cnckiwi31 10:77fcbad99a31 203 wait_us(1);
cnckiwi31 10:77fcbad99a31 204
cnckiwi31 10:77fcbad99a31 205 spi.write(0b11100000);
cnckiwi31 10:77fcbad99a31 206 spi.write(0b00000000);
cnckiwi31 10:77fcbad99a31 207
cnckiwi31 10:77fcbad99a31 208 //deselect chip
cnckiwi31 10:77fcbad99a31 209 CSB.write(1);
cnckiwi31 10:77fcbad99a31 210 wait_us(1);
cnckiwi31 10:77fcbad99a31 211
cnckiwi31 10:77fcbad99a31 212
cnckiwi31 10:77fcbad99a31 213 //write output on a
cnckiwi31 10:77fcbad99a31 214 //select chip
cnckiwi31 10:77fcbad99a31 215 CSB.write(0);
cnckiwi31 10:77fcbad99a31 216 wait_us(1);
cnckiwi31 10:77fcbad99a31 217
cnckiwi31 10:77fcbad99a31 218 spi.write(0b01000011);
cnckiwi31 10:77fcbad99a31 219 spi.write(0b11111111);
cnckiwi31 10:77fcbad99a31 220
cnckiwi31 10:77fcbad99a31 221 //deselect chip
cnckiwi31 10:77fcbad99a31 222 CSB.write(1);
cnckiwi31 10:77fcbad99a31 223 wait_us(1);
cnckiwi31 10:77fcbad99a31 224
cnckiwi31 10:77fcbad99a31 225
cnckiwi31 10:77fcbad99a31 226 //write output on b
cnckiwi31 10:77fcbad99a31 227 //select chip
cnckiwi31 10:77fcbad99a31 228 CSB.write(0);
cnckiwi31 10:77fcbad99a31 229 wait_us(1);
cnckiwi31 10:77fcbad99a31 230
cnckiwi31 10:77fcbad99a31 231 spi.write(0b01011011);
cnckiwi31 10:77fcbad99a31 232 spi.write(0b11111111);
cnckiwi31 10:77fcbad99a31 233
cnckiwi31 10:77fcbad99a31 234 //deselect chip
cnckiwi31 10:77fcbad99a31 235 CSB.write(1);
cnckiwi31 10:77fcbad99a31 236 wait_us(1);
cnckiwi31 10:77fcbad99a31 237
cnckiwi31 10:77fcbad99a31 238 while (true) {
cnckiwi31 10:77fcbad99a31 239 //leg.pc.printf("Hi");
cnckiwi31 10:77fcbad99a31 240 // POWER up dac
cnckiwi31 10:77fcbad99a31 241 //select chip
cnckiwi31 10:77fcbad99a31 242 CSB.write(0);
cnckiwi31 10:77fcbad99a31 243 wait_us(1);
cnckiwi31 10:77fcbad99a31 244
cnckiwi31 10:77fcbad99a31 245 spi.write(0b11100000);
cnckiwi31 10:77fcbad99a31 246 spi.write(0b00000000);
cnckiwi31 10:77fcbad99a31 247
cnckiwi31 10:77fcbad99a31 248 //deselect chip
cnckiwi31 10:77fcbad99a31 249 CSB.write(1);
cnckiwi31 10:77fcbad99a31 250 wait_us(1);
cnckiwi31 10:77fcbad99a31 251 //write output on a
cnckiwi31 10:77fcbad99a31 252 //select chip
cnckiwi31 10:77fcbad99a31 253 CSB.write(0);
cnckiwi31 10:77fcbad99a31 254 wait_us(1);
cnckiwi31 10:77fcbad99a31 255
cnckiwi31 10:77fcbad99a31 256 spi.write(0b01010011);
cnckiwi31 10:77fcbad99a31 257 spi.write(0b11111111);
cnckiwi31 10:77fcbad99a31 258
cnckiwi31 10:77fcbad99a31 259 spi.write(0b01001011);
cnckiwi31 10:77fcbad99a31 260 spi.write(0b11111111);
cnckiwi31 10:77fcbad99a31 261
cnckiwi31 10:77fcbad99a31 262 //deselect chip
cnckiwi31 10:77fcbad99a31 263 CSB.write(1);
cnckiwi31 10:77fcbad99a31 264 wait_us(1);
cnckiwi31 10:77fcbad99a31 265
cnckiwi31 10:77fcbad99a31 266 wait_ms(100);
cnckiwi31 10:77fcbad99a31 267
cnckiwi31 10:77fcbad99a31 268
cnckiwi31 10:77fcbad99a31 269 }
cnckiwi31 10:77fcbad99a31 270 bool ch = true;
cnckiwi31 10:77fcbad99a31 271 while (true) {
cnckiwi31 10:77fcbad99a31 272 //data value
cnckiwi31 10:77fcbad99a31 273 unsigned int data = 0xFFF;
cnckiwi31 10:77fcbad99a31 274
cnckiwi31 10:77fcbad99a31 275 //if more than 12 bits (0xfff) then set all bits true)
cnckiwi31 10:77fcbad99a31 276 if (data > 0xFFF) {
cnckiwi31 10:77fcbad99a31 277 data = 0xFFF;
cnckiwi31 10:77fcbad99a31 278 }
cnckiwi31 10:77fcbad99a31 279
cnckiwi31 10:77fcbad99a31 280 //select chip
cnckiwi31 10:77fcbad99a31 281 //bring cs low
cnckiwi31 10:77fcbad99a31 282 CSB.write(0);
cnckiwi31 10:77fcbad99a31 283 //wait a bit (more than 40ns)
cnckiwi31 10:77fcbad99a31 284 wait_us(1);
cnckiwi31 10:77fcbad99a31 285
cnckiwi31 10:77fcbad99a31 286 //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 287
cnckiwi31 10:77fcbad99a31 288 int command = (0x01<<12);//default to channel a
cnckiwi31 10:77fcbad99a31 289 /*if (!ch) {
cnckiwi31 10:77fcbad99a31 290 command = (0x05<<12);
cnckiwi31 10:77fcbad99a31 291 } */
cnckiwi31 10:77fcbad99a31 292 data = command + (data&0xFFF);
cnckiwi31 10:77fcbad99a31 293 //spi.write(data);
cnckiwi31 10:77fcbad99a31 294 spi.write(data>>8);
cnckiwi31 10:77fcbad99a31 295 spi.write(data & 0x00FF);
cnckiwi31 10:77fcbad99a31 296 //bring cs high
cnckiwi31 10:77fcbad99a31 297 CSB.write(1);
cnckiwi31 10:77fcbad99a31 298 //wait a bit (more than 10-15ns)
cnckiwi31 10:77fcbad99a31 299 wait_us(1);
cnckiwi31 10:77fcbad99a31 300 wait_ms(10);
cnckiwi31 10:77fcbad99a31 301 //leg.pc.printf("\r\nCommand: \t%i",command);
cnckiwi31 10:77fcbad99a31 302
cnckiwi31 10:77fcbad99a31 303 //leg.pc.printf("\r\nData: \t%i",data);
cnckiwi31 10:77fcbad99a31 304 ch = !ch;
cnckiwi31 10:77fcbad99a31 305 }
cnckiwi31 10:77fcbad99a31 306 }