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
- Committer:
- JoeMiller
- Date:
- 2018-05-08
- Revision:
- 2:d2c2e2d3f1e5
- Parent:
- 0:bdbd3d6fc5d5
- Child:
- 4:ea7c4356f84c
File content as of revision 2:d2c2e2d3f1e5:
// VSG Board 18-axes mag Datalogger prototype // install debug jumper for console output only // remove debug jumper to log data to SDcard only // set system parameters ------------------------- #define SAMPLE_RATE (10) //Hz #define SAMPLE_PERIOD (20) // seconds #define SAMPLE_DELAY (2) // seconds -to allow time to seal unit and place in the field #define CYCLE_COUNT (50) //------------------------------------------------ #include "mbed.h" #include "SDFileSystem.h" // NOTICE: SDFileSystem.cpp was modified. See //JM comments #include "main.h" #define SAMPLE_INTERVAL (1.0/SAMPLE_RATE) #define MAX_COUNT (SAMPLE_PERIOD * SAMPLE_RATE) #define MCC ((CYCLE_COUNT >> 8) & 0xff) #define LCC (CYCLE_COUNT & 0xff) #define MAX_MAG_VALUE (8388608) // positive 23 bits #define NEGATIVE_ADJUST (MAX_MAG_VALUE + MAX_MAG_VALUE) //signed 24 bits // resource assignments DigitalIn rdy1a(DRDY1A); DigitalIn rdy1b(DRDY1B); DigitalIn rdy1c(DRDY1C); DigitalIn rdy2a(DRDY2A); DigitalIn rdy2b(DRDY2B); DigitalIn rdy2c(DRDY2C); DigitalIn debugPin(DEBUG_MODE); DigitalOut sel1a(SSM1A); DigitalOut sel1b(SSM1B); DigitalOut sel1c(SSM1C); DigitalOut sel2a(SSM2A); DigitalOut sel2b(SSM2B); DigitalOut sel2c(SSM2C); DigitalOut LED(DEBUG_LED); SPI mag(SPI_MOSI, SPI_MISO, SPI_SCK); SDFileSystem sd(SD_MOSI, SD_MISO, SD_SCK, SD_CSN, "sd"); // the pinout on the mbed Cool Components workshop board Serial console(PA_2, PA_3,115200); // debug port Ticker magTimer; char takeAsample_F; void sampletimer() { takeAsample_F = 1; // printf("*"); } int main() { int response; unsigned int count = 0; char haveMeasurements = 0; char SDOK; int X[6],Y[6],Z[6]; mag.lock(); magTimer.attach(&sampletimer,SAMPLE_INTERVAL); sel1a = sel1b = sel1c = sel2a = sel2b = sel2c = 1; printf("\r\nVSG Datalogger\r\n"); printf("Timer interval = %f (sec)\r\n",SAMPLE_INTERVAL); printf("Cycle Counts = %d \r\n", CYCLE_COUNT); for(char i=0; i<6; i++) { //wakeup blink 6 times LED = !LED; wait(0.1F); } wait(1.0F); if (debugPin == 0){ SDOK = 1; //initialize } printf("\r\nOpening log file for append write\r\n"); // cannot make fopen conditional on debugPin - compiler does not understand FILE *sd = fopen("/sd/sdtest.txt", "a"); if(sd == NULL) { printf("\r\nRetry opening log file\r\n"); wait(2); FILE *sd = fopen("/sd/sdtest.txt", "a"); if(sd == NULL) { printf("\r\n....one more retry opening log file\r\n"); wait(2); FILE *sd = fopen("/sd/sdtest.txt", "a"); if(sd == NULL) { printf("\r\n>>>>>> Could not open file for write try restarting\r\n"); SDOK = 0; while(!debugPin); // stay here if in log mode } } } if (SDOK) { printf("LOGGING MODE\r\n"); for(char i=0; i<6; i++) { //blink 6 times to show logging mode has been initiated LED = !LED; wait(0.1F); } fprintf(sd, "count,X1a,Y1a,Z1a,X1b,Y1b,Z1b,X1c,Y1c,Z1c,X2a,Y2a,Z2a,X2b,Y2b,Z2b,X2c,Y2c,Z2c\r\n"); } // BIST Built-In-Self-Test Mag senosrs and ASIC // only in debug mode. Print axis OK bit flags for ZYX in that order if (debugPin == 1) { printf("Starting BIST (7 = all axes on this device are OK)\r\n"); sel1a = 0; response = mag.write(BIST_REG); // BIST register addr response = mag.write(0x8F); // Set Self test enable bit sel1a = 1; sel1a = 0; response = mag.write(MAG_REG); // Mag single measurement Register response = mag.write(ALL_AXES); // start single measurement - all Axes sel1a = 1; while (!rdy1a); sel1a = 0; response = mag.write(BIST_REG); // BIST register addr response = mag.write(0); // Read back BIST results sel1a = 1; printf("1a = %d\r\n",((response>>4) & 0x07)); sel1a = 0; response = mag.write(BIST_REG); // BIST register addr response = mag.write(0); // Set Self test enable bit sel1a = 1; sel1b = 0; response = mag.write(BIST_REG); // BIST register addr response = mag.write(0x8F); // Set Self test enable bit sel1b = 1; sel1b = 0; response = mag.write(MAG_REG); // Mag single measurement Register response = mag.write(ALL_AXES); // start single measurement - all Axes sel1b = 1; while (!rdy1b); sel1b = 0; response = mag.write(BIST_REG); // BIST register addr response = mag.write(0); // Read back BIST results sel1b = 1; printf("1b = %d\r\n",((response>>4) & 0x07)); sel1b = 0; response = mag.write(BIST_REG); // BIST register addr response = mag.write(0); // Set Self test enable bit sel1b = 1; sel1c = 0; response = mag.write(BIST_REG); // BIST register addr response = mag.write(0x8F); // Set Self test enable bit sel1c = 1; sel1c = 0; response = mag.write(MAG_REG); // Mag single measurement Register response = mag.write(ALL_AXES); // start single measurement - all Axes sel1c = 1; while (!rdy1c); sel1c = 0; response = mag.write(BIST_REG); // BIST register addr response = mag.write(0); // Read back BIST results sel1c = 1; printf("1c = %d\r\n",((response>>4) & 0x07)); sel1c = 0; response = mag.write(BIST_REG); // BIST register addr response = mag.write(0); // Set Self test enable bit sel1c = 1; sel2a = 0; response = mag.write(BIST_REG); // BIST register addr response = mag.write(0x8F); // Set Self test enable bit sel2a = 1; sel2a = 0; response = mag.write(MAG_REG); // Mag single measurement Register response = mag.write(ALL_AXES); // start single measurement - all Axes sel2a = 1; while (!rdy2a); sel2a = 0; response = mag.write(BIST_REG); // BIST register addr response = mag.write(0); // Read back BIST results sel2a = 1; printf("2a = %d\r\n",((response>>4) & 0x07)); sel2a = 0; response = mag.write(BIST_REG); // BIST register addr response = mag.write(0); // Set Self test enable bit sel2a = 1; sel2b = 0; response = mag.write(BIST_REG); // BIST register addr response = mag.write(0x8F); // Set Self test enable bit sel2b = 1; sel2b = 0; response = mag.write(MAG_REG); // Mag single measurement Register response = mag.write(ALL_AXES); // start single measurement - all Axes sel2b = 1; while (!rdy2b) ; sel2b = 0; response = mag.write(BIST_REG); // BIST register addr response = mag.write(0); // Read back BIST results sel2b = 1; printf("2b = %d\r\n",((response>>4) & 0x07)); sel2b = 0; response = mag.write(BIST_REG); // BIST register addr response = mag.write(0); // Set Self test enable bit sel2b = 1; sel2c = 0; response = mag.write(BIST_REG); // BIST register addr response = mag.write(0x8F); // Set Self test enable bit sel2c = 1; sel2c = 0; response = mag.write(MAG_REG); // Mag single measurement Register response = mag.write(ALL_AXES); // start single measurement - all Axes sel2c = 1; while (!rdy2c); sel2c = 0; response = mag.write(BIST_REG); // BIST register addr response = mag.write(0); // Read back BIST results sel2c = 1; printf("2c = %d\r\n",((response>>4) & 0x07)); sel2c = 0; response = mag.write(BIST_REG); // BIST register addr response = mag.write(0); // Set Self test enable bit sel2c = 1; } // BIST Complete // Set Cycle Count on all 6 devices simultaniously sel1a = sel1b = sel1c = sel2a = sel2b = sel2c = 0; response = mag.write(CC_REG); // Mag single measurement Register for (char i=0; i<3;i++) { response = mag.write(MCC); // start single measurement - all Axes response = mag.write(LCC); // start single measurement - all Axes } sel1a = sel1b = sel1c = sel2a = sel2b = sel2c = 1; if (debugPin) printf("count,X1a,Y1a,Z1a,X1b,Y1b,Z1b,X1c,Y1c,Z1c,X2a,Y2a,Z2a,X2b,Y2b,Z2b,X2c,Y2c,Z2c\r\n"); // log start delay when Flash card datalogging to give to to button up and place unit if (SDOK) { LED = 1; // LED to show logging is in wait phase wait(SAMPLE_DELAY); } while(count < MAX_COUNT) { while(!takeAsample_F){ wait(0.0001); // required } takeAsample_F = 0; sel1a = sel1b = sel1c = sel2a = sel2b = sel2c = 0; response = mag.write(MAG_REG); // Mag single measurement Register response = mag.write(ALL_AXES); // start single measurement - all Axes sel1a = sel1b = sel1c = sel2a = sel2b = sel2c = 1; // send/save data while waiting for current measurements to complete // this will helps increase sample rate -when needed. if (haveMeasurements) { if (SDOK) { fprintf(sd,"%d,",count); } else printf("%d, ",count); // sign adjust and publish data for (char i = 0; i<6; i++) { // 24 bit sign adjust if (X[i] > (0x07FFFFF)) X[i] -= 0x1000000; if (Y[i] > (0x07FFFFF)) Y[i] -= 0x1000000; if (Z[i] > (0x07FFFFF)) Z[i] -= 0x1000000; if (SDOK) { fprintf(sd,"%d,%d,%d",X[i],Y[i],Z[i]); } else printf("%d,%d,%d",X[i],Y[i],Z[i]); if(i<5) { if (SDOK) { fprintf(sd,","); // more data comming } else printf(", "); } else { if (SDOK) { fprintf(sd,"\n"); // last set of data } else printf("\r\n"); } } count++; } while (!(rdy1a && rdy1b && rdy1c && rdy2a && rdy2b && rdy2c)){ // spin here until all Data Ready signals go high } sel1a = 0; response = mag.write(MX_REG); // Read back mag data response = mag.write(0); X[0] = response << 16; response = mag.write(0); X[0] += (response << 8); response = mag.write(0); X[0] += response; response = mag.write(0); Y[0] = response << 16; response = mag.write(0); Y[0] += (response << 8); response = mag.write(0); Y[0] += response; response = mag.write(0); Z[0] = response << 16; response = mag.write(0); Z[0] += (response << 8); response = mag.write(0); Z[0] += response; sel1a = 1; sel1b = 0; response = mag.write(MX_REG); // Read back mag data response = mag.write(0); X[1] = response << 16; response = mag.write(0); X[1] += (response << 8); response = mag.write(0); X[1] += response; response = mag.write(0); Y[1] = response << 16; response = mag.write(0); Y[1] += (response << 8); response = mag.write(0); Y[1] += response; response = mag.write(0); Z[1] = response << 16; response = mag.write(0); Z[1] += (response << 8); response = mag.write(0); Z[1] += response; sel1b = 1; sel1c = 0; response = mag.write(MX_REG); // Read back mag data response = mag.write(0); X[2] = response << 16; response = mag.write(0); X[2] += (response << 8); response = mag.write(0); X[2] += response; response = mag.write(0); Y[2] = response << 16; response = mag.write(0); Y[2] += (response << 8); response = mag.write(0); Y[2] += response; response = mag.write(0); Z[2] = response << 16; response = mag.write(0); Z[2] += (response << 8); response = mag.write(0); Z[2] += response; sel1c = 1; sel2a = 0; response = mag.write(MX_REG); // Read back mag data response = mag.write(0); X[3] = response << 16; response = mag.write(0); X[3] += (response << 8); response = mag.write(0); X[3] += response; response = mag.write(0); Y[3] = response << 16; response = mag.write(0); Y[3] += (response << 8); response = mag.write(0); Y[3] += response; response = mag.write(0); Z[3] = response << 16; response = mag.write(0); Z[3] += (response << 8); response = mag.write(0); Z[3] += response; sel2a = 1; sel2b = 0; response = mag.write(MX_REG); // Read back mag data response = mag.write(0); X[4] = response << 16; response = mag.write(0); X[4] += (response << 8); response = mag.write(0); X[4] += response; response = mag.write(0); Y[4] = response << 16; response = mag.write(0); Y[4] += (response << 8); response = mag.write(0); Y[4] += response; response = mag.write(0); Z[4] = response << 16; response = mag.write(0); Z[4] += (response << 8); response = mag.write(0); Z[4] += response; sel2b = 1; sel2c = 0; response = mag.write(MX_REG); // Read back mag data response = mag.write(0); X[5] = response << 16; response = mag.write(0); X[5] += (response << 8); response = mag.write(0); X[5] += response; response = mag.write(0); Y[5] = response << 16; response = mag.write(0); Y[5] += (response << 8); response = mag.write(0); Y[5] += response; response = mag.write(0); Z[5] = response << 16; response = mag.write(0); Z[5] += (response << 8); response = mag.write(0); Z[5] += response; sel2c = 1; haveMeasurements = 1; LED = !LED; } // end of while(1) if (!debugPin) { // optional get SDCard available space // FATFS* fs; // DWORD fre_clust; // f_getfree("0:",&fre_clust,&fs); // const float frs = float(fs->csize)*float(fs->free_clust) // #if _MAX_SS != 512 // *(fs->ssize); // #else // *512; // #endif // printf("free space = %g MB, %g KB\r\n", frs/1048576.0, frs/1024.0); fclose(sd); } LED = 0; printf("\r\nDONE\r\n"); magTimer.detach(); mag.unlock(); }