Seth Ruiter / Mbed 2 deprecated bouke

Dependencies:   MODSERIAL SDFileSystemSeth mbed

Fork of Opstellingbachelor_opdracht by Claudia Haarman

Committer:
c_haarm
Date:
Mon Oct 10 11:06:35 2016 +0000
Revision:
6:5951403edfd2
Parent:
5:f92906aaf1c2
Child:
7:9f9ea047975d
1 tc sensor, output torque and tc to screen

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