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
main.cpp@11:599ca9982e45, 2016-03-30 (annotated)
- 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?
User | Revision | Line number | New 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 |