Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: SDFileSystemVSG mbed
Fork of VSG_DataLogger1 by
main.cpp@9:3e9245dc54e4, 2018-08-21 (annotated)
- 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?
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 | 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 | } |