Data logger version to log at multiple rates on a single sensor set
Dependencies: SDFileSystemVSG mbed
Fork of VSG_DataLogger1 by
main.cpp@13:ce9dcd6d316b, 2018-09-01 (annotated)
- 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?
User | Revision | Line number | New 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 | } |