Seth Ruiter / Mbed 2 deprecated bouke

Dependencies:   MODSERIAL SDFileSystemSeth mbed

Fork of Opstellingbachelor_opdracht by Claudia Haarman

Committer:
c_haarm
Date:
Fri Oct 07 15:02:56 2016 +0000
Revision:
5:f92906aaf1c2
Parent:
4:afab0fda2cf4
Child:
6:5951403edfd2
added wait statements after clock (readTC function) to have sufficient time for data to be ready. also added comments in readTC function

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 3:b525b7a56553 11 DigitalOut SCK_1(D0); // sck pin of thermocouples
c_haarm 3:b525b7a56553 12 DigitalOut CS_1(D1); // chip select pin of thermocouples
c_haarm 1:8b45b3ad350a 13
c_haarm 3:b525b7a56553 14 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 1:8b45b3ad350a 15
c_haarm 1:8b45b3ad350a 16 double d;
c_haarm 5:f92906aaf1c2 17 unsigned int b[12] = { };
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 5:f92906aaf1c2 37 const float Ts = 0.01; // 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 5:f92906aaf1c2 81 CS_1 = 0; //Active-Low Chip Select. Set CS low to enable the serial interface.
c_haarm 5:f92906aaf1c2 82 wait_ms(70); //wait 70 ms for chip to be ready
c_haarm 1:8b45b3ad350a 83
c_haarm 1:8b45b3ad350a 84 for (int i = 15; i >= 0; i--) {
c_haarm 5:f92906aaf1c2 85 SCK_1 = 0; //set clock value to 0
c_haarm 5:f92906aaf1c2 86 wait_ms(0.1); //wait for 100ns
c_haarm 5:f92906aaf1c2 87 SCK_1 = 1; //then set clock high again
c_haarm 5:f92906aaf1c2 88 wait_ms(0.1); //wait for 100ns
c_haarm 5:f92906aaf1c2 89 for (int j = 0; j <= 11; j++) { //read out bits for each thermocouple (0 to 11)
c_haarm 3:b525b7a56553 90 if (pins[j]) {
c_haarm 5:f92906aaf1c2 91 b[j] |= (1 << i); //bitshift
c_haarm 1:8b45b3ad350a 92 }
c_haarm 1:8b45b3ad350a 93 }
c_haarm 1:8b45b3ad350a 94 }
c_haarm 1:8b45b3ad350a 95
c_haarm 1:8b45b3ad350a 96 CS_1 = 1;
c_haarm 1:8b45b3ad350a 97
c_haarm 5:f92906aaf1c2 98 for (int j = 0; j <= 11; j++) { //for every thermocouple (starting from 0 to 11, so 12 in total)
c_haarm 5:f92906aaf1c2 99 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 100 b[j] = 20000;
c_haarm 1:8b45b3ad350a 101 } else {
c_haarm 5:f92906aaf1c2 102 b[j] &= 0xfffc; //if no fault then select 14 bit thermocouple data from bitstring
c_haarm 1:8b45b3ad350a 103 d = b[j] / 16.0 * 100.0;
c_haarm 1:8b45b3ad350a 104 b[j] = d;
c_haarm 1:8b45b3ad350a 105 }
c_haarm 3:b525b7a56553 106 fprintf(fp, "%.3d\t", b[j]);
c_haarm 1:8b45b3ad350a 107 }
c_haarm 1:8b45b3ad350a 108 fprintf(fp, "\n\r");
c_haarm 4:afab0fda2cf4 109 return;
c_haarm 1:8b45b3ad350a 110
c_haarm 1:8b45b3ad350a 111 }
c_haarm 0:f7cd934498e4 112
c_haarm 4:afab0fda2cf4 113 void getsample(bool meas)
c_haarm 4:afab0fda2cf4 114 {
c_haarm 4:afab0fda2cf4 115 if(meas){ // alleen data uitlezen en opslaan als meas = 1
c_haarm 4:afab0fda2cf4 116 fcs_read = fcs.read(); // capture torque sensor data
c_haarm 4:afab0fda2cf4 117 fprintf(fp, "%.3f\t", fcs_read); // output data to file
c_haarm 4:afab0fda2cf4 118 readTC(); // call function to read thermocouple data
c_haarm 4:afab0fda2cf4 119 }
c_haarm 4:afab0fda2cf4 120 return;
c_haarm 4:afab0fda2cf4 121 }
c_haarm 4:afab0fda2cf4 122
c_haarm 4:afab0fda2cf4 123
c_haarm 0:f7cd934498e4 124 ////////////////////Main////////////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 125 ////////////////////////////////////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 126 ////////////////////////////////////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 127
c_haarm 0:f7cd934498e4 128 int main()
c_haarm 0:f7cd934498e4 129 {
c_haarm 0:f7cd934498e4 130 pc.baud(baudrate);
c_haarm 0:f7cd934498e4 131 tick.attach(&fn1_activate,Ts);
c_haarm 0:f7cd934498e4 132 led_control(led_off,led_off,led_off); // start with LEDs off
c_haarm 0:f7cd934498e4 133
c_haarm 0:f7cd934498e4 134 while (1) {
c_haarm 0:f7cd934498e4 135 if(fn1_go) { // statements to execute when go-flag is active
c_haarm 0:f7cd934498e4 136 fn1_go = 0;
c_haarm 4:afab0fda2cf4 137 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 138 }
c_haarm 0:f7cd934498e4 139
c_haarm 0:f7cd934498e4 140 if(pc.readable()) { // if character available
c_haarm 0:f7cd934498e4 141 switch(pc.getc()) { // read a character from keyboard
c_haarm 0:f7cd934498e4 142 case 'c':
c_haarm 1:8b45b3ad350a 143 led_control(led_on,led_on,led_off); //orange LED during calibration
c_haarm 1:8b45b3ad350a 144 sprintf(filename_cal, "/sd/cal_torque_%d.txt", cal_numb); //construct new textfile
c_haarm 1:8b45b3ad350a 145 fp = fopen(filename_cal, "w");
c_haarm 0:f7cd934498e4 146 if(fp == NULL) {
c_haarm 0:f7cd934498e4 147 error("Could not open file for write\n");
c_haarm 0:f7cd934498e4 148 } else {
c_haarm 0:f7cd934498e4 149 while(1) {
c_haarm 0:f7cd934498e4 150 for (int i = 0; i<50; i++) { //get 50 samples from torque sensor
c_haarm 0:f7cd934498e4 151 fcs_read = fcs.read();
c_haarm 0:f7cd934498e4 152 fprintf(fp, "%.3f\t \n\r", fcs_read); //output values to the screen
c_haarm 0:f7cd934498e4 153 }
c_haarm 0:f7cd934498e4 154 break;
c_haarm 0:f7cd934498e4 155 }
c_haarm 0:f7cd934498e4 156 }
c_haarm 0:f7cd934498e4 157 fclose(fp); //close file
c_haarm 0:f7cd934498e4 158 cal_numb++; //increment calibration number
c_haarm 1:8b45b3ad350a 159 pc.printf("File saved as %s\n\r", filename_cal); //print name of calibration file to screen
c_haarm 0:f7cd934498e4 160 pc.printf("Press 'c' to record new calibration or 't' to start new trial\n\r"); // print message to screen
c_haarm 0:f7cd934498e4 161 break;
c_haarm 0:f7cd934498e4 162 case 't':
c_haarm 0:f7cd934498e4 163 trial_numb++;
c_haarm 0:f7cd934498e4 164 pc.printf("Trial number: %d\n\r", trial_numb);
c_haarm 0:f7cd934498e4 165 pc.printf("Press 's' to start measurement\n\r");
c_haarm 0:f7cd934498e4 166 break;
c_haarm 0:f7cd934498e4 167 case 's':
c_haarm 0:f7cd934498e4 168 start = !start;
c_haarm 0:f7cd934498e4 169 if (start) {
c_haarm 2:5c856ceaea2e 170 led_control(led_off,led_on,led_off); //green LED during measurement
c_haarm 0:f7cd934498e4 171 sprintf(filename_torque, "/sd/trial%d.txt", trial_numb); //construct new textfile to store data from torque sensor
c_haarm 0:f7cd934498e4 172 fp = fopen(filename_torque, "w");
c_haarm 0:f7cd934498e4 173 if(fp == NULL) {
c_haarm 0:f7cd934498e4 174 error("Could not open file for write\n\r");
c_haarm 0:f7cd934498e4 175 } else {
c_haarm 0:f7cd934498e4 176 pc.printf("Measurement started... \n\r");
c_haarm 0:f7cd934498e4 177 pc.printf("Press 's' to stop measurement\n\r");
c_haarm 4:afab0fda2cf4 178 meas = 1; // hiermee zorg je dat de functie getsample de data wegschrijft naar het .txt file
c_haarm 0:f7cd934498e4 179 }
c_haarm 0:f7cd934498e4 180 break;
c_haarm 0:f7cd934498e4 181 } else {
c_haarm 0:f7cd934498e4 182 led_control(led_on,led_off,led_off); // RED LED when ready to stopped measuring
c_haarm 4:afab0fda2cf4 183 meas = 0; // hiermee stop je de output naar het .txt file
c_haarm 0:f7cd934498e4 184 fclose(fp);
c_haarm 0:f7cd934498e4 185 pc.printf("File saved as %s\n\r", filename_torque); // print filename to screen
c_haarm 1:8b45b3ad350a 186 pc.printf("Press 'c' to perform new calibration or 't' to start new trial\n\r"); // print message to screen
c_haarm 0:f7cd934498e4 187
c_haarm 0:f7cd934498e4 188 }
c_haarm 0:f7cd934498e4 189 break;
c_haarm 0:f7cd934498e4 190 }
c_haarm 0:f7cd934498e4 191 }
c_haarm 0:f7cd934498e4 192 }
c_haarm 0:f7cd934498e4 193 }