Communication with LDC1101. Working version, ready for extensive calibration tests for resolution, linearity, etc.

Dependencies:   Bob DS1825 LDC1101 SDFileSystem mbed

Fork of Inductive_Sensor by Bob Giesberts

Committer:
bobgiesberts
Date:
Wed Mar 30 12:01:01 2016 +0000
Revision:
11:599ca9982e45
Parent:
10:3cab80866536
Child:
12:cceece4f3afb
Added comments

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bobgiesberts 2:1a203732fc95 1 /**
bobgiesberts 2:1a203732fc95 2 * @file main.cpp
bobgiesberts 2:1a203732fc95 3 * @brief This file programs the processor for the inductive force sensor
bobgiesberts 2:1a203732fc95 4 * using the library LDC1101.h and LDC1101.cpp.
bobgiesberts 2:1a203732fc95 5 * - Red Led: processing communication with LDC1101
bobgiesberts 2:1a203732fc95 6 * - Green Led: processing SD card
bobgiesberts 10:3cab80866536 7 *
bobgiesberts 4:ae441c5727b9 8 * Log protocol:
bobgiesberts 4:ae441c5727b9 9 * - 1 minute at 20 Hz
bobgiesberts 4:ae441c5727b9 10 * - 29 minutes rest
bobgiesberts 2:1a203732fc95 11 *
bobgiesberts 2:1a203732fc95 12 * @author Bob Giesberts
bobgiesberts 2:1a203732fc95 13 *
bobgiesberts 2:1a203732fc95 14 * @date 2015-12-17
bobgiesberts 2:1a203732fc95 15 */
bobgiesberts 10:3cab80866536 16 #include "mbed.h"
bobgiesberts 11:599ca9982e45 17 #include "LDC1101.h" // inductive force sensor
bobgiesberts 11:599ca9982e45 18 #include "SDFileSystem.h" // control the SD card
bobgiesberts 11:599ca9982e45 19 #include "Bob.h" // processorboard
bobgiesberts 11:599ca9982e45 20 #include "DS1825.h" // thermometer
bobgiesberts 10:3cab80866536 21
bobgiesberts 10:3cab80866536 22 #include <iostream>
bobgiesberts 10:3cab80866536 23 #include <vector>
bobgiesberts 10:3cab80866536 24 #include <string>
bobgiesberts 10:3cab80866536 25 using namespace std;
bobgiesberts 10:3cab80866536 26
bobgiesberts 5:736a81a59f3c 27 // SETTINGS
bobgiesberts 6:ff39d60061ca 28 bool DEBUG = false;
bobgiesberts 6:ff39d60061ca 29 float C = 120E-12; // pF
bobgiesberts 11:599ca9982e45 30 uint16_t INTERVAL_FIRST = 600; // 5 sec
bobgiesberts 11:599ca9982e45 31 uint16_t INTERVAL_OFF = 870; // 1770 = 29*60+30 sec
bobgiesberts 11:599ca9982e45 32 uint16_t INTERVAL_ON = 30; // 30 = 30 sec
bobgiesberts 0:e81b68888268 33
bobgiesberts 5:736a81a59f3c 34 // load libraries
bobgiesberts 5:736a81a59f3c 35 Bob bob(PTB0, PTB1, PTC3, PTE0, PTC2, PTE30); // red led, green led, sd_enable, sd_present, batt, 3V3_DET
bobgiesberts 5:736a81a59f3c 36 Serial pc(USBTX, USBRX);
bobgiesberts 4:ae441c5727b9 37
bobgiesberts 4:ae441c5727b9 38 // timer variables
bobgiesberts 6:ff39d60061ca 39 uint32_t now = 0, next = 0, prev = 0;
bobgiesberts 8:8cc1960467ae 40 uint8_t t_high = 0;
bobgiesberts 11:599ca9982e45 41 uint32_t t_lost = 0, lost_prev = 0;
bobgiesberts 8:8cc1960467ae 42 uint8_t lost_high = 0;
bobgiesberts 11:599ca9982e45 43 uint32_t t_sleep = 0;
bobgiesberts 4:ae441c5727b9 44
bobgiesberts 4:ae441c5727b9 45 // file variables
bobgiesberts 4:ae441c5727b9 46 FILE *fp;
bobgiesberts 4:ae441c5727b9 47 string filename = "/sd/data00.txt";
bobgiesberts 4:ae441c5727b9 48 const char *fn;
bobgiesberts 4:ae441c5727b9 49
bobgiesberts 11:599ca9982e45 50 // temperature variables
bobgiesberts 11:599ca9982e45 51 PinName _Tpin = PTB1; // Thermometer is connected to the original pin for the RED / GREEN LED
bobgiesberts 11:599ca9982e45 52 uint8_t Tdata[9];
bobgiesberts 11:599ca9982e45 53 int16_t T_bin;
bobgiesberts 11:599ca9982e45 54 float T;
bobgiesberts 11:599ca9982e45 55
bobgiesberts 5:736a81a59f3c 56 // temporal storage for data samples
bobgiesberts 11:599ca9982e45 57 const uint8_t package_size = 16; // Write is per 512 bits: 16 * 32 = 512
bobgiesberts 11:599ca9982e45 58 uint32_t tarray[package_size];
bobgiesberts 11:599ca9982e45 59 uint32_t t;
bobgiesberts 11:599ca9982e45 60 uint32_t Larray[package_size];
bobgiesberts 5:736a81a59f3c 61 float batt;
bobgiesberts 5:736a81a59f3c 62
bobgiesberts 10:3cab80866536 63 int main(void)
bobgiesberts 10:3cab80866536 64 {
bobgiesberts 11:599ca9982e45 65 if( DEBUG )
bobgiesberts 11:599ca9982e45 66 {
bobgiesberts 7:6c4cac1ec122 67 LDC1101 *ldc = new LDC1101(PTC6, PTC7, PTC5, PTC4, C, 16E6);
bobgiesberts 11:599ca9982e45 68 DS1825 *thermometer = new DS1825( _Tpin );
bobgiesberts 8:8cc1960467ae 69 wait(1);
bobgiesberts 11:599ca9982e45 70 while(1)
bobgiesberts 11:599ca9982e45 71 {
bobgiesberts 10:3cab80866536 72 while( !ldc->is_New_LHR_data() ) { } // wait until data is ready
bobgiesberts 7:6c4cac1ec122 73
bobgiesberts 11:599ca9982e45 74 // T = thermometer->getTemperature();
bobgiesberts 11:599ca9982e45 75 pc.printf( "%d", ldc->get_LHR_Data() );
bobgiesberts 8:8cc1960467ae 76 //pc.printf( "%.3f MHz", ldc->get_fsensor()/1000000 );
bobgiesberts 8:8cc1960467ae 77 pc.printf( "\r\n" );
bobgiesberts 10:3cab80866536 78 wait( 1 ); // 20 Hz
bobgiesberts 7:6c4cac1ec122 79 }
bobgiesberts 7:6c4cac1ec122 80 }
bobgiesberts 7:6c4cac1ec122 81
bobgiesberts 11:599ca9982e45 82 // Provide some feedback, is it working?
bobgiesberts 11:599ca9982e45 83 //bob.flash(2);
bobgiesberts 7:6c4cac1ec122 84
bobgiesberts 6:ff39d60061ca 85 // Load SD File system
bobgiesberts 11:599ca9982e45 86 bob.wakeup();
bobgiesberts 6:ff39d60061ca 87 SDFileSystem *sd = new SDFileSystem(PTD6, PTD7, PTD5, PTD4, "sd");
bobgiesberts 10:3cab80866536 88
bobgiesberts 6:ff39d60061ca 89 // Create a new data file (data00.txt)
bobgiesberts 10:3cab80866536 90 mkdir("/sd", 0777);
bobgiesberts 11:599ca9982e45 91 for(uint8_t i = 0; i < 100; i++)
bobgiesberts 11:599ca9982e45 92 {
bobgiesberts 6:ff39d60061ca 93 filename[8] = i/10 + '0';
bobgiesberts 4:ae441c5727b9 94 filename[9] = i%10 + '0';
bobgiesberts 4:ae441c5727b9 95 fp = fopen( filename.c_str() , "r" );
bobgiesberts 11:599ca9982e45 96 if( fp == NULL ) // read failed so file does not exist
bobgiesberts 11:599ca9982e45 97 {
bobgiesberts 4:ae441c5727b9 98 fp = fopen( filename.c_str(), "w" ); // create it
bobgiesberts 11:599ca9982e45 99 if( fp != NULL )
bobgiesberts 11:599ca9982e45 100 {
bobgiesberts 4:ae441c5727b9 101 fn = filename.c_str();
bobgiesberts 6:ff39d60061ca 102 fclose( fp );
bobgiesberts 4:ae441c5727b9 103 break;
bobgiesberts 10:3cab80866536 104 } else {
bobgiesberts 6:ff39d60061ca 105 bob.red();
bobgiesberts 4:ae441c5727b9 106 }
bobgiesberts 10:3cab80866536 107 } else { // file already exists
bobgiesberts 4:ae441c5727b9 108 fclose( fp );
bobgiesberts 4:ae441c5727b9 109 }
bobgiesberts 1:22c272515015 110 }
bobgiesberts 11:599ca9982e45 111 if( fp == NULL )
bobgiesberts 11:599ca9982e45 112 {
bobgiesberts 11:599ca9982e45 113 pc.printf( "/sd/data00.txt t/m /sd/data99.txt already exist!\n" );
bobgiesberts 11:599ca9982e45 114 }
bobgiesberts 10:3cab80866536 115
bobgiesberts 6:ff39d60061ca 116 // Unload SD File system
bobgiesberts 10:3cab80866536 117 delete sd;
bobgiesberts 10:3cab80866536 118 sd = NULL;
bobgiesberts 5:736a81a59f3c 119
bobgiesberts 5:736a81a59f3c 120
bobgiesberts 5:736a81a59f3c 121
bobgiesberts 11:599ca9982e45 122 while(1)
bobgiesberts 11:599ca9982e45 123 {
bobgiesberts 11:599ca9982e45 124 // Wakeup: SD + LDC1101 on
bobgiesberts 11:599ca9982e45 125 bob.wakeup();
bobgiesberts 10:3cab80866536 126
bobgiesberts 11:599ca9982e45 127 // what time is it now?
bobgiesberts 8:8cc1960467ae 128 prev = now; // 0 -> 429 496 --> (4 294,96 s) (71 min)
bobgiesberts 8:8cc1960467ae 129 now = (uint32_t) clock(); // 0 -> 429 496 --> (4 294,96 s) (71 min)
bobgiesberts 11:599ca9982e45 130 if( now < prev )
bobgiesberts 11:599ca9982e45 131 t_high++; // 0 -> 255 --> (255*4 294,96 s) (12 days)
bobgiesberts 11:599ca9982e45 132 t = now + 429496.7296*t_high + t_lost + 429496.7296*lost_high; // 0 -> 219 901 952 --> (2 199 019,52 s) (25 days)
bobgiesberts 11:599ca9982e45 133
bobgiesberts 11:599ca9982e45 134 // load libraries to take control over the communication
bobgiesberts 11:599ca9982e45 135 LDC1101 *ldc = new LDC1101(PTC6, PTC7, PTC5, PTC4, C, 16E6); // load sensor (LDC1101) library (this takes 0.81 s)
bobgiesberts 11:599ca9982e45 136 DS1825 *thermometer = new DS1825( _Tpin ); // load thermometer (DS1825) library
bobgiesberts 11:599ca9982e45 137 SDFileSystem *sd = new SDFileSystem(PTD6, PTD7, PTD5, PTD4, "sd"); // load SD system on
bobgiesberts 11:599ca9982e45 138 mkdir("/sd", 0777); // select folder
bobgiesberts 10:3cab80866536 139
bobgiesberts 8:8cc1960467ae 140 // first time take a comfortably long period
bobgiesberts 11:599ca9982e45 141 if( next == 0 )
bobgiesberts 11:599ca9982e45 142 {
bobgiesberts 11:599ca9982e45 143 next = t + INTERVAL_FIRST*100;
bobgiesberts 10:3cab80866536 144 } else {
bobgiesberts 11:599ca9982e45 145 next = t + INTERVAL_ON*100; // 0 -> 219 904 952 --> (2 199 049,52 s) (25 days)
bobgiesberts 8:8cc1960467ae 146 }
bobgiesberts 10:3cab80866536 147
bobgiesberts 6:ff39d60061ca 148 // Take samples for INTERVAL_ON seconds
bobgiesberts 11:599ca9982e45 149 while( t < next )
bobgiesberts 11:599ca9982e45 150 {
bobgiesberts 11:599ca9982e45 151
bobgiesberts 11:599ca9982e45 152 // Collect a package of data points
bobgiesberts 11:599ca9982e45 153 int i = 0;
bobgiesberts 11:599ca9982e45 154 while( i < package_size )
bobgiesberts 11:599ca9982e45 155 {
bobgiesberts 6:ff39d60061ca 156 // wait for new data to be ready
bobgiesberts 7:6c4cac1ec122 157 while( !ldc->is_New_LHR_data() ) { }
bobgiesberts 10:3cab80866536 158
bobgiesberts 11:599ca9982e45 159 // what time is it now?
bobgiesberts 11:599ca9982e45 160 prev = now;
bobgiesberts 11:599ca9982e45 161 now = (uint32_t) clock();
bobgiesberts 11:599ca9982e45 162 if( now < prev )
bobgiesberts 11:599ca9982e45 163 t_high++;
bobgiesberts 11:599ca9982e45 164 t = now + 429496.7296*t_high + t_lost + 429496.7296*lost_high;
bobgiesberts 10:3cab80866536 165
bobgiesberts 11:599ca9982e45 166 if( !ldc->is_Oscillation_Error() ) // sensor not overloaded, this happends when the target is too close to the coil
bobgiesberts 11:599ca9982e45 167 {
bobgiesberts 8:8cc1960467ae 168 // Store data in temporal memory
bobgiesberts 11:599ca9982e45 169 tarray[i] = t;
bobgiesberts 11:599ca9982e45 170 Larray[i] = ldc->get_LHR_Data();
bobgiesberts 11:599ca9982e45 171 i++;
bobgiesberts 6:ff39d60061ca 172 }
bobgiesberts 6:ff39d60061ca 173 }
bobgiesberts 11:599ca9982e45 174
bobgiesberts 11:599ca9982e45 175 // get battery level
bobgiesberts 11:599ca9982e45 176 batt = bob.battery();
bobgiesberts 11:599ca9982e45 177
bobgiesberts 11:599ca9982e45 178 // get temperature
bobgiesberts 11:599ca9982e45 179 T = thermometer->getTemperature();
bobgiesberts 10:3cab80866536 180
bobgiesberts 11:599ca9982e45 181 // Store the package of data points
bobgiesberts 11:599ca9982e45 182 // TODO: create a queue with all the data (t, L, Vbatt, T) --> (Queue<data> queue)
bobgiesberts 11:599ca9982e45 183 // TODO: process this data in packages of 16 in a seperate Thread --> (RTOS?)
bobgiesberts 11:599ca9982e45 184 bob.red();
bobgiesberts 11:599ca9982e45 185 fp = fopen( fn, "a" ); // open file (append)
bobgiesberts 11:599ca9982e45 186 for( int i = 0; i < package_size; i++ )
bobgiesberts 11:599ca9982e45 187 fprintf( fp, "%.2f;%d;%.4f;%.4f\r\n", (float) tarray[i]/100.0, Larray[i], batt, T ); // write to file
bobgiesberts 11:599ca9982e45 188 fclose( fp ); // close file
bobgiesberts 11:599ca9982e45 189 bob.redoff();
bobgiesberts 10:3cab80866536 190
bobgiesberts 11:599ca9982e45 191
bobgiesberts 11:599ca9982e45 192
bobgiesberts 11:599ca9982e45 193 // Print to PC for debugging
bobgiesberts 11:599ca9982e45 194 pc.printf( "%.2f;%d;%.4f;%.4f\r\n", (float) tarray[0]/100.0, Larray[0], batt, T ); // write to console
bobgiesberts 11:599ca9982e45 195
bobgiesberts 11:599ca9982e45 196 // Reset data
bobgiesberts 11:599ca9982e45 197 memset(tarray, 0, package_size);
bobgiesberts 11:599ca9982e45 198 memset(Larray, 0, package_size);
bobgiesberts 10:3cab80866536 199
bobgiesberts 11:599ca9982e45 200 // if the battery is almost empty (Vbatt < 3.10 V), the termometer stops
bobgiesberts 11:599ca9982e45 201 // working well and L can not be corrected. So just shut down
bobgiesberts 11:599ca9982e45 202 if( batt < 3.10f )
bobgiesberts 11:599ca9982e45 203 {
bobgiesberts 11:599ca9982e45 204 bob.red();
bobgiesberts 11:599ca9982e45 205 exit(0);
bobgiesberts 11:599ca9982e45 206 }
bobgiesberts 11:599ca9982e45 207
bobgiesberts 10:3cab80866536 208 }
bobgiesberts 10:3cab80866536 209
bobgiesberts 11:599ca9982e45 210 // prepare for sleep, power down the SD and the LDC1101
bobgiesberts 11:599ca9982e45 211 delete sd; sd = NULL;
bobgiesberts 11:599ca9982e45 212 delete ldc; ldc = NULL;
bobgiesberts 11:599ca9982e45 213 delete thermometer; thermometer = NULL;
bobgiesberts 11:599ca9982e45 214 bob.greenoff(); // in current system the thermometer is connected to the old green led. Turning it off might power it down? Well 1,1V remains. So this doesn't work as expected
bobgiesberts 11:599ca9982e45 215 bob.beforesleep();
bobgiesberts 10:3cab80866536 216
bobgiesberts 11:599ca9982e45 217 // what time is it now?
bobgiesberts 11:599ca9982e45 218 prev = now;
bobgiesberts 11:599ca9982e45 219 now = (uint32_t) clock();
bobgiesberts 11:599ca9982e45 220 if( now < prev )
bobgiesberts 11:599ca9982e45 221 t_high++;
bobgiesberts 11:599ca9982e45 222 t = now + 429496.7296*t_high + t_lost + 429496.7296*lost_high;
bobgiesberts 10:3cab80866536 223
bobgiesberts 8:8cc1960467ae 224 // Calculate sleeping time (correction to INTERVAL_OFF)
bobgiesberts 11:599ca9982e45 225 // S has passed the limit of next. Those few ms should be substracted from INTERVAL_OFF.
bobgiesberts 11:599ca9982e45 226 t_sleep = INTERVAL_OFF*100 - (t - next);
bobgiesberts 8:8cc1960467ae 227
bobgiesberts 6:ff39d60061ca 228 // Add lost time to the counter
bobgiesberts 11:599ca9982e45 229 lost_prev = t_lost;
bobgiesberts 11:599ca9982e45 230 t_lost += t_sleep;
bobgiesberts 11:599ca9982e45 231 if( t_lost < lost_prev )
bobgiesberts 11:599ca9982e45 232 lost_high++;
bobgiesberts 10:3cab80866536 233
bobgiesberts 11:599ca9982e45 234 // Sleep now (ms), enter low power mode
bobgiesberts 11:599ca9982e45 235 bob.sleep( t_sleep * 10 );
bobgiesberts 10:3cab80866536 236
bobgiesberts 0:e81b68888268 237 }
bobgiesberts 6:ff39d60061ca 238
bobgiesberts 10:3cab80866536 239 }
bobgiesberts 11:599ca9982e45 240
bobgiesberts 11:599ca9982e45 241
bobgiesberts 11:599ca9982e45 242