PNI / Mbed 2 deprecated VSG_DataLogger1_VariableSpeed

Dependencies:   SDFileSystemVSG mbed

Fork of VSG_DataLogger1 by PNI

Committer:
jtrojan
Date:
Tue Aug 21 22:54:33 2018 +0000
Revision:
9:3e9245dc54e4
Parent:
8:9304b2c411e4
Child:
10:709d8eef81fd
functional version that has selectable different rates

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