Data logger version to log at multiple rates on a single sensor set

Dependencies:   SDFileSystemVSG mbed

Fork of VSG_DataLogger1 by PNI

Committer:
jtrojan
Date:
Sat Sep 01 00:09:59 2018 +0000
Revision:
13:ce9dcd6d316b
Parent:
12:bdb601ce5dfd
changing data rate in timeout

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JoeMiller 2:d2c2e2d3f1e5 1 // VSG Board 18-axes mag Datalogger prototype
JoeMiller 2:d2c2e2d3f1e5 2 // install debug jumper for console output only
JoeMiller 2:d2c2e2d3f1e5 3 // remove debug jumper to log data to SDcard only
JoeMiller 2:d2c2e2d3f1e5 4
JoeMiller 2:d2c2e2d3f1e5 5 // set system parameters -------------------------
jtrojan 11:efe5c4d6af1e 6 #define SAMPLE_RATE (2) //Hz
jtrojan 11:efe5c4d6af1e 7 #define SAMPLE_RATE_HIGH (180) //Hz
jtrojan 4:ea7c4356f84c 8 #define TMRC_VLOW (0x99) // TMRC hex value corresponding to reading/rate
jtrojan 5:e4b1de08bb87 9 #define TMRC_VHIGH (0x93) // TMRC hex value corresponding to reading/rate
jtrojan 7:f655a9ef12e5 10 #define SAMPLE_PERIOD (30) // seconds
jtrojan 4:ea7c4356f84c 11 #define SAMPLE_DELAY (5) // seconds -to allow time to seal unit and place in the field
jtrojan 12:bdb601ce5dfd 12 #define CYCLE_COUNT (50)
jtrojan 6:bd675690d831 13 #define PRINT_ALL (0) //define whether to print all data at the end or line by line during
jtrojan 7:f655a9ef12e5 14 #define N_REPEAT_LOW (1) //number of times to repeat sample the low speed
jtrojan 11:efe5c4d6af1e 15 #define N_REPEAT_HIGH (2) //number of times to repeat sample the high speed
jtrojan 10:709d8eef81fd 16 #define PW_REGISTER (0x60) //password register location
jtrojan 8:9304b2c411e4 17 #define PW (0x39) //password to unlock rm3100 rate fine adjustment registers
jtrojan 10:709d8eef81fd 18 #define OSC_ADJ_REG (0x64) //oscillaor adjustment register
JoeMiller 2:d2c2e2d3f1e5 19 //------------------------------------------------
JoeMiller 2:d2c2e2d3f1e5 20
JoeMiller 2:d2c2e2d3f1e5 21
mbed_official 0:bdbd3d6fc5d5 22 #include "mbed.h"
mbed_official 0:bdbd3d6fc5d5 23 #include "SDFileSystem.h"
JoeMiller 2:d2c2e2d3f1e5 24 // NOTICE: SDFileSystem.cpp was modified. See //JM comments
JoeMiller 2:d2c2e2d3f1e5 25 #include "main.h"
jtrojan 10:709d8eef81fd 26
JoeMiller 2:d2c2e2d3f1e5 27 #define SAMPLE_INTERVAL (1.0/SAMPLE_RATE)
jtrojan 11:efe5c4d6af1e 28 #define SAMPLE_INTERVAL_FAST (1.0/SAMPLE_RATE_HIGH)
jtrojan 11:efe5c4d6af1e 29 #define MAX_COUNT (SAMPLE_PERIOD * SAMPLE_RATE * (N_REPEAT_HIGH+N_REPEAT_LOW) )
JoeMiller 2:d2c2e2d3f1e5 30 #define MCC ((CYCLE_COUNT >> 8) & 0xff)
JoeMiller 2:d2c2e2d3f1e5 31 #define LCC (CYCLE_COUNT & 0xff)
JoeMiller 2:d2c2e2d3f1e5 32 #define MAX_MAG_VALUE (8388608) // positive 23 bits
JoeMiller 2:d2c2e2d3f1e5 33 #define NEGATIVE_ADJUST (MAX_MAG_VALUE + MAX_MAG_VALUE) //signed 24 bits
jtrojan 6:bd675690d831 34 #define MAG_SCALE ((int)(0.3671*(float)(CYCLE_COUNT)+1.5)) //calculation to get out uT
JoeMiller 2:d2c2e2d3f1e5 35
JoeMiller 2:d2c2e2d3f1e5 36 // resource assignments
JoeMiller 2:d2c2e2d3f1e5 37 DigitalIn rdy1a(DRDY1A);
JoeMiller 2:d2c2e2d3f1e5 38 DigitalIn rdy1b(DRDY1B);
JoeMiller 2:d2c2e2d3f1e5 39 DigitalIn rdy1c(DRDY1C);
JoeMiller 2:d2c2e2d3f1e5 40 DigitalIn rdy2a(DRDY2A);
JoeMiller 2:d2c2e2d3f1e5 41 DigitalIn rdy2b(DRDY2B);
JoeMiller 2:d2c2e2d3f1e5 42 DigitalIn rdy2c(DRDY2C);
jtrojan 12:bdb601ce5dfd 43 DigitalOut debugPin(DEBUG_MODE);
JoeMiller 2:d2c2e2d3f1e5 44
JoeMiller 2:d2c2e2d3f1e5 45 DigitalOut sel1a(SSM1A);
JoeMiller 2:d2c2e2d3f1e5 46 DigitalOut sel1b(SSM1B);
JoeMiller 2:d2c2e2d3f1e5 47 DigitalOut sel1c(SSM1C);
JoeMiller 2:d2c2e2d3f1e5 48 DigitalOut sel2a(SSM2A);
JoeMiller 2:d2c2e2d3f1e5 49 DigitalOut sel2b(SSM2B);
JoeMiller 2:d2c2e2d3f1e5 50 DigitalOut sel2c(SSM2C);
JoeMiller 2:d2c2e2d3f1e5 51
JoeMiller 2:d2c2e2d3f1e5 52 DigitalOut LED(DEBUG_LED);
jtrojan 4:ea7c4356f84c 53
jtrojan 4:ea7c4356f84c 54 // sample code from mbed nucleo library
jtrojan 10:709d8eef81fd 55 //mbed Declaration left here as example
jtrojan 4:ea7c4356f84c 56 AnalogIn analog_value(A0);
jtrojan 4:ea7c4356f84c 57 DigitalOut selt(LED1);
jtrojan 4:ea7c4356f84c 58 //ST HAL For ADC since we want to access the internal channels
jtrojan 4:ea7c4356f84c 59 ADC_HandleTypeDef hadc1;
jtrojan 10:709d8eef81fd 60
JoeMiller 2:d2c2e2d3f1e5 61 SPI mag(SPI_MOSI, SPI_MISO, SPI_SCK);
JoeMiller 2:d2c2e2d3f1e5 62 SDFileSystem sd(SD_MOSI, SD_MISO, SD_SCK, SD_CSN, "sd"); // the pinout on the mbed Cool Components workshop board
JoeMiller 2:d2c2e2d3f1e5 63 Serial console(PA_2, PA_3,115200); // debug port
jtrojan 13:ce9dcd6d316b 64 Timeout magTimer;
jtrojan 4:ea7c4356f84c 65 Timer t;
jtrojan 10:709d8eef81fd 66
jtrojan 10:709d8eef81fd 67 //-------------------- Variable speed settings------------------------
jtrojan 8:9304b2c411e4 68 int nspeeds = 5;
jtrojan 12:bdb601ce5dfd 69 /*const char v_low[]= { 0x9a, 0x9a, 0x9a, 0x9a, 0x9a };
jtrojan 11:efe5c4d6af1e 70 const char v_high[]= { 0x93, 0x93, 0x93, 0x93, 0x93 };
jtrojan 9:3e9245dc54e4 71 const char srsettings_low[] = {0x04, 0x05, 0x06, 0x07, 0x08};
jtrojan 12:bdb601ce5dfd 72 const char srsettings_high[] = {0x01, 0x01, 0x01, 0x01, 0x01};*/
jtrojan 12:bdb601ce5dfd 73 const float magdt_low[] = { 0.5556, 0.5263, 0.5, 0.4762, 0.4545 };
jtrojan 12:bdb601ce5dfd 74 const float magdt_high[] = { 0.0056, 0.0056, 0.0056, 0.0056, 0.0056};
jtrojan 12:bdb601ce5dfd 75 const int mag_cc[] = {50, 50, 50, 50, 50};
jtrojan 10:709d8eef81fd 76 //const float rates_low[] = {3.4, 3.7, 4.0, 4.2, 4.5};
jtrojan 10:709d8eef81fd 77 //const float rates_high[] = {185, 195, 203, 220, 237};
jtrojan 8:9304b2c411e4 78 //--------------------------------------------------------------------
JoeMiller 2:d2c2e2d3f1e5 79
JoeMiller 2:d2c2e2d3f1e5 80 char takeAsample_F;
jtrojan 13:ce9dcd6d316b 81 int ncnt = 1;
jtrojan 13:ce9dcd6d316b 82 int magdt_n = 0;
JoeMiller 2:d2c2e2d3f1e5 83
jtrojan 10:709d8eef81fd 84 void sampletimer()
jtrojan 10:709d8eef81fd 85 {
jtrojan 13:ce9dcd6d316b 86 if (ncnt < N_REPEAT_LOW) {
jtrojan 13:ce9dcd6d316b 87 magTimer.attach(&sampletimer,magdt_low[magdt_n]);
jtrojan 13:ce9dcd6d316b 88 }
jtrojan 13:ce9dcd6d316b 89
jtrojan 13:ce9dcd6d316b 90 if (ncnt >= N_REPEAT_LOW) {
jtrojan 13:ce9dcd6d316b 91 magTimer.attach(&sampletimer,magdt_high[magdt_n]);
jtrojan 13:ce9dcd6d316b 92 }
jtrojan 13:ce9dcd6d316b 93
jtrojan 13:ce9dcd6d316b 94 ncnt++;
jtrojan 13:ce9dcd6d316b 95 if (ncnt >= N_REPEAT_LOW+N_REPEAT_HIGH) {
jtrojan 13:ce9dcd6d316b 96 ncnt=0;
jtrojan 13:ce9dcd6d316b 97 magdt_n++;
jtrojan 13:ce9dcd6d316b 98 if (magdt_n >= nspeeds) magdt_n=0;
jtrojan 13:ce9dcd6d316b 99 }
jtrojan 13:ce9dcd6d316b 100
JoeMiller 2:d2c2e2d3f1e5 101 takeAsample_F = 1;
jtrojan 13:ce9dcd6d316b 102 //printf("*");
JoeMiller 2:d2c2e2d3f1e5 103 }
JoeMiller 2:d2c2e2d3f1e5 104
JoeMiller 2:d2c2e2d3f1e5 105
jtrojan 10:709d8eef81fd 106 int main()
jtrojan 10:709d8eef81fd 107 {
jtrojan 4:ea7c4356f84c 108 t.start();
jtrojan 4:ea7c4356f84c 109 ADC_ChannelConfTypeDef sConfig; //Declare the ST HAL ADC object
jtrojan 10:709d8eef81fd 110
jtrojan 10:709d8eef81fd 111 /**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
jtrojan 4:ea7c4356f84c 112 */
jtrojan 4:ea7c4356f84c 113 hadc1.Instance = ADC1;
jtrojan 4:ea7c4356f84c 114 hadc1.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4;
jtrojan 4:ea7c4356f84c 115 hadc1.Init.Resolution = ADC_RESOLUTION12b;
jtrojan 4:ea7c4356f84c 116 hadc1.Init.ScanConvMode = DISABLE;
jtrojan 4:ea7c4356f84c 117 hadc1.Init.ContinuousConvMode = DISABLE;
jtrojan 4:ea7c4356f84c 118 hadc1.Init.DiscontinuousConvMode = DISABLE;
jtrojan 4:ea7c4356f84c 119 hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
jtrojan 4:ea7c4356f84c 120 hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
jtrojan 4:ea7c4356f84c 121 hadc1.Init.NbrOfConversion = 1;
jtrojan 4:ea7c4356f84c 122 hadc1.Init.DMAContinuousRequests = DISABLE;
jtrojan 4:ea7c4356f84c 123 hadc1.Init.EOCSelection = EOC_SINGLE_CONV;
jtrojan 4:ea7c4356f84c 124 HAL_ADC_Init(&hadc1); //Go turn on the ADC
jtrojan 10:709d8eef81fd 125
jtrojan 4:ea7c4356f84c 126 sConfig.Channel = ADC_CHANNEL_TEMPSENSOR; //ADC_CHANNEL_VREFINT, ADC_CHANNEL_VBAT
jtrojan 4:ea7c4356f84c 127 sConfig.Rank = 1;
jtrojan 10:709d8eef81fd 128
JoeMiller 2:d2c2e2d3f1e5 129 int response;
JoeMiller 2:d2c2e2d3f1e5 130 unsigned int count = 0;
JoeMiller 2:d2c2e2d3f1e5 131 char SDOK;
jtrojan 11:efe5c4d6af1e 132 char disp_buffer[42*N_REPEAT_HIGH];
jtrojan 6:bd675690d831 133 char big_disp_buffer[10000];
jtrojan 11:efe5c4d6af1e 134 char disp_char[42];
jtrojan 5:e4b1de08bb87 135 int X,Y,Z;
jtrojan 7:f655a9ef12e5 136 int islow = 0;
jtrojan 10:709d8eef81fd 137 int nhigh = 1;
jtrojan 7:f655a9ef12e5 138 int slow_data_ok = 0;
jtrojan 7:f655a9ef12e5 139 int nextdatahs = 0;
jtrojan 7:f655a9ef12e5 140 float tprev = 0;
jtrojan 7:f655a9ef12e5 141 float tnow = 0;
jtrojan 9:3e9245dc54e4 142 int n_ss = 0; // speed selector variable
jtrojan 10:709d8eef81fd 143 int mcc_v = 0;
jtrojan 10:709d8eef81fd 144 int lcc_v = 0;
jtrojan 12:bdb601ce5dfd 145 int dbpin = 0;
jtrojan 10:709d8eef81fd 146
JoeMiller 2:d2c2e2d3f1e5 147 mag.lock();
jtrojan 4:ea7c4356f84c 148 // magTimer.attach(&sampletimer,SAMPLE_INTERVAL);
jtrojan 12:bdb601ce5dfd 149 magTimer.attach(&sampletimer,magdt_low[n_ss]);
jtrojan 10:709d8eef81fd 150
JoeMiller 2:d2c2e2d3f1e5 151 sel1a = sel1b = sel1c = sel2a = sel2b = sel2c = 1;
jtrojan 10:709d8eef81fd 152
jtrojan 10:709d8eef81fd 153 // unlock precise timing registers
jtrojan 10:709d8eef81fd 154 sel1a = 0;
jtrojan 10:709d8eef81fd 155 response = mag.write(PW_REGISTER); // password register
jtrojan 10:709d8eef81fd 156 response = mag.write(PW); // input password
jtrojan 10:709d8eef81fd 157 sel1a = 1;
jtrojan 13:ce9dcd6d316b 158
jtrojan 10:709d8eef81fd 159 printf("\r\nVSG Datalogger\r\n");
JoeMiller 2:d2c2e2d3f1e5 160 printf("Timer interval = %f (sec)\r\n",SAMPLE_INTERVAL);
JoeMiller 2:d2c2e2d3f1e5 161 printf("Cycle Counts = %d \r\n", CYCLE_COUNT);
jtrojan 10:709d8eef81fd 162
JoeMiller 2:d2c2e2d3f1e5 163 for(char i=0; i<6; i++) { //wakeup blink 6 times
JoeMiller 2:d2c2e2d3f1e5 164 LED = !LED;
JoeMiller 2:d2c2e2d3f1e5 165 wait(0.1F);
JoeMiller 2:d2c2e2d3f1e5 166 }
JoeMiller 2:d2c2e2d3f1e5 167 wait(1.0F);
jtrojan 10:709d8eef81fd 168
jtrojan 12:bdb601ce5dfd 169 if (dbpin == 0) {
JoeMiller 2:d2c2e2d3f1e5 170 SDOK = 1; //initialize
JoeMiller 2:d2c2e2d3f1e5 171 }
JoeMiller 2:d2c2e2d3f1e5 172
jtrojan 10:709d8eef81fd 173 printf("\r\nOpening log file for append write\r\n");
JoeMiller 2:d2c2e2d3f1e5 174 // cannot make fopen conditional on debugPin - compiler does not understand
JoeMiller 2:d2c2e2d3f1e5 175 FILE *sd = fopen("/sd/sdtest.txt", "a");
JoeMiller 2:d2c2e2d3f1e5 176 if(sd == NULL) {
JoeMiller 2:d2c2e2d3f1e5 177 printf("\r\nRetry opening log file\r\n");
JoeMiller 2:d2c2e2d3f1e5 178 wait(2);
JoeMiller 2:d2c2e2d3f1e5 179 FILE *sd = fopen("/sd/sdtest.txt", "a");
JoeMiller 2:d2c2e2d3f1e5 180 if(sd == NULL) {
JoeMiller 2:d2c2e2d3f1e5 181 printf("\r\n....one more retry opening log file\r\n");
JoeMiller 2:d2c2e2d3f1e5 182 wait(2);
jtrojan 10:709d8eef81fd 183 FILE *sd = fopen("/sd/sdtest.txt", "a");
JoeMiller 2:d2c2e2d3f1e5 184 if(sd == NULL) {
JoeMiller 2:d2c2e2d3f1e5 185 printf("\r\n>>>>>> Could not open file for write try restarting\r\n");
JoeMiller 2:d2c2e2d3f1e5 186 SDOK = 0;
jtrojan 12:bdb601ce5dfd 187 while(!dbpin); // stay here if in log mode
JoeMiller 2:d2c2e2d3f1e5 188 }
JoeMiller 2:d2c2e2d3f1e5 189 }
JoeMiller 2:d2c2e2d3f1e5 190 }
jtrojan 10:709d8eef81fd 191
jtrojan 10:709d8eef81fd 192
jtrojan 10:709d8eef81fd 193
JoeMiller 2:d2c2e2d3f1e5 194 if (SDOK) {
JoeMiller 2:d2c2e2d3f1e5 195 printf("LOGGING MODE\r\n");
JoeMiller 2:d2c2e2d3f1e5 196 for(char i=0; i<6; i++) { //blink 6 times to show logging mode has been initiated
JoeMiller 2:d2c2e2d3f1e5 197 LED = !LED;
JoeMiller 2:d2c2e2d3f1e5 198 wait(0.1F);
JoeMiller 2:d2c2e2d3f1e5 199 }
jtrojan 4:ea7c4356f84c 200 //fprintf(sd, "count,temp,X1a,Y1a,Z1a,X1b,Y1b,Z1b,X1c,Y1c,Z1c,X2a,Y2a,Z2a,X2b,Y2b,Z2b,X2c,Y2c,Z2c\r\n");
JoeMiller 2:d2c2e2d3f1e5 201 }
jtrojan 10:709d8eef81fd 202
jtrojan 10:709d8eef81fd 203
JoeMiller 2:d2c2e2d3f1e5 204 // BIST Built-In-Self-Test Mag senosrs and ASIC
jtrojan 10:709d8eef81fd 205 // only in debug mode. Print axis OK bit flags for ZYX in that order
jtrojan 12:bdb601ce5dfd 206 if (dbpin == 1) {
JoeMiller 2:d2c2e2d3f1e5 207 printf("Starting BIST (7 = all axes on this device are OK)\r\n");
JoeMiller 2:d2c2e2d3f1e5 208
JoeMiller 2:d2c2e2d3f1e5 209 sel1a = 0;
JoeMiller 2:d2c2e2d3f1e5 210 response = mag.write(BIST_REG); // BIST register addr
JoeMiller 2:d2c2e2d3f1e5 211 response = mag.write(0x8F); // Set Self test enable bit
JoeMiller 2:d2c2e2d3f1e5 212 sel1a = 1;
JoeMiller 2:d2c2e2d3f1e5 213 sel1a = 0;
JoeMiller 2:d2c2e2d3f1e5 214 response = mag.write(MAG_REG); // Mag single measurement Register
JoeMiller 2:d2c2e2d3f1e5 215 response = mag.write(ALL_AXES); // start single measurement - all Axes
JoeMiller 2:d2c2e2d3f1e5 216 sel1a = 1;
jtrojan 10:709d8eef81fd 217 while (!rdy1a);
JoeMiller 2:d2c2e2d3f1e5 218 sel1a = 0;
JoeMiller 2:d2c2e2d3f1e5 219 response = mag.write(BIST_REG); // BIST register addr
JoeMiller 2:d2c2e2d3f1e5 220 response = mag.write(0); // Read back BIST results
JoeMiller 2:d2c2e2d3f1e5 221 sel1a = 1;
JoeMiller 2:d2c2e2d3f1e5 222 printf("1a = %d\r\n",((response>>4) & 0x07));
JoeMiller 2:d2c2e2d3f1e5 223 sel1a = 0;
JoeMiller 2:d2c2e2d3f1e5 224 response = mag.write(BIST_REG); // BIST register addr
JoeMiller 2:d2c2e2d3f1e5 225 response = mag.write(0); // Set Self test enable bit
JoeMiller 2:d2c2e2d3f1e5 226 sel1a = 1;
JoeMiller 2:d2c2e2d3f1e5 227
JoeMiller 2:d2c2e2d3f1e5 228 }
JoeMiller 2:d2c2e2d3f1e5 229
JoeMiller 2:d2c2e2d3f1e5 230 // BIST Complete
jtrojan 13:ce9dcd6d316b 231
jtrojan 10:709d8eef81fd 232 // Set Cycle Count for all axes
jtrojan 4:ea7c4356f84c 233 sel1a = 0;
jtrojan 11:efe5c4d6af1e 234 mcc_v = ((mag_cc[n_ss] >> 8) & 0xff);
jtrojan 11:efe5c4d6af1e 235 lcc_v = (mag_cc[n_ss] & 0xff);
JoeMiller 2:d2c2e2d3f1e5 236 response = mag.write(CC_REG); // Mag single measurement Register
jtrojan 10:709d8eef81fd 237 for (char i=0; i<3; i++) {
jtrojan 11:efe5c4d6af1e 238 response = mag.write(mcc_v);
jtrojan 11:efe5c4d6af1e 239 response = mag.write(lcc_v);
JoeMiller 2:d2c2e2d3f1e5 240 }
jtrojan 4:ea7c4356f84c 241 sel1a = 1;
jtrojan 13:ce9dcd6d316b 242
JoeMiller 2:d2c2e2d3f1e5 243
jtrojan 12:bdb601ce5dfd 244 //if (dbpin) printf("count,temp,X1a,Y1a,Z1a,X1b,Y1b,Z1b,X1c,Y1c,Z1c,X2a,Y2a,Z2a,X2b,Y2b,Z2b,X2c,Y2c,Z2c\r\n");
JoeMiller 2:d2c2e2d3f1e5 245
JoeMiller 2:d2c2e2d3f1e5 246 // log start delay when Flash card datalogging to give to to button up and place unit
jtrojan 10:709d8eef81fd 247 if (SDOK) {
JoeMiller 2:d2c2e2d3f1e5 248 LED = 1; // LED to show logging is in wait phase
jtrojan 10:709d8eef81fd 249 wait(SAMPLE_DELAY);
mbed_official 0:bdbd3d6fc5d5 250 }
jtrojan 4:ea7c4356f84c 251
jtrojan 12:bdb601ce5dfd 252 /*sel1a = 0;
jtrojan 7:f655a9ef12e5 253 response = mag.write(CMM_REG); // Mag continuous measurement Register
jtrojan 7:f655a9ef12e5 254 response = mag.write(ALL_AXES+START_BIT); // start continuous measurement - all Axes
jtrojan 12:bdb601ce5dfd 255 sel1a = 1;*/
jtrojan 5:e4b1de08bb87 256 //Now go read the STM internal channel selected above
jtrojan 8:9304b2c411e4 257 HAL_ADC_ConfigChannel(&hadc1, &sConfig);
jtrojan 8:9304b2c411e4 258 HAL_ADC_Start(&hadc1); // Start conversion
jtrojan 13:ce9dcd6d316b 259
jtrojan 10:709d8eef81fd 260 // MAIN LOOP
jtrojan 7:f655a9ef12e5 261 while (count < MAX_COUNT) {
jtrojan 10:709d8eef81fd 262
jtrojan 7:f655a9ef12e5 263 if (islow < N_REPEAT_LOW) {
jtrojan 7:f655a9ef12e5 264 islow++;
jtrojan 7:f655a9ef12e5 265 if (islow == N_REPEAT_LOW) nhigh = 0;
jtrojan 7:f655a9ef12e5 266 nextdatahs = 0;
jtrojan 7:f655a9ef12e5 267 //printf("low");
jtrojan 7:f655a9ef12e5 268 } else {
jtrojan 4:ea7c4356f84c 269 nhigh++;
jtrojan 7:f655a9ef12e5 270 if (nhigh == N_REPEAT_HIGH) islow = 0;
jtrojan 7:f655a9ef12e5 271 nextdatahs = 1;
jtrojan 10:709d8eef81fd 272 //printf("high");
jtrojan 4:ea7c4356f84c 273 }
jtrojan 10:709d8eef81fd 274
jtrojan 13:ce9dcd6d316b 275
jtrojan 7:f655a9ef12e5 276 tprev = t.read(); //time at start of loop
jtrojan 13:ce9dcd6d316b 277 while(!takeAsample_F) {
jtrojan 13:ce9dcd6d316b 278 wait_us(10); // required
jtrojan 13:ce9dcd6d316b 279 debugPin = 1;
jtrojan 4:ea7c4356f84c 280 }
JoeMiller 2:d2c2e2d3f1e5 281 takeAsample_F = 0;
jtrojan 12:bdb601ce5dfd 282 debugPin = 0;
jtrojan 13:ce9dcd6d316b 283
jtrojan 12:bdb601ce5dfd 284 sel1a = 0;
jtrojan 12:bdb601ce5dfd 285 response = mag.write(MAG_REG); // Mag single measurement Register
jtrojan 12:bdb601ce5dfd 286 response = mag.write(ALL_AXES); // start single measurement - all Axes
jtrojan 12:bdb601ce5dfd 287 sel1a = 1;
jtrojan 7:f655a9ef12e5 288
jtrojan 4:ea7c4356f84c 289 // Wait end of conversion and get value
jtrojan 4:ea7c4356f84c 290 //if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {
jtrojan 8:9304b2c411e4 291 uint16_t value = HAL_ADC_GetValue(&hadc1); //}
jtrojan 8:9304b2c411e4 292 //uint16_t value = 0;
jtrojan 5:e4b1de08bb87 293 //Now go read the STM internal channel selected above
jtrojan 8:9304b2c411e4 294 HAL_ADC_Start(&hadc1); // Start conversion
jtrojan 10:709d8eef81fd 295
jtrojan 12:bdb601ce5dfd 296 LED = 0;
jtrojan 13:ce9dcd6d316b 297 while (!(rdy1a)) {
jtrojan 12:bdb601ce5dfd 298 wait_us(10);// spin here until all Data Ready signals go high
jtrojan 12:bdb601ce5dfd 299 }
jtrojan 12:bdb601ce5dfd 300 LED = 1;
jtrojan 13:ce9dcd6d316b 301
JoeMiller 2:d2c2e2d3f1e5 302 sel1a = 0;
jtrojan 7:f655a9ef12e5 303 response = mag.write(MX_REG); // Read back mag data
jtrojan 7:f655a9ef12e5 304 response = mag.write(0);
jtrojan 7:f655a9ef12e5 305 X = response << 16;
jtrojan 7:f655a9ef12e5 306 response = mag.write(0);
jtrojan 7:f655a9ef12e5 307 X += (response << 8);
jtrojan 7:f655a9ef12e5 308 response = mag.write(0);
jtrojan 7:f655a9ef12e5 309 X += response;
jtrojan 7:f655a9ef12e5 310 response = mag.write(0);
jtrojan 7:f655a9ef12e5 311 Y = response << 16;
jtrojan 7:f655a9ef12e5 312 response = mag.write(0);
jtrojan 7:f655a9ef12e5 313 Y += (response << 8);
jtrojan 7:f655a9ef12e5 314 response = mag.write(0);
jtrojan 7:f655a9ef12e5 315 Y += response;
jtrojan 7:f655a9ef12e5 316 response = mag.write(0);
jtrojan 7:f655a9ef12e5 317 Z = response << 16;
jtrojan 7:f655a9ef12e5 318 response = mag.write(0);
jtrojan 7:f655a9ef12e5 319 Z += (response << 8);
jtrojan 7:f655a9ef12e5 320 response = mag.write(0);
jtrojan 7:f655a9ef12e5 321 Z += response;
JoeMiller 2:d2c2e2d3f1e5 322 sel1a = 1;
jtrojan 10:709d8eef81fd 323
jtrojan 10:709d8eef81fd 324 if (islow < 1) { // try to change rate within 1.3s of reading data
jtrojan 13:ce9dcd6d316b 325 /*// Set Cycle Count for all axes
jtrojan 7:f655a9ef12e5 326 sel1a = 0;
jtrojan 10:709d8eef81fd 327 mcc_v = ((mag_cc[n_ss] >> 8) & 0xff);
jtrojan 10:709d8eef81fd 328 lcc_v = (mag_cc[n_ss] & 0xff);
jtrojan 10:709d8eef81fd 329 response = mag.write(CC_REG); // Mag single measurement Register
jtrojan 10:709d8eef81fd 330 for (char i=0; i<3; i++) {
jtrojan 10:709d8eef81fd 331 response = mag.write(mcc_v);
jtrojan 10:709d8eef81fd 332 response = mag.write(lcc_v);
jtrojan 10:709d8eef81fd 333 }
jtrojan 13:ce9dcd6d316b 334 sel1a = 1;*/
jtrojan 12:bdb601ce5dfd 335 // set next speed number
jtrojan 10:709d8eef81fd 336 n_ss++;
jtrojan 13:ce9dcd6d316b 337 if (n_ss == nspeeds) n_ss = 0; // reset speed selector
jtrojan 13:ce9dcd6d316b 338
jtrojan 10:709d8eef81fd 339 }
jtrojan 10:709d8eef81fd 340 if (nhigh < 1) { // try to change rate within 1.3s of reading data
jtrojan 13:ce9dcd6d316b 341
jtrojan 7:f655a9ef12e5 342 }
jtrojan 4:ea7c4356f84c 343
jtrojan 4:ea7c4356f84c 344 // send/save data after receiving it
jtrojan 5:e4b1de08bb87 345 if (X > (0x07FFFFF)) X -= 0x1000000;
jtrojan 5:e4b1de08bb87 346 if (Y > (0x07FFFFF)) Y -= 0x1000000;
jtrojan 5:e4b1de08bb87 347 if (Z > (0x07FFFFF)) Z -= 0x1000000;
jtrojan 7:f655a9ef12e5 348
jtrojan 7:f655a9ef12e5 349
jtrojan 10:709d8eef81fd 350 sprintf(disp_char,"%d,%0.4f,%i, %d,%d,%d\r\n",count,t.read(),value,X,Y,Z);
jtrojan 10:709d8eef81fd 351
jtrojan 6:bd675690d831 352 if (PRINT_ALL == 1) {
jtrojan 6:bd675690d831 353 if (count == 0) {// print everything at once
jtrojan 6:bd675690d831 354 strcpy(big_disp_buffer,disp_char);
jtrojan 6:bd675690d831 355 } else {
jtrojan 6:bd675690d831 356 strcat(big_disp_buffer,disp_char);
jtrojan 6:bd675690d831 357 //printf("%i ",count);
jtrojan 6:bd675690d831 358 }
jtrojan 6:bd675690d831 359 } else {
jtrojan 7:f655a9ef12e5 360 if ((islow == 1) && (nextdatahs == 0)) {// reset at each slow interval
jtrojan 6:bd675690d831 361 strcpy(disp_buffer,disp_char);
jtrojan 6:bd675690d831 362 } else {
jtrojan 6:bd675690d831 363 strcat(disp_buffer,disp_char);
jtrojan 6:bd675690d831 364 }
jtrojan 7:f655a9ef12e5 365 if (islow == 0) { //print at end of fast intervals
jtrojan 12:bdb601ce5dfd 366 if (dbpin) { //SDOK
jtrojan 6:bd675690d831 367 printf("%s",disp_buffer);
jtrojan 6:bd675690d831 368 } else {
jtrojan 6:bd675690d831 369 fprintf(sd,"%s",disp_buffer);
jtrojan 13:ce9dcd6d316b 370 //printf("%i ",ncnt);
jtrojan 6:bd675690d831 371 printf("%s",disp_buffer);
jtrojan 11:efe5c4d6af1e 372 //printf("%i\r\n",count);
jtrojan 6:bd675690d831 373 }
jtrojan 9:3e9245dc54e4 374 //printf("%#x,%#x,%#x,%#x\r\n",v_low[n_ss],v_high[n_ss],srsettings_low[n_ss],srsettings_high[n_ss]);
jtrojan 9:3e9245dc54e4 375 //printf("%f,%f\r\n",rates_low[n_ss],rates_high[n_ss]);
jtrojan 6:bd675690d831 376 }
jtrojan 5:e4b1de08bb87 377 }
jtrojan 7:f655a9ef12e5 378
jtrojan 6:bd675690d831 379 //printf("%s",disp_char);
jtrojan 5:e4b1de08bb87 380 count++;
jtrojan 12:bdb601ce5dfd 381 //LED = !LED;
jtrojan 10:709d8eef81fd 382
jtrojan 7:f655a9ef12e5 383
jtrojan 7:f655a9ef12e5 384 } // end of while(1)
jtrojan 10:709d8eef81fd 385
jtrojan 6:bd675690d831 386 if (PRINT_ALL) {
jtrojan 12:bdb601ce5dfd 387 if (dbpin) { //SDOK
jtrojan 6:bd675690d831 388 printf("%s",big_disp_buffer);
jtrojan 6:bd675690d831 389 } else {
jtrojan 6:bd675690d831 390 fprintf(sd,"%s",big_disp_buffer);
jtrojan 11:efe5c4d6af1e 391 //printf("%s",big_disp_buffer);
jtrojan 6:bd675690d831 392 }
jtrojan 6:bd675690d831 393 }
JoeMiller 2:d2c2e2d3f1e5 394
JoeMiller 2:d2c2e2d3f1e5 395
jtrojan 12:bdb601ce5dfd 396 if (!dbpin) {
jtrojan 10:709d8eef81fd 397 // optional get SDCard available space
JoeMiller 2:d2c2e2d3f1e5 398 // FATFS* fs;
JoeMiller 2:d2c2e2d3f1e5 399 // DWORD fre_clust;
JoeMiller 2:d2c2e2d3f1e5 400 // f_getfree("0:",&fre_clust,&fs);
JoeMiller 2:d2c2e2d3f1e5 401 // const float frs = float(fs->csize)*float(fs->free_clust)
JoeMiller 2:d2c2e2d3f1e5 402 // #if _MAX_SS != 512
JoeMiller 2:d2c2e2d3f1e5 403 // *(fs->ssize);
JoeMiller 2:d2c2e2d3f1e5 404 // #else
JoeMiller 2:d2c2e2d3f1e5 405 // *512;
JoeMiller 2:d2c2e2d3f1e5 406 // #endif
JoeMiller 2:d2c2e2d3f1e5 407 // printf("free space = %g MB, %g KB\r\n", frs/1048576.0, frs/1024.0);
JoeMiller 2:d2c2e2d3f1e5 408
JoeMiller 2:d2c2e2d3f1e5 409 fclose(sd);
jtrojan 10:709d8eef81fd 410
JoeMiller 2:d2c2e2d3f1e5 411 }
jtrojan 10:709d8eef81fd 412
JoeMiller 2:d2c2e2d3f1e5 413 LED = 0;
JoeMiller 2:d2c2e2d3f1e5 414 printf("\r\nDONE\r\n");
JoeMiller 2:d2c2e2d3f1e5 415
JoeMiller 2:d2c2e2d3f1e5 416 magTimer.detach();
JoeMiller 2:d2c2e2d3f1e5 417 mag.unlock();
jtrojan 4:ea7c4356f84c 418 t.stop();
mbed_official 0:bdbd3d6fc5d5 419 }