store accel_z and sallen key signal
Dependencies: mbed tsi_sensor FreescaleIAP MMA8451Q MPL3115A2
Diff: main.cpp
- Revision:
- 3:93bc37d442df
- Parent:
- 2:1bd31ca8a126
- Child:
- 4:64f3383f2c43
--- a/main.cpp Wed Nov 28 00:31:25 2018 +0000 +++ b/main.cpp Fri Nov 30 18:52:10 2018 +0000 @@ -40,15 +40,15 @@ #define SECTOR_SIZE 1024 #define RESERVED_SECTOR 32 -#define ACQ_TIMER_PERIOD 0.05 // Time between 2 acquisitions in seconds +#define ACQ_TIMER_PERIOD 0.5 // Time between 2 acquisitions in seconds -#define AVERAGE_SAMPLES 15 -#define BOARD_REST 0 -#define BOARD_UPSIDE_DOWN 1 +#define N_PER_AVERAGE 8 + +#define BOARD_STRAIGHT 0 +#define BOARD_UPSIDE_DOWN 1 #define ACCEL_MINIMUM_FOR_STORAGE 0 - -// Structure of sensors Data !!!!! SIZE MUST BE A MULTIPLE OF 4 bytes !!!!!/ +// Structure of sensors Data !!!!! SIZE MUST BE A MULTIPLE OF 4 bytes !!!!! typedef struct{ int16_t Accel_X; // 2 bytes int16_t Accel_Y; // 2 bytes @@ -56,18 +56,17 @@ float Temperature; // 4 bytes unsigned short Analog_PTE20; // 2 bytes unsigned short Analog_PTE21; // 2 bytes - unsigned short Analog_PTE22; // 2 bytes + unsigned short Empty; // 2 bytes } Sensor_Data; // TOTAL = 16 bytes - -typedef struct -{ +typedef struct{ unsigned short Accel_Z; - unsigned short Ethanol_Concentration; -// unsigned short No_Use + unsigned short Sallen_Key; + unsigned short Interface; + unsigned short Useless; } Stored_Data; -Stored_Data Stored_Data_Separator; +int Number_Stored_Points; // --- Setup I2C for MMA8451 accelerometer // --- The last argument is the full scale range (FSR). 0x00 for 2G, 0x01 for 4G, 0x02 for 8G @@ -83,7 +82,6 @@ // Analog inputs (ADCs) AnalogIn myPTE20(PTE20); AnalogIn myPTE21(PTE21); -AnalogIn myPTE22(PTE22); // Analog output (DAC) AnalogOut myDAC(PTE30); @@ -103,8 +101,6 @@ int Nb_Sector; uint32_t KL25_Flash_Size; -int Number_Stored_Points; - // Functions declaration void Clear_Led(void); int Acquisition_Flash(void); @@ -115,16 +111,10 @@ void Read_Task(void); extern IAPCode verify_erased(int address, unsigned int length); - - int main() { - + uint8_t Count; // Count defining the number of time the LED blinks before data acquisition - Number_Stored_Points = 0; - Stored_Data_Separator.Accel_Z = 0; - Stored_Data_Separator.Ethanol_Concentration = 0; - // Set DAC output voltage float vdac; uint16_t dac_value; // Local variable in 16 bits @@ -144,7 +134,7 @@ Nb_Sector = (KL25_Flash_Size / SECTOR_SIZE) - RESERVED_SECTOR; // Reserve max 32K for app code myTick_Acq.attach(&myTimer_Acq_Task, ACQ_TIMER_PERIOD); // Initialize timer interrupt - Host_Comm.printf("\n\rLELEC2811 Beer project acquisition logger V1.0 UCL 2018\n\r"); + Host_Comm.printf("\n\rLELEC2811 Multiple sensors logger V2.0 UCL 2018\n\r"); if ((sizeof(Sensor_Data) % 4) != 0) { @@ -188,7 +178,7 @@ } } } - + void Read_Task() { char host_cmd; @@ -290,15 +280,11 @@ int Status; int Flash_Ptr ; int Led_Counter; - int Count_Measurements; + Sensor_Data myData; int Board_Position; - Sensor_Data myData; + int Count_Measurements; Stored_Data myStoredData; - -/*** Initializing inserted variables for initial value **/ - Count_Measurements = 0; - myStoredData.Accel_Z = 0; - myStoredData.Ethanol_Concentration = 0; + /*** Erase all Flash Page **/ for (Flash_Ptr = Flash_Base_Address ; Flash_Ptr < KL25_Flash_Size ; Flash_Ptr += 0x400) @@ -315,10 +301,21 @@ Led_Blue = LED_ON; Led_Counter = 0; + +/*** Reset new variables **/ + + myStoredData.Accel_Z= 0; + myStoredData.Interface = 0; + myStoredData.Sallen_Key = 0; -/***** Begin of Loop Acquisition - Write in Flash ***/ - - while (Flash_Ptr < (KL25_Flash_Size - sizeof(Stored_Data)) ) // Acq Loop + Board_Position = BOARD_STRAIGHT; + + Number_Stored_Points = 0; + + +/***** Begin of Loop Acquisition - Write in Flash ***/ + + while (Flash_Ptr < (KL25_Flash_Size - sizeof(Sensor_Data)) ) // Acq Loop { while (bTimer == 0) // Wait Acq Tick Timer Done { @@ -332,74 +329,73 @@ Led_Blue = !Led_Blue; } - Led_Counter++; - + Led_Counter++; + // Get accelerometer data Accel_Enable = ENABLE_STATE; // Rising edge -> Start accelerometer measurement -// myData.Accel_X = my8451.getAccAxis(REG_OUT_X_MSB); -// myData.Accel_Y = my8451.getAccAxis(REG_OUT_Y_MSB); - myData.Accel_Z = my8451.getAccAxis(REG_OUT_Z_MSB); + // myData.Accel_X = my8451.getAccAxis(REG_OUT_X_MSB); + // myData.Accel_Y = my8451.getAccAxis(REG_OUT_Y_MSB); + myData.Accel_Z = my8451.getAccAxis(REG_OUT_Z_MSB); Accel_Enable = DISABLE_STATE; - Host_Comm.printf("%d \n", Count_Measurements); - - // Verify if acquisition precess must be started - if (myData.Accel_Z <= ACCEL_MINIMUM_FOR_STORAGE) + + /*** verify if it is upside down ***/ + if (myData.Accel_Z < ACCEL_MINIMUM_FOR_STORAGE) Board_Position = BOARD_UPSIDE_DOWN; - // If board is upside down, start the acquistion task - if (Board_Position == BOARD_UPSIDE_DOWN) - { - // Get ADC value - myData.Analog_PTE21 = myPTE21.read_u16(); + if (Board_Position == BOARD_UPSIDE_DOWN){ + + Count_Measurements ++; - // Adding sensor values to the stored structure - myStoredData.Accel_Z = myData.Accel_Z; - myStoredData.Ethanol_Concentration += myData.Analog_PTE21; //stored here AVERAGE_MEASUREMENTS times the measured voltage correspondent to the ppm - Count_Measurements += 1; + // Get ADC values + myData.Analog_PTE20 = myPTE20.read_u16(); + myData.Analog_PTE21 = myPTE21.read_u16(); + + // add data to stored variable + myStoredData.Accel_Z = myData.Accel_Z; + + myStoredData.Sallen_Key += myData.Analog_PTE20; + myStoredData.Interface += myData.Analog_PTE21; - /*** Creating the average filter **/ - - if (Count_Measurements == AVERAGE_SAMPLES) - { - Count_Measurements = 0; // reset the counter + Host_Comm.printf("\n\r%d %d", Count_Measurements, myStoredData.Accel_Z); + + // after N_PER_AVERAGE measurements, take average and store + if (Count_Measurements >= N_PER_AVERAGE){ + + Count_Measurements = 0; + + myStoredData.Sallen_Key = myStoredData.Sallen_Key / N_PER_AVERAGE; + myStoredData.Interface = myStoredData.Interface / N_PER_AVERAGE; /*** Save Data in Flash ***/ - myStoredData.Ethanol_Concentration = myStoredData.Ethanol_Concentration / AVERAGE_SAMPLES; + Number_Stored_Points ++; Status = program_flash(Flash_Ptr, (char *) &myStoredData, sizeof(Stored_Data)); // Write in the Flash - Number_Stored_Points ++; - if (Status != 0) { Host_Comm.printf("\n\rFlash_Write Error = %d", Status); return WRITE_FLASH_ERROR; } Flash_Ptr += sizeof(Stored_Data); - + + // verifies if system comes back straight orientation + if (myData.Accel_Z > ACCEL_MINIMUM_FOR_STORAGE) + Board_Position = BOARD_STRAIGHT; + if (Check_Jumper() != JUMPER_PRESENT) // If jumper removed -> Stop acquisition { return FLASH_ACQ_DONE ; } - - myStoredData.Ethanol_Concentration = 0; // Resets the average of the measurement - - // Verify if acquisition process must be stopped - if (myStoredData.Accel_Z > ACCEL_MINIMUM_FOR_STORAGE) - { - Board_Position = BOARD_REST; -// Status = program_flash(Flash_Ptr, (char *) &Stored_Data_Separator, sizeof(Stored_Data)); // Write in the Flash a separator for each sampling -// Flash_Ptr ++; -// Number_Stored_Points ++; - } } } - else if (Check_Jumper() != JUMPER_PRESENT) // If not acquiring and jumper removed -> Stop acquisition - return FLASH_ACQ_DONE ; - + else { + if (Check_Jumper() != JUMPER_PRESENT) // If jumper removed -> Stop acquisition + return FLASH_ACQ_DONE ; + } + } return FLASH_ACQ_DONE ; @@ -407,25 +403,25 @@ int Read_Data_Logging() { - Stored_Data * data = (Stored_Data * )Flash_Base_Address; // Stored_Data pointer of data stored in Flash + Stored_Data * data = (Stored_Data * )Flash_Base_Address; // Sensor_Data pointer of data stored in Flash int Flash_Record_Ptr; char cmd; int Record_Counter; int Max_Record; Stored_Data myRead_Data; // Data Structure used to retrieve saved value from Flash - float Ethanol_Voltage; + float Ethanol_Sallen_Key; + float Ethanol_Interface; Clear_Led(); - Max_Record = (Nb_Sector * SECTOR_SIZE) / sizeof(Stored_Data); + Max_Record = (Nb_Sector * SECTOR_SIZE) / sizeof(Sensor_Data); Record_Counter = 0; Flash_Record_Ptr = 0; - Host_Comm.printf("\n\rCount AccZ Eth_Volt"); + Host_Comm.printf("\n\r# AccZ Eth_SK Eth_Int"); -// while (Record_Counter < Max_Record) - while (Record_Counter < Number_Stored_Points) + while (Record_Counter < Number_Stored_Points && Record_Counter < Max_Record) { Led_Green = !Led_Green; Led_Blue = !Led_Green; @@ -449,11 +445,12 @@ } else { - Ethanol_Voltage = ((float) myRead_Data.Ethanol_Concentration / (0XFFFF)) * KL25Z_VDD; + Ethanol_Sallen_Key = ((float) myRead_Data.Sallen_Key / 0XFFFF) * KL25Z_VDD; // Convert to voltage + Ethanol_Interface = ((float) myRead_Data.Interface / 0XFFFF) * KL25Z_VDD; Host_Comm.printf("\n\r%d ", Record_Counter); Host_Comm.printf("%d ", myRead_Data.Accel_Z); - Host_Comm.printf("%1.3f", Ethanol_Voltage); + Host_Comm.printf("%1.3f %1.3f ", Ethanol_Sallen_Key, Ethanol_Interface); } Record_Counter ++;