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: X_NUCLEO_IKS01A3
Revision 15:7d938eef43c4, committed 2019-09-24
- Comitter:
- martlefebvre94
- Date:
- Tue Sep 24 10:11:03 2019 +0000
- Parent:
- 14:8b7ce0fc3971
- Commit message:
- LIS2DW12 accelerometer project
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Mon Sep 23 13:08:23 2019 +0000
+++ b/main.cpp Tue Sep 24 10:11:03 2019 +0000
@@ -37,7 +37,7 @@
*/
/*
- LELEC2811 Multisensor IKS01A3 Project
+ LELEC2811 Accelerometer LIS2DW12 Project
M. Lefebvre - 2019-2020
*/
@@ -50,53 +50,20 @@
#include "stm32l0xx_hal_flash.h"
/* Defines */
-#define FS 25.0 // Readout frequency (Hz)
-
-// LIS2MDL Magnetometer
-#define LIS2MDL_ODR 50.0 // Output data rate (10, 20, 50 or 100 Hz)
-#define LIS2MDL_LP 0 // Power mode (0 for high-resolution mode, 1 for low-power mode)
-#define LIS2MDL_LPF 0 // Bandwidth (0 for ODR/2, 1 for ODR/4)
-#define LIS2MDL_COMP_TEMP_EN 1 // Temperature compensation (0 disabled, 1 enabled)
-#define LIS2MDL_OFF_CANC 1 // Offset cancellation (0 for no offset cancellation, 1 for offset cancellation, 2 for set pulse only at power-on)
-#define LIS2MDL_DATA_SIZE 12 // Number of bytes for LIS2MDL magnetometer data
-
-// LPS22HH Pressure sensor
-#define P0 1013.26 // Sea level pressure (hPa)
-#define LPS22HH_ODR 50.0 // Output data rate (one-shot, 1, 10, 25, 50, 75, 100, 200 Hz)
-#define LPS22HH_LOW_NOISE_EN 1 // Low-noise (0 disabled, 1 enabled)
-#define LPS22HH_LPF_CFG 3 // Device bandwidth (0 for ODR/2, 2 for ODR/9, 3 for ODR/20)
-#define LPS22HH_DATA_SIZE 8 // Number of bytes for LPS22HH pressure sensor data
+#define FS 12.5 // Readout frequency (Hz) - /!\ Must be below 100Hz
+#define FLASH_WRITE_TIME 0.00328 // Flash write time (s)
// LIS2DW12 Accelerometer
-#define LIS2DW12_ODR 4 // Output data rate (0 power down, 1 HP 12.5Hz/LP 1.6Hz, 2 for 12.5Hz, 3 for 25Hz, 4 for 50Hz, 5 for 100Hz, 6 for 200Hz, 7 for HP 400Hz/LP 200Hz, 8 for HP 800Hz/LP 200Hz, 9 for HP 1600Hz/LP 200Hz)
-#define LIS2DW12_FS 4 // Full-scale +-(2, 4, 8 or 16 g)
-#define LIS2DW12_BW_FILT 2 // Filter bandwidth (0 for ODR/2, 1 for ODR/4, 2 for ODR/10, 3 for ODR/20)
-#define LIS2DW12_LP_MODE 0 // Low-power modes 1 to 4 (1 gives the max. rms noise, 4 gives the min. rms noise)
-#define LIS2DW12_MODE 1 // Mode (0 for low-power, 1 for high-performance, 2 for single data conversion)
-#define LIS2DW12_LOW_NOISE 1 // Low-noise (0 disable, 1 enabled)
+#define LIS2DW12_ODR 3 // Output data rate (0 power down, 1 HP 12.5Hz/LP 1.6Hz, 2 for 12.5Hz, 3 for 25Hz, 4 for 50Hz, 5 for 100Hz, 6 for 200Hz, 7 for HP 400Hz/LP 200Hz, 8 for HP 800Hz/LP 200Hz, 9 for HP 1600Hz/LP 200Hz)
+#define LIS2DW12_FS 16 // Full-scale +-(2, 4, 8 or 16 g)
+#define LIS2DW12_BW_FILT 0 // Filter bandwidth (0 for ODR/2, 1 for ODR/4, 2 for ODR/10, 3 for ODR/20)
+#define LIS2DW12_LP_MODE 1 // Low-power modes 1 to 4 (1 gives the max. rms noise, 4 gives the min. rms noise)
+#define LIS2DW12_MODE 0 // Mode (0 for low-power, 1 for high-performance, 2 for single data conversion)
+#define LIS2DW12_LOW_NOISE 0 // Low-noise (0 disabled, 1 enabled)
#define LIS2DW12_POWER_MODE LIS2DW12_LP_MODE + (LIS2DW12_MODE << 2) + (LIS2DW12_LOW_NOISE << 4)
-
-// HTS221 Relative humidity and temperature sensor
-#define HTS221_ODR 1 // Output data rate (one-shot, 1Hz, 7Hz, 12.5Hz)
-#define HTS221_HEATER 0 // Heater configuration (0 disabled, 1 enabled)
-#define HTS221_AVGH 32 // Humidity averaging (4 to 512)
-#define HTS221_AVGT 16 // Temperature averaging (2 to 256)
+#define LIS2DW12_DATA_SIZE 12 // Number of bytes for LIS2DW12 accelerometer sensor data
-// LSM6DSO Accelerometer + gyroscope
-#define LSM6DSO_ODR_XL 12.5 // Accelerometer output data rate (12.5, 26, 52, 104, 208, 416, 833, 1.66k, 3.33k, 6.66kHz)
-#define LSM6DSO_FS_XL 4 // Accelerometer full scale (2, 4, 8, 16g)
-#define LSM6DSO_XL_HM_MODE 1 // Accelerometer high-performance mode (0 enabled, 1 disabled)
-#define LSM6DSO_XL_ULP_EN 0 // Accelerometer ultra-low-power configuration (0 disabled, 1 enabled)
-#define LSM6DSO_LPF2_XL_EN 1 // Accelerometer high-resolution selection (0 for 1st stage of digital filtering, 1 for 2nd stage)
-#define LSM6DSO_HP_SLOPE_XL_EN 0 // Accelerometer high-pass filter selection (0 for low-pass, 1 for high-pass)
-#define LSM6DSO_HPCF_XL 2 // Accelerometer filter configuration and cutoff setting (0 for ODR/4, 1 for ODR/10, 2 for ODR/20, 3 for ODR/45, 4 for ODR/100, 5 for ODR/200, 6 for ODR/400, 7 for ODR/800)
-#define LSM6DSO_ODR_G 16 // Gyroscope output data rate (12.5, 26, 52, 104, 208, 416, 833, 1.66k, 3.33k, 6.66kHz)
-#define LSM6DSO_FS_G 1000 // Gyroscope full scale (250, 500, 1000, 2000dps)
-#define LSM6DSO_G_HM_MODE 1 // Gyroscope high-performance mode (0 enabled, 1 disabled)
-#define LSM6DSO_LPF1_SEL_G 1 // Gyroscope digital LPF1 enable (0 disabled, 1 enabled)
-#define LSM6DSO_FTYPE 3 // Gyroscope LPF1 bandwidth selection (0 ultra light, 1 very light, 2 light, 3 medium, 4 strong, 5 very strong, 6 aggressive, 7 xtreme)
-#define LSM6DSO_HP_EN_G 1 // Gyroscope digital HPF enable (0 HPF disabled, 1 HPF enabled)
-#define LSM6DSO_HPM_G 2 // Gyroscope HPF cutoff selection (0 for 16mHz, 1 for 65mHz, 10 for 260 mHz, 11 for 1.04Hz)
+#define TS (1/FS)-((LIS2DW12_DATA_SIZE/4)*FLASH_WRITE_TIME)
/* Functions definition */
bool acquisition_task(bool verbose);
@@ -108,7 +75,6 @@
void button1_enabled_cb(void);
void button1_onpressed_cb(void);
static char *print_double(char *str, double v);
-float pressure_to_altitude(double pressure);
uint32_t FloatToUint(float n);
float UintToFloat(uint32_t n);
@@ -150,52 +116,9 @@
/* Reset message */
printf("\n\r**************************************************\n\r");
- printf("LELEC2811 IKS01A3 Multisensor Program\n\r");
+ printf("LELEC2811 LIS2DW12 Accelerometer Program\n\r");
printf("**************************************************\n\r");
- /* LIS2MDL magnetometer sensor configuration */
- magnetometer->enable();
- printf("/***** LIS2MDL magnetometer configuration *****/\r\n");
-
- magnetometer->read_id(&id);
- printf("LIS2MDL magnetometer = 0x%X\r\n", id);
-
- magnetometer->set_m_odr(LIS2MDL_ODR);
- magnetometer->get_m_odr(&read_reg);
- printf("LIS2MDL ODR = %1.1f [Hz]\r\n", read_reg);
-
- magnetometer->set_m_lp(LIS2MDL_LP);
- magnetometer->get_m_lp(&read_reg_int);
- printf("LIS2MDL LP = %1d\r\n", read_reg_int);
-
- magnetometer->set_m_lpf(LIS2MDL_LPF);
- magnetometer->get_m_lpf(&read_reg_int);
- printf("LIS2MDL LPF = %1d\r\n", read_reg_int);
-
- magnetometer->set_m_comp_temp_en(LIS2MDL_COMP_TEMP_EN);
- magnetometer->get_m_comp_temp_en(&read_reg_int);
- printf("LIS2MDL COMP_TEMP_EN = %1d\r\n", read_reg_int);
-
- magnetometer->set_m_off_canc(LIS2MDL_OFF_CANC);
- magnetometer->get_m_off_canc(&read_reg_int);
- printf("LIS2MDL OFF_CANC = %1d\r\n", read_reg_int);
-
- /* LPS22HH pressure sensor configuration */
- press_temp->enable();
- printf("/***** LPS22HH pressure sensor configuration *****/\r\n");
-
- press_temp->read_id(&id);
- printf("LPS22HH pressure = 0x%X\r\n", id);
-
- press_temp->set_odr(LPS22HH_ODR, LPS22HH_LOW_NOISE_EN);
- press_temp->get_odr(&read_reg, &read_reg_int);
- printf("LPS22HH ODR = %1.1f [Hz]\r\n", read_reg);
- printf("LPS22HH LOW_NOISE_EN = %1d\r\n", read_reg_int);
-
- press_temp->set_lpfp_cfg(LPS22HH_LPF_CFG);
- press_temp->get_lpfp_cfg(&read_reg_int);
- printf("LPS22HH LPF_CFG = %1d\r\n", read_reg_int);
-
/* LIS2DW12 accelerometer sensor configuration */
accelerometer->enable_x();
printf("/***** LIS2DW12 accelerometer sensor configuration *****/\r\n");
@@ -221,85 +144,6 @@
printf("LIS2DW12 MODE = %1d\r\n", read_reg_int_1);
printf("LIS2DW12 LOW_NOISE = %1d\r\n", read_reg_int_2);
- /* HTS221 relative humidity and temperature sensor configuration */
- hum_temp->enable();
- printf("/***** HTS221 humidity sensor configuration *****/\r\n");
-
- hum_temp->read_id(&id);
- printf("HTS221 humidity & temperature = 0x%X\r\n", id);
-
- hum_temp->set_odr(HTS221_ODR);
- hum_temp->get_odr(&read_reg);
- printf("HTS221 ODR = %1.3f [Hz]\r\n", read_reg);
-
- hum_temp->set_heater(HTS221_HEATER);
- hum_temp->get_heater(&read_reg_int);
- printf("HTS221 HEATER = %1d\r\n", read_reg_int);
-
- hum_temp->set_avg(HTS221_AVGH, HTS221_AVGT);
- hum_temp->get_avg(&read_reg, &read_reg_1);
- printf("HTS221 AVGH = %1.0f\r\n", read_reg);
- printf("HTS221 AVGT = %1.0f\r\n", read_reg_1);
-
- /* STTS751 Temperature sensor configuration */
- temp->enable();
- printf("/***** STTS751 temperature sensor configuration *****/\r\n");
-
- temp->read_id(&id);
- printf("STTS751 temperature = 0x%X\r\n", id);
-
- /* LSM6DSO Accelerometer and gyroscope configuration */
- acc_gyro->enable_x();
- acc_gyro->enable_g();
- printf("/***** LSM6DSO accelerometer and gyroscope sensor configuration *****/\r\n");
-
- acc_gyro->read_id(&id);
- printf("LSM6DSO accelerometer & gyroscope = 0x%X\r\n", id);
-
- acc_gyro->set_x_odr(LSM6DSO_ODR_XL);
- acc_gyro->get_x_odr(&read_reg);
- printf("LSM6DSO ODR_XL = %1.3f [Hz]\r\n", read_reg);
-
- acc_gyro->set_x_fs(LSM6DSO_FS_XL);
- acc_gyro->get_x_fs(&read_reg);
- printf("LSM6DSO FS_XL = %1.3f [g]\r\n", read_reg);
-
- acc_gyro->set_x_power_mode(LSM6DSO_XL_HM_MODE, LSM6DSO_XL_ULP_EN);
- acc_gyro->get_x_power_mode(&read_reg_int, &read_reg_int_1);
- printf("LSM6DSO XL_HM_MODE = %1d\r\n", read_reg_int);
- printf("LSM6DSO XL_ULP_EN = %1d\r\n", read_reg_int_1);
-
- acc_gyro->set_x_lpf2_en(LSM6DSO_LPF2_XL_EN);
- acc_gyro->get_x_lpf2_en(&read_reg_int);
- printf("LSM6DSO LPF2_XL_EN = %1d\r\n", read_reg_int);
-
- acc_gyro->set_x_filter_config(LSM6DSO_HP_SLOPE_XL_EN, LSM6DSO_HPCF_XL);
- acc_gyro->get_x_filter_config(&read_reg_int, &read_reg_int_1);
- printf("LSM6DSO HP_SLOPE_XL_EN = %1d\r\n", read_reg_int);
- printf("LSM6DSO HPCF_XL = %1d\r\n", read_reg_int_1);
-
- acc_gyro->set_g_odr(LSM6DSO_ODR_G);
- acc_gyro->get_g_odr(&read_reg);
- printf("LSM6DSO ODR_G = %1.3f [Hz]\r\n", read_reg);
-
- acc_gyro->set_g_fs(LSM6DSO_FS_XL);
- acc_gyro->get_g_fs(&read_reg);
- printf("LSM6DSO FS_G = %1.3f [dps]\r\n", read_reg);
-
- acc_gyro->set_g_power_mode(LSM6DSO_G_HM_MODE);
- acc_gyro->get_g_power_mode(&read_reg_int);
- printf("LSM6DSO G_HM_MODE = %1d\r\n", read_reg_int);
-
- acc_gyro->set_g_lpf_config(LSM6DSO_LPF1_SEL_G, LSM6DSO_FTYPE);
- acc_gyro->get_g_lpf_config(&read_reg_int, &read_reg_int_1);
- printf("LSM6DSO LPF1_SEL_G = %1d\r\n", read_reg_int);
- printf("LSM6DSO FTYPE = %1d\r\n", read_reg_int_1);
-
- acc_gyro->set_g_hpf_config(LSM6DSO_HP_EN_G, LSM6DSO_HPM_G);
- acc_gyro->get_g_hpf_config(&read_reg_int, &read_reg_int_1);
- printf("LSM6DSO HP_EN_G = %1d\r\n", read_reg_int);
- printf("LSM6DSO HPM_G = %1d\r\n", read_reg_int_1);
-
/* Print Flash memory information */
print_flash_info();
@@ -321,7 +165,7 @@
if (save_data) {
// Acquisition task
- save_data = acquisition_task(true);
+ save_data = acquisition_task(false);
}
else {
// Read task
@@ -333,63 +177,28 @@
/* Acquisition task */
bool acquisition_task(bool verbose)
{
- int32_t m_axes[3];
int32_t acc_axes[3];
- int32_t acc_axes_1[3];
- int32_t gyro_axes[3];
- float pressure_value, hum_value, temp_value, temp_value_1;
- char buffer[32];
-
- uint32_t buffer_size = FLASH_PAGE_SIZE/4;
- uint32_t data_ind = 0;
- uint32_t data_buffer[buffer_size];
-
uint32_t Flash_addr = FLASH_BANK2_BASE;
while (Flash_addr <= FLASH_BANK2_END-FLASH_PAGE_SIZE+1) {
// Read sensors data
- magnetometer->get_m_axes(m_axes);
- press_temp->get_pressure(&pressure_value);
accelerometer->get_x_axes(acc_axes);
- hum_temp->get_temperature(&temp_value);
- hum_temp->get_humidity(&hum_value);
- temp->get_temperature(&temp_value_1);
- acc_gyro->get_x_axes(acc_axes_1);
- acc_gyro->get_g_axes(gyro_axes);
// Save data to Flash memory
- for (int i=0; i<3; i++) {
- // Write page in Flash memory
- if (data_ind >= buffer_size) {
- write_flash(Flash_addr, &data_buffer[0], buffer_size, false);
- Flash_addr += FLASH_PAGE_SIZE;
- data_ind = 0;
- }
-
- // Write data to buffer
- data_buffer[data_ind] = (uint32_t) m_axes[i];
- data_ind++;
- }
+ write_flash(Flash_addr, (uint32_t*) &acc_axes[0], 3, false);
+ Flash_addr += LIS2DW12_DATA_SIZE;
// Print data in terminal
if (verbose) {
- printf("LIS2MDL: [mag/mgauss] %6d, %6d, %6d\r\n", ((uint32_t) m_axes[0]), ((uint32_t) m_axes[1]), ((uint32_t) m_axes[2]));
- printf("LPS22HH: [press/mbar] %1.3f, [alt/m] %1.3f\r\n", pressure_value, pressure_to_altitude(pressure_value));
- printf("HTS221: [temp/deg C] %1.3f, [hum/%%] %1.3f\r\n", temp_value, hum_value);
- printf("STTS751 [temp/deg C] %1.3f\r\n", temp_value_1);
printf("LIS2DW12: [acc/mg] %6d, %6d, %6d\r\n", ((uint32_t) acc_axes[0]), ((uint32_t) acc_axes[1]), ((uint32_t) acc_axes[2]));
- printf("LSM6DSO: [acc/mg] %6d, %6d, %6d\r\n", ((uint32_t) acc_axes_1[0]), ((uint32_t) acc_axes_1[1]), ((uint32_t) acc_axes_1[2]));
- printf("LSM6DSO: [gyro/mdps] %6d, %6d, %6d\r\n", ((uint32_t) gyro_axes[0]), ((uint32_t) gyro_axes[1]), ((uint32_t) gyro_axes[2]));
}
// Wait for acquisition period
- wait(1/FS);
+ wait(TS);
// Stop saving data when button is pushed
if (button1_pressed) {
button1_pressed = false;
- // Save remaining data to Flash memory
- write_flash(Flash_addr, &data_buffer[0], data_ind, false);
printf("Data acquisition stopped\r\n");
printf("Press 'R' to read the data\r\n");
return false;
@@ -418,21 +227,21 @@
// Read Flash memory if 'R' is pressed
if ((pc_input == 'r') || (pc_input == 'R')) {
// Data labels
- printf("mag_X\tmag_Y\tmag_Z\r\n");
+ printf("acc_X\tacc_Y\tacc_Z\r\n");
// Read 1st Flash data
uint32_t Flash_addr_temp = FLASH_BANK2_BASE;
- read_flash(Flash_addr_temp, &Flash_rdata[0], LIS2MDL_DATA_SIZE);
+ read_flash(Flash_addr_temp, &Flash_rdata[0], LIS2DW12_DATA_SIZE);
// Read Flash data
- while ((Flash_addr_temp <= FLASH_BANK2_END-LIS2MDL_DATA_SIZE+1) && !flash_empty) {
+ while ((Flash_addr_temp <= FLASH_BANK2_END-LIS2DW12_DATA_SIZE+1) && !flash_empty) {
// Print read data in the terminal
printf("%6d\t%6d\t%6d\r\n", Flash_rdata[0], Flash_rdata[1], Flash_rdata[2]);
- Flash_addr_temp += LIS2MDL_DATA_SIZE;
+ Flash_addr_temp += LIS2DW12_DATA_SIZE;
// Check if the next address is not empty (erased Flash only contains 0)
- if (Flash_addr_temp <= FLASH_BANK2_END-LIS2MDL_DATA_SIZE+1) {
- read_flash(Flash_addr_temp, &Flash_rdata[0], LIS2MDL_DATA_SIZE);
+ if (Flash_addr_temp <= FLASH_BANK2_END-LIS2DW12_DATA_SIZE+1) {
+ read_flash(Flash_addr_temp, &Flash_rdata[0], LIS2DW12_DATA_SIZE);
if ((Flash_rdata[0] == 0) && (Flash_rdata[1] == 0) && (Flash_rdata[2] == 0)) {
flash_empty = true;
}
@@ -578,12 +387,6 @@
return str;
}
-/* Pressure to altitude conversion */
-float pressure_to_altitude(double pressure)
-{
- return 44330.77 * (1-pow(pressure/P0, 0.1902632));
-}
-
uint32_t FloatToUint(float n)
{
return (uint32_t)(*(uint32_t*)&n);