Seth Ruiter / Mbed 2 deprecated bouke

Dependencies:   MODSERIAL SDFileSystemSeth mbed

Fork of Opstellingbachelor_opdracht by Claudia Haarman

Committer:
c_haarm
Date:
Tue Oct 11 14:07:58 2016 +0000
Revision:
8:1326141017ea
Parent:
7:9f9ea047975d
Child:
9:d9ba61ce7a29
tc + torque working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
c_haarm 0:f7cd934498e4 1 #include "mbed.h"
c_haarm 0:f7cd934498e4 2 #include "MODSERIAL.h"
c_haarm 0:f7cd934498e4 3 #include "SDFileSystem.h"
c_haarm 0:f7cd934498e4 4
c_haarm 0:f7cd934498e4 5
c_haarm 0:f7cd934498e4 6 ////////////////////Declarations////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 7 ////////////////////////////////////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 8 ////////////////////////////////////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 9
c_haarm 1:8b45b3ad350a 10 // Thermocouple pin declarations
c_haarm 8:1326141017ea 11 DigitalOut SCK_1(PTD1); // sck pin of thermocouples
c_haarm 8:1326141017ea 12 DigitalOut CS_1(PTE25); // chip select pin of thermocouples
c_haarm 1:8b45b3ad350a 13
c_haarm 7:9f9ea047975d 14
c_haarm 6:5951403edfd2 15 //DigitalIn pins[12]={D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13}; //thermocouples 1 - 12 select corresponding pin numbers mbed
c_haarm 8:1326141017ea 16 DigitalIn pins[3]={D2, D3, D4}; //thermocouple select corresponding pin numbers mbed
c_haarm 1:8b45b3ad350a 17
c_haarm 1:8b45b3ad350a 18
c_haarm 1:8b45b3ad350a 19 // Torque sensor
c_haarm 0:f7cd934498e4 20 AnalogIn fcs(PTB2); // force sensor output connected to analog 0
c_haarm 0:f7cd934498e4 21
c_haarm 1:8b45b3ad350a 22
c_haarm 1:8b45b3ad350a 23 // LED
c_haarm 0:f7cd934498e4 24 DigitalOut r_led(LED_RED);
c_haarm 0:f7cd934498e4 25 DigitalOut g_led(LED_GREEN);
c_haarm 0:f7cd934498e4 26 DigitalOut b_led(LED_BLUE);
c_haarm 0:f7cd934498e4 27
c_haarm 1:8b45b3ad350a 28 // Serial connection and SD
c_haarm 0:f7cd934498e4 29 MODSERIAL pc(USBTX,USBRX, 1024, 512);
c_haarm 0:f7cd934498e4 30 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
c_haarm 0:f7cd934498e4 31 FILE *fp;
c_haarm 0:f7cd934498e4 32
c_haarm 1:8b45b3ad350a 33 // Other declarations
c_haarm 0:f7cd934498e4 34 Ticker tick;
c_haarm 0:f7cd934498e4 35
c_haarm 0:f7cd934498e4 36 const int baudrate = 115200; // baud rate
c_haarm 8:1326141017ea 37 const float Ts = 0.25; // sample time (sec)
c_haarm 0:f7cd934498e4 38
c_haarm 0:f7cd934498e4 39 const int led_on = 0;
c_haarm 0:f7cd934498e4 40 const int led_off = 1;
c_haarm 0:f7cd934498e4 41
c_haarm 0:f7cd934498e4 42 volatile bool fn1_go = 0; // go-flag starts in disabled state
c_haarm 0:f7cd934498e4 43 volatile bool start = 0;
c_haarm 4:afab0fda2cf4 44 volatile bool meas = 0;
c_haarm 0:f7cd934498e4 45
c_haarm 0:f7cd934498e4 46 float fcs_read;
c_haarm 0:f7cd934498e4 47
c_haarm 0:f7cd934498e4 48 int trial_numb = 0;
c_haarm 0:f7cd934498e4 49 int cal_numb = 1;
c_haarm 0:f7cd934498e4 50
c_haarm 1:8b45b3ad350a 51 char filename_torque[64];
c_haarm 1:8b45b3ad350a 52 char filename_temp[64];
c_haarm 1:8b45b3ad350a 53 char filename_cal[64];
c_haarm 1:8b45b3ad350a 54
c_haarm 0:f7cd934498e4 55
c_haarm 0:f7cd934498e4 56
c_haarm 0:f7cd934498e4 57
c_haarm 0:f7cd934498e4 58 ////////////////////Functions///////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 59 ////////////////////////////////////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 60 ////////////////////////////////////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 61
c_haarm 0:f7cd934498e4 62 void led_control(bool r, bool g, bool b) // control rgb LEDs
c_haarm 0:f7cd934498e4 63 {
c_haarm 0:f7cd934498e4 64 r_led.write(r);
c_haarm 0:f7cd934498e4 65 g_led.write(g);
c_haarm 0:f7cd934498e4 66 b_led.write(b);
c_haarm 0:f7cd934498e4 67 return;
c_haarm 0:f7cd934498e4 68 }
c_haarm 0:f7cd934498e4 69
c_haarm 0:f7cd934498e4 70 void fn1_activate() // function called by ticker every Ts seconds
c_haarm 0:f7cd934498e4 71 {
c_haarm 0:f7cd934498e4 72 fn1_go = 1; // go-flag active
c_haarm 0:f7cd934498e4 73 }
c_haarm 0:f7cd934498e4 74
c_haarm 4:afab0fda2cf4 75
c_haarm 1:8b45b3ad350a 76 void readTC()
c_haarm 1:8b45b3ad350a 77 {
c_haarm 5:f92906aaf1c2 78 //uses MAX31855 chip
c_haarm 5:f92906aaf1c2 79 //see https://datasheets.maximintegrated.com/en/ds/MAX31855.pdf for documentation
c_haarm 5:f92906aaf1c2 80
c_haarm 8:1326141017ea 81
c_haarm 8:1326141017ea 82 float d = 0;
c_haarm 8:1326141017ea 83 int16_t b[3] = {0,0,0};
c_haarm 8:1326141017ea 84
c_haarm 5:f92906aaf1c2 85 CS_1 = 0; //Active-Low Chip Select. Set CS low to enable the serial interface.
c_haarm 8:1326141017ea 86 wait_us(0.2);
c_haarm 8:1326141017ea 87
c_haarm 1:8b45b3ad350a 88 for (int i = 15; i >= 0; i--) {
c_haarm 5:f92906aaf1c2 89 SCK_1 = 0; //set clock value to 0
c_haarm 8:1326141017ea 90 wait_us(0.1); //wait for 100ns
c_haarm 5:f92906aaf1c2 91 SCK_1 = 1; //then set clock high again
c_haarm 8:1326141017ea 92 wait_us(0.1); //wait for 100ns
c_haarm 8:1326141017ea 93 for (int j = 0; j < 3; j++) { //read out bits for each thermocouple (0 to 11)
c_haarm 3:b525b7a56553 94 if (pins[j]) {
c_haarm 5:f92906aaf1c2 95 b[j] |= (1 << i); //bitshift
c_haarm 1:8b45b3ad350a 96 }
c_haarm 1:8b45b3ad350a 97 }
c_haarm 1:8b45b3ad350a 98 }
c_haarm 1:8b45b3ad350a 99
c_haarm 1:8b45b3ad350a 100 CS_1 = 1;
c_haarm 1:8b45b3ad350a 101
c_haarm 8:1326141017ea 102 for (int j = 0; j < 3; j++) { //for every thermocouple (starting from 0 to 11, so 12 in total)
c_haarm 5:f92906aaf1c2 103 if (b[j] & 0x1) { //b[j] contains the bits that are received from every chip. if least significant bit is 1, then open circuit.
c_haarm 1:8b45b3ad350a 104 b[j] = 20000;
c_haarm 1:8b45b3ad350a 105 } else {
c_haarm 5:f92906aaf1c2 106 b[j] &= 0xfffc; //if no fault then select 14 bit thermocouple data from bitstring
c_haarm 7:9f9ea047975d 107 d = b[j] / 16.0;
c_haarm 1:8b45b3ad350a 108 }
c_haarm 8:1326141017ea 109 //fprintf(fp, "%.3f \n\r", d);
c_haarm 8:1326141017ea 110 pc.printf("%.3f\t", d);
c_haarm 1:8b45b3ad350a 111 }
c_haarm 8:1326141017ea 112 pc.printf("\n\r");
c_haarm 6:5951403edfd2 113 //fprintf(fp, "\n\r");
c_haarm 4:afab0fda2cf4 114 return;
c_haarm 1:8b45b3ad350a 115
c_haarm 1:8b45b3ad350a 116 }
c_haarm 0:f7cd934498e4 117
c_haarm 4:afab0fda2cf4 118 void getsample(bool meas)
c_haarm 4:afab0fda2cf4 119 {
c_haarm 4:afab0fda2cf4 120 if(meas){ // alleen data uitlezen en opslaan als meas = 1
c_haarm 4:afab0fda2cf4 121 fcs_read = fcs.read(); // capture torque sensor data
c_haarm 8:1326141017ea 122 //fprintf(fp, "%.3f\t", fcs_read); // output data to file
c_haarm 6:5951403edfd2 123 pc.printf("%.3f\t", fcs_read); // output data to screen
c_haarm 4:afab0fda2cf4 124 readTC(); // call function to read thermocouple data
c_haarm 4:afab0fda2cf4 125 }
c_haarm 4:afab0fda2cf4 126 return;
c_haarm 4:afab0fda2cf4 127 }
c_haarm 4:afab0fda2cf4 128
c_haarm 4:afab0fda2cf4 129
c_haarm 0:f7cd934498e4 130 ////////////////////Main////////////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 131 ////////////////////////////////////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 132 ////////////////////////////////////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 133
c_haarm 0:f7cd934498e4 134 int main()
c_haarm 0:f7cd934498e4 135 {
c_haarm 0:f7cd934498e4 136 pc.baud(baudrate);
c_haarm 0:f7cd934498e4 137 tick.attach(&fn1_activate,Ts);
c_haarm 0:f7cd934498e4 138 led_control(led_off,led_off,led_off); // start with LEDs off
c_haarm 8:1326141017ea 139
c_haarm 0:f7cd934498e4 140 while (1) {
c_haarm 0:f7cd934498e4 141 if(fn1_go) { // statements to execute when go-flag is active
c_haarm 0:f7cd934498e4 142 fn1_go = 0;
c_haarm 4:afab0fda2cf4 143 getsample(meas); // deze functie wordt elke ts seconde aangeroepen. afhankelijk van waarde meas (0 of 1) wordt de data opgeslagen in textfile
c_haarm 0:f7cd934498e4 144 }
c_haarm 0:f7cd934498e4 145
c_haarm 0:f7cd934498e4 146 if(pc.readable()) { // if character available
c_haarm 0:f7cd934498e4 147 switch(pc.getc()) { // read a character from keyboard
c_haarm 0:f7cd934498e4 148 case 'c':
c_haarm 1:8b45b3ad350a 149 led_control(led_on,led_on,led_off); //orange LED during calibration
c_haarm 1:8b45b3ad350a 150 sprintf(filename_cal, "/sd/cal_torque_%d.txt", cal_numb); //construct new textfile
c_haarm 1:8b45b3ad350a 151 fp = fopen(filename_cal, "w");
c_haarm 0:f7cd934498e4 152 if(fp == NULL) {
c_haarm 0:f7cd934498e4 153 error("Could not open file for write\n");
c_haarm 0:f7cd934498e4 154 } else {
c_haarm 0:f7cd934498e4 155 while(1) {
c_haarm 0:f7cd934498e4 156 for (int i = 0; i<50; i++) { //get 50 samples from torque sensor
c_haarm 0:f7cd934498e4 157 fcs_read = fcs.read();
c_haarm 0:f7cd934498e4 158 fprintf(fp, "%.3f\t \n\r", fcs_read); //output values to the screen
c_haarm 0:f7cd934498e4 159 }
c_haarm 0:f7cd934498e4 160 break;
c_haarm 0:f7cd934498e4 161 }
c_haarm 0:f7cd934498e4 162 }
c_haarm 0:f7cd934498e4 163 fclose(fp); //close file
c_haarm 0:f7cd934498e4 164 cal_numb++; //increment calibration number
c_haarm 1:8b45b3ad350a 165 pc.printf("File saved as %s\n\r", filename_cal); //print name of calibration file to screen
c_haarm 0:f7cd934498e4 166 pc.printf("Press 'c' to record new calibration or 't' to start new trial\n\r"); // print message to screen
c_haarm 0:f7cd934498e4 167 break;
c_haarm 0:f7cd934498e4 168 case 't':
c_haarm 0:f7cd934498e4 169 trial_numb++;
c_haarm 0:f7cd934498e4 170 pc.printf("Trial number: %d\n\r", trial_numb);
c_haarm 0:f7cd934498e4 171 pc.printf("Press 's' to start measurement\n\r");
c_haarm 0:f7cd934498e4 172 break;
c_haarm 0:f7cd934498e4 173 case 's':
c_haarm 0:f7cd934498e4 174 start = !start;
c_haarm 0:f7cd934498e4 175 if (start) {
c_haarm 2:5c856ceaea2e 176 led_control(led_off,led_on,led_off); //green LED during measurement
c_haarm 0:f7cd934498e4 177 sprintf(filename_torque, "/sd/trial%d.txt", trial_numb); //construct new textfile to store data from torque sensor
c_haarm 0:f7cd934498e4 178 fp = fopen(filename_torque, "w");
c_haarm 0:f7cd934498e4 179 if(fp == NULL) {
c_haarm 0:f7cd934498e4 180 error("Could not open file for write\n\r");
c_haarm 0:f7cd934498e4 181 } else {
c_haarm 0:f7cd934498e4 182 pc.printf("Measurement started... \n\r");
c_haarm 0:f7cd934498e4 183 pc.printf("Press 's' to stop measurement\n\r");
c_haarm 4:afab0fda2cf4 184 meas = 1; // hiermee zorg je dat de functie getsample de data wegschrijft naar het .txt file
c_haarm 0:f7cd934498e4 185 }
c_haarm 0:f7cd934498e4 186 break;
c_haarm 0:f7cd934498e4 187 } else {
c_haarm 0:f7cd934498e4 188 led_control(led_on,led_off,led_off); // RED LED when ready to stopped measuring
c_haarm 4:afab0fda2cf4 189 meas = 0; // hiermee stop je de output naar het .txt file
c_haarm 0:f7cd934498e4 190 fclose(fp);
c_haarm 0:f7cd934498e4 191 pc.printf("File saved as %s\n\r", filename_torque); // print filename to screen
c_haarm 1:8b45b3ad350a 192 pc.printf("Press 'c' to perform new calibration or 't' to start new trial\n\r"); // print message to screen
c_haarm 0:f7cd934498e4 193
c_haarm 0:f7cd934498e4 194 }
c_haarm 0:f7cd934498e4 195 break;
c_haarm 0:f7cd934498e4 196 }
c_haarm 0:f7cd934498e4 197 }
c_haarm 0:f7cd934498e4 198 }
c_haarm 0:f7cd934498e4 199 }