Version 3 is with update to the test rig with a linear actuator

Dependencies:   SPTE_10Bar_5V mbed AS5048 SDFileSystem MODSERIAL PinDetect LCM101 LinearActuator

Committer:
surajgiri
Date:
Tue Oct 20 12:50:40 2020 +0000
Revision:
13:219c16e7d32c
Parent:
11:fc82dd22a527
Update with linear actuator

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"
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 13:219c16e7d32c 46 float targetP = 300;
surajgiri 13:219c16e7d32c 47 int expCycles = 40; //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 13:219c16e7d32c 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 13:219c16e7d32c 85 int num_file = 1; //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 }