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: ST_INTERFACES X_NUCLEO_COMMON
Fork of X_NUCLEO_IKS01A1 by
Diff: Components/lsm6ds0/lsm6ds0_class.cpp
- Revision:
- 24:92cc9c6e4b2b
- Parent:
- 7:a2bb3d5e12e9
- Child:
- 57:04563dd74269
--- a/Components/lsm6ds0/lsm6ds0_class.cpp Fri May 29 16:50:56 2015 +0200
+++ b/Components/lsm6ds0/lsm6ds0_class.cpp Wed Jun 03 14:57:57 2015 +0200
@@ -43,8 +43,8 @@
/* Methods -------------------------------------------------------------------*/
/* betzw - based on:
- X-CUBE-MEMS1/trunk/Drivers/BSP/Components/lsm6ds0/lsm6ds0.c: revision #184,
- X-CUBE-MEMS1/trunk: revision #293
+ X-CUBE-MEMS1/trunk/Drivers/BSP/Components/lsm6ds0/lsm6ds0.c: revision #400,
+ X-CUBE-MEMS1/trunk: revision #402
*/
/**
* @brief Set LSM6DS0 Initialization
@@ -53,106 +53,54 @@
*/
IMU_6AXES_StatusTypeDef LSM6DS0::LSM6DS0_Init(IMU_6AXES_InitTypeDef *LSM6DS0_Init)
{
- uint8_t tmp1 = 0x00;
-
- /* Configure the low level interface ---------------------------------------*/
- if(LSM6DS0_IO_Init() != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- /******* Gyroscope init *******/
-
- if(LSM6DS0_IO_Read(&tmp1, LSM6DS0_XG_CTRL_REG1_G, 1) != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- /* Output Data Rate selection */
- tmp1 &= ~(LSM6DS0_G_ODR_MASK);
- tmp1 |= LSM6DS0_Init->G_OutputDataRate;
-
- /* Full scale selection */
- tmp1 &= ~(LSM6DS0_G_FS_MASK);
- tmp1 |= LSM6DS0_Init->G_FullScale;
-
- if(LSM6DS0_IO_Write(&tmp1, LSM6DS0_XG_CTRL_REG1_G, 1) != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- if(LSM6DS0_IO_Read(&tmp1, LSM6DS0_XG_CTRL_REG4, 1) != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- /* Enable X axis selection */
- tmp1 &= ~(LSM6DS0_G_XEN_MASK);
- tmp1 |= LSM6DS0_Init->G_X_Axis;
-
- /* Enable Y axis selection */
- tmp1 &= ~(LSM6DS0_G_YEN_MASK);
- tmp1 |= LSM6DS0_Init->G_Y_Axis;
-
- /* Enable Z axis selection */
- tmp1 &= ~(LSM6DS0_G_ZEN_MASK);
- tmp1 |= LSM6DS0_Init->G_Z_Axis;
-
- if(LSM6DS0_IO_Write(&tmp1, LSM6DS0_XG_CTRL_REG4, 1) != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- /******************************/
-
- /***** Accelerometer init *****/
-
- if(LSM6DS0_IO_Read(&tmp1, LSM6DS0_XG_CTRL_REG6_XL, 1) != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- /* Output Data Rate selection */
- tmp1 &= ~(LSM6DS0_XL_ODR_MASK);
- tmp1 |= LSM6DS0_Init->X_OutputDataRate;
-
- /* Full scale selection */
- tmp1 &= ~(LSM6DS0_XL_FS_MASK);
- tmp1 |= LSM6DS0_Init->X_FullScale;
-
- if(LSM6DS0_IO_Write(&tmp1, LSM6DS0_XG_CTRL_REG6_XL, 1) != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- if(LSM6DS0_IO_Read(&tmp1, LSM6DS0_XG_CTRL_REG5_XL, 1) != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- /* Enable X axis selection */
- tmp1 &= ~(LSM6DS0_XL_XEN_MASK);
- tmp1 |= LSM6DS0_Init->X_X_Axis;
-
- /* Enable Y axis selection */
- tmp1 &= ~(LSM6DS0_XL_YEN_MASK);
- tmp1 |= LSM6DS0_Init->X_Y_Axis;
-
- /* Enable Z axis selection */
- tmp1 &= ~(LSM6DS0_XL_ZEN_MASK);
- tmp1 |= LSM6DS0_Init->X_Z_Axis;
-
- if(LSM6DS0_IO_Write(&tmp1, LSM6DS0_XG_CTRL_REG5_XL, 1) != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- /* Configure interrupt lines */
- LSM6DS0_IO_ITConfig();
-
- return IMU_6AXES_OK;
-
- /******************************/
+ /* Configure the low level interface ---------------------------------------*/
+ if(LSM6DS0_IO_Init() != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ /******* Gyroscope init *******/
+
+ if(LSM6DS0_G_Set_ODR( LSM6DS0_Init->G_OutputDataRate ) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ if(LSM6DS0_G_Set_FS( LSM6DS0_Init->G_FullScale ) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ if(LSM6DS0_G_Set_Axes_Status(LSM6DS0_Init->G_X_Axis, LSM6DS0_Init->G_Y_Axis, LSM6DS0_Init->G_Z_Axis) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ /******************************/
+
+ /***** Accelerometer init *****/
+
+ if(LSM6DS0_X_Set_ODR( LSM6DS0_Init->X_OutputDataRate ) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ if(LSM6DS0_X_Set_FS( LSM6DS0_Init->X_FullScale ) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ if(LSM6DS0_X_Set_Axes_Status(LSM6DS0_Init->X_X_Axis, LSM6DS0_Init->X_Y_Axis, LSM6DS0_Init->X_Z_Axis) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ /* Configure interrupt lines */
+ LSM6DS0_IO_ITConfig();
+
+ return IMU_6AXES_OK;
+
+ /******************************/
}
@@ -163,12 +111,12 @@
*/
IMU_6AXES_StatusTypeDef LSM6DS0::LSM6DS0_Read_XG_ID(uint8_t *xg_id)
{
- if(!xg_id)
- {
- return IMU_6AXES_ERROR;
- }
-
- return LSM6DS0_IO_Read(xg_id, LSM6DS0_XG_WHO_AM_I_ADDR, 1);
+ if(!xg_id)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ return LSM6DS0_IO_Read(xg_id, LSM6DS0_XG_WHO_AM_I_ADDR, 1);
}
@@ -179,30 +127,33 @@
*/
IMU_6AXES_StatusTypeDef LSM6DS0::LSM6DS0_X_GetAxesRaw(int16_t *pData)
{
- uint8_t tempReg[2] = {0,0};
-
- if(LSM6DS0_IO_Read(&tempReg[0], (LSM6DS0_XG_OUT_X_L_XL | LSM6DS0_I2C_MULTIPLEBYTE_CMD), 2) != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- pData[0] = ((((int16_t)tempReg[1]) << 8)+(int16_t)tempReg[0]);
-
- if(LSM6DS0_IO_Read(&tempReg[0], (LSM6DS0_XG_OUT_Y_L_XL | LSM6DS0_I2C_MULTIPLEBYTE_CMD), 2) != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- pData[1] = ((((int16_t)tempReg[1]) << 8)+(int16_t)tempReg[0]);
-
- if(LSM6DS0_IO_Read(&tempReg[0], (LSM6DS0_XG_OUT_Z_L_XL | LSM6DS0_I2C_MULTIPLEBYTE_CMD), 2) != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- pData[2] = ((((int16_t)tempReg[1]) << 8)+(int16_t)tempReg[0]);
-
- return IMU_6AXES_OK;
+ uint8_t tempReg[2] = {0, 0};
+
+ if(LSM6DS0_IO_Read(&tempReg[0], (LSM6DS0_XG_OUT_X_L_XL | LSM6DS0_I2C_MULTIPLEBYTE_CMD),
+ 2) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ pData[0] = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]);
+
+ if(LSM6DS0_IO_Read(&tempReg[0], (LSM6DS0_XG_OUT_Y_L_XL | LSM6DS0_I2C_MULTIPLEBYTE_CMD),
+ 2) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ pData[1] = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]);
+
+ if(LSM6DS0_IO_Read(&tempReg[0], (LSM6DS0_XG_OUT_Z_L_XL | LSM6DS0_I2C_MULTIPLEBYTE_CMD),
+ 2) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ pData[2] = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]);
+
+ return IMU_6AXES_OK;
}
@@ -213,40 +164,24 @@
*/
IMU_6AXES_StatusTypeDef LSM6DS0::LSM6DS0_X_GetAxes(int32_t *pData)
{
- uint8_t tempReg = 0x00;
- int16_t pDataRaw[3];
- float sensitivity = 0;
-
- if(LSM6DS0_X_GetAxesRaw(pDataRaw) != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- if(LSM6DS0_IO_Read(&tempReg, LSM6DS0_XG_CTRL_REG6_XL, 1) != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- tempReg &= LSM6DS0_XL_FS_MASK;
-
- switch(tempReg)
- {
- case LSM6DS0_XL_FS_2G:
- sensitivity = 0.061;
- break;
- case LSM6DS0_XL_FS_4G:
- sensitivity = 0.122;
- break;
- case LSM6DS0_XL_FS_8G:
- sensitivity = 0.244;
- break;
- }
-
- pData[0] = (int32_t)(pDataRaw[0] * sensitivity);
- pData[1] = (int32_t)(pDataRaw[1] * sensitivity);
- pData[2] = (int32_t)(pDataRaw[2] * sensitivity);
-
- return IMU_6AXES_OK;
+ int16_t pDataRaw[3];
+ float sensitivity = 0;
+
+ if(LSM6DS0_X_GetAxesRaw(pDataRaw) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ if(LSM6DS0_X_GetSensitivity( &sensitivity ) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ pData[0] = (int32_t)(pDataRaw[0] * sensitivity);
+ pData[1] = (int32_t)(pDataRaw[1] * sensitivity);
+ pData[2] = (int32_t)(pDataRaw[2] * sensitivity);
+
+ return IMU_6AXES_OK;
}
@@ -257,30 +192,119 @@
*/
IMU_6AXES_StatusTypeDef LSM6DS0::LSM6DS0_G_GetAxesRaw(int16_t *pData)
{
- uint8_t tempReg[2] = {0,0};
-
- if(LSM6DS0_IO_Read(&tempReg[0], (LSM6DS0_XG_OUT_X_L_G | LSM6DS0_I2C_MULTIPLEBYTE_CMD), 2) != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- pData[0] = ((((int16_t)tempReg[1]) << 8)+(int16_t)tempReg[0]);
+ uint8_t tempReg[2] = {0, 0};
+
+ if(LSM6DS0_IO_Read(&tempReg[0], (LSM6DS0_XG_OUT_X_L_G | LSM6DS0_I2C_MULTIPLEBYTE_CMD),
+ 2) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ pData[0] = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]);
+
+ if(LSM6DS0_IO_Read(&tempReg[0], (LSM6DS0_XG_OUT_Y_L_G | LSM6DS0_I2C_MULTIPLEBYTE_CMD),
+ 2) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ pData[1] = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]);
+
+ if(LSM6DS0_IO_Read(&tempReg[0], (LSM6DS0_XG_OUT_Z_L_G | LSM6DS0_I2C_MULTIPLEBYTE_CMD),
+ 2) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ pData[2] = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]);
+
+ return IMU_6AXES_OK;
+}
- if(LSM6DS0_IO_Read(&tempReg[0], (LSM6DS0_XG_OUT_Y_L_G | LSM6DS0_I2C_MULTIPLEBYTE_CMD), 2) != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- pData[1] = ((((int16_t)tempReg[1]) << 8)+(int16_t)tempReg[0]);
+/**
+ * @brief Set the status of the axes for accelerometer
+ * @param enableX the status of the x axis to be set
+ * @param enableY the status of the y axis to be set
+ * @param enableZ the status of the z axis to be set
+ * @retval IMU_6AXES_OK in case of success, an error code otherwise
+ */
+IMU_6AXES_StatusTypeDef LSM6DS0::LSM6DS0_X_Set_Axes_Status(uint8_t enableX, uint8_t enableY, uint8_t enableZ)
+{
+ uint8_t tmp1 = 0x00;
+ uint8_t eX = 0x00;
+ uint8_t eY = 0x00;
+ uint8_t eZ = 0x00;
+
+ eX = ( enableX == 0 ) ? LSM6DS0_XL_XEN_DISABLE : LSM6DS0_XL_XEN_ENABLE;
+ eY = ( enableY == 0 ) ? LSM6DS0_XL_YEN_DISABLE : LSM6DS0_XL_YEN_ENABLE;
+ eZ = ( enableZ == 0 ) ? LSM6DS0_XL_ZEN_DISABLE : LSM6DS0_XL_ZEN_ENABLE;
+
+ if(LSM6DS0_IO_Read(&tmp1, LSM6DS0_XG_CTRL_REG5_XL, 1) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ /* Enable X axis selection */
+ tmp1 &= ~(LSM6DS0_XL_XEN_MASK);
+ tmp1 |= eX;
+
+ /* Enable Y axis selection */
+ tmp1 &= ~(LSM6DS0_XL_YEN_MASK);
+ tmp1 |= eY;
+
+ /* Enable Z axis selection */
+ tmp1 &= ~(LSM6DS0_XL_ZEN_MASK);
+ tmp1 |= eZ;
+
+ if(LSM6DS0_IO_Write(&tmp1, LSM6DS0_XG_CTRL_REG5_XL, 1) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ return IMU_6AXES_OK;
+}
- if(LSM6DS0_IO_Read(&tempReg[0], (LSM6DS0_XG_OUT_Z_L_G | LSM6DS0_I2C_MULTIPLEBYTE_CMD), 2) != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- pData[2] = ((((int16_t)tempReg[1]) << 8)+(int16_t)tempReg[0]);
-
- return IMU_6AXES_OK;
+/**
+ * @brief Set the status of the axes for gyroscope
+ * @param enableX the status of the x axis to be set
+ * @param enableY the status of the y axis to be set
+ * @param enableZ the status of the z axis to be set
+ * @retval IMU_6AXES_OK in case of success, an error code otherwise
+ */
+IMU_6AXES_StatusTypeDef LSM6DS0::LSM6DS0_G_Set_Axes_Status(uint8_t enableX, uint8_t enableY, uint8_t enableZ)
+{
+ uint8_t tmp1 = 0x00;
+ uint8_t eX = 0x00;
+ uint8_t eY = 0x00;
+ uint8_t eZ = 0x00;
+
+ eX = ( enableX == 0 ) ? LSM6DS0_G_XEN_DISABLE : LSM6DS0_G_XEN_ENABLE;
+ eY = ( enableY == 0 ) ? LSM6DS0_G_YEN_DISABLE : LSM6DS0_G_YEN_ENABLE;
+ eZ = ( enableZ == 0 ) ? LSM6DS0_G_ZEN_DISABLE : LSM6DS0_G_ZEN_ENABLE;
+
+ if(LSM6DS0_IO_Read(&tmp1, LSM6DS0_XG_CTRL_REG4, 1) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ /* Enable X axis selection */
+ tmp1 &= ~(LSM6DS0_G_XEN_MASK);
+ tmp1 |= eX;
+
+ /* Enable Y axis selection */
+ tmp1 &= ~(LSM6DS0_G_YEN_MASK);
+ tmp1 |= eY;
+
+ /* Enable Z axis selection */
+ tmp1 &= ~(LSM6DS0_G_ZEN_MASK);
+ tmp1 |= eZ;
+
+ if(LSM6DS0_IO_Write(&tmp1, LSM6DS0_XG_CTRL_REG4, 1) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ return IMU_6AXES_OK;
}
@@ -291,40 +315,105 @@
*/
IMU_6AXES_StatusTypeDef LSM6DS0::LSM6DS0_G_GetAxes(int32_t *pData)
{
- uint8_t tempReg = 0x00;
- int16_t pDataRaw[3];
- float sensitivity = 0;
-
- if(LSM6DS0_G_GetAxesRaw(pDataRaw) != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- if(LSM6DS0_IO_Read(&tempReg, LSM6DS0_XG_CTRL_REG1_G, 1) != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- tempReg &= LSM6DS0_G_FS_MASK;
+ int16_t pDataRaw[3];
+ float sensitivity = 0;
+
+ if(LSM6DS0_G_GetAxesRaw(pDataRaw) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ if(LSM6DS0_G_GetSensitivity( &sensitivity ) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ pData[0] = (int32_t)(pDataRaw[0] * sensitivity);
+ pData[1] = (int32_t)(pDataRaw[1] * sensitivity);
+ pData[2] = (int32_t)(pDataRaw[2] * sensitivity);
+
+ return IMU_6AXES_OK;
+}
- switch(tempReg)
- {
- case LSM6DS0_G_FS_245:
- sensitivity = 8.75;
- break;
- case LSM6DS0_G_FS_500:
- sensitivity = 17.50;
- break;
- case LSM6DS0_G_FS_2000:
- sensitivity = 70;
- break;
- }
+/**
+ * @brief Read Accelero Output Data Rate
+ * @param odr the pointer where the accelerometer output data rate is stored
+ * @retval IMU_6AXES_OK in case of success, an error code otherwise
+ */
+IMU_6AXES_StatusTypeDef LSM6DS0::LSM6DS0_X_Get_ODR( float *odr )
+{
+ /*Here we have to add the check if the parameters are valid*/
+ uint8_t tempReg = 0x00;
+
+ if(LSM6DS0_IO_Read( &tempReg, LSM6DS0_XG_CTRL_REG6_XL, 1 ) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ tempReg &= LSM6DS0_XL_ODR_MASK;
+
+ switch( tempReg )
+ {
+ case LSM6DS0_XL_ODR_PD:
+ *odr = 0.0f;
+ break;
+ case LSM6DS0_XL_ODR_10HZ:
+ *odr = 10.0f;
+ break;
+ case LSM6DS0_XL_ODR_50HZ:
+ *odr = 50.0f;
+ break;
+ case LSM6DS0_XL_ODR_119HZ:
+ *odr = 119.0f;
+ break;
+ case LSM6DS0_XL_ODR_238HZ:
+ *odr = 238.0f;
+ break;
+ case LSM6DS0_XL_ODR_476HZ:
+ *odr = 476.0f;
+ break;
+ case LSM6DS0_XL_ODR_952HZ:
+ *odr = 952.0f;
+ break;
+ default:
+ break;
+ }
+
+ return IMU_6AXES_OK;
+}
- pData[0] = (int32_t)(pDataRaw[0] * sensitivity);
- pData[1] = (int32_t)(pDataRaw[1] * sensitivity);
- pData[2] = (int32_t)(pDataRaw[2] * sensitivity);
-
- return IMU_6AXES_OK;
+/**
+ * @brief Write Accelero Output Data Rate
+ * @param odr the accelerometer output data rate to be set
+ * @retval IMU_6AXES_OK in case of success, an error code otherwise
+ */
+IMU_6AXES_StatusTypeDef LSM6DS0::LSM6DS0_X_Set_ODR( float odr )
+{
+ uint8_t new_odr = 0x00;
+ uint8_t tempReg = 0x00;
+
+ new_odr = ( odr <= 0.0f ) ? LSM6DS0_XL_ODR_PD /* Power Down */
+ : ( odr <= 10.0f ) ? LSM6DS0_XL_ODR_10HZ
+ : ( odr <= 50.0f ) ? LSM6DS0_XL_ODR_50HZ
+ : ( odr <= 119.0f ) ? LSM6DS0_XL_ODR_119HZ
+ : ( odr <= 238.0f ) ? LSM6DS0_XL_ODR_238HZ
+ : ( odr <= 476.0f ) ? LSM6DS0_XL_ODR_476HZ
+ : LSM6DS0_XL_ODR_952HZ;
+
+ if(LSM6DS0_IO_Read( &tempReg, LSM6DS0_XG_CTRL_REG6_XL, 1 ) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ tempReg &= ~(LSM6DS0_XL_ODR_MASK);
+ tempReg |= new_odr;
+
+ if(LSM6DS0_IO_Write(&tempReg, LSM6DS0_XG_CTRL_REG6_XL, 1) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ return IMU_6AXES_OK;
}
/**
@@ -332,69 +421,287 @@
* @param pfData the pointer where the accelerometer sensitivity is stored
* @retval IMU_6AXES_OK in case of success, an error code otherwise
*/
-IMU_6AXES_StatusTypeDef LSM6DS0::LSM6DS0_X_GetSensitivity( float *pfData )
+IMU_6AXES_StatusTypeDef LSM6DS0::LSM6DS0_X_GetSensitivity( float *pfData )
{
- /*Here we have to add the check if the parameters are valid*/
- uint8_t tempReg = 0x00;
-
- if(LSM6DS0_IO_Read( &tempReg, LSM6DS0_XG_CTRL_REG6_XL, 1 ) != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- tempReg &= LSM6DS0_XL_FS_MASK;
-
- switch( tempReg )
- {
- case LSM6DS0_XL_FS_2G:
- *pfData = 0.061;
- break;
- case LSM6DS0_XL_FS_4G:
- *pfData = 0.122;
- break;
- case LSM6DS0_XL_FS_8G:
- *pfData = 0.244;
- break;
- default:
- break;
- }
-
- return IMU_6AXES_OK;
+ /*Here we have to add the check if the parameters are valid*/
+ uint8_t tempReg = 0x00;
+
+ if(LSM6DS0_IO_Read( &tempReg, LSM6DS0_XG_CTRL_REG6_XL, 1 ) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ tempReg &= LSM6DS0_XL_FS_MASK;
+
+ switch( tempReg )
+ {
+ case LSM6DS0_XL_FS_2G:
+ *pfData = 0.061f;
+ break;
+ case LSM6DS0_XL_FS_4G:
+ *pfData = 0.122f;
+ break;
+ case LSM6DS0_XL_FS_8G:
+ *pfData = 0.244f;
+ break;
+ case LSM6DS0_XL_FS_16G:
+ *pfData = 0.732f;
+ break;
+ default:
+ break;
+ }
+
+ return IMU_6AXES_OK;
+}
+
+/**
+ * @brief Read Accelero Full Scale
+ * @param fullScale the pointer where the accelerometer full scale is stored
+ * @retval IMU_6AXES_OK in case of success, an error code otherwise
+ */
+IMU_6AXES_StatusTypeDef LSM6DS0::LSM6DS0_X_Get_FS( float *fullScale )
+{
+ /*Here we have to add the check if the parameters are valid*/
+ uint8_t tempReg = 0x00;
+
+ if(LSM6DS0_IO_Read( &tempReg, LSM6DS0_XG_CTRL_REG6_XL, 1 ) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ tempReg &= LSM6DS0_XL_FS_MASK;
+
+ switch( tempReg )
+ {
+ case LSM6DS0_XL_FS_2G:
+ *fullScale = 2.0f;
+ break;
+ case LSM6DS0_XL_FS_4G:
+ *fullScale = 4.0f;
+ break;
+ case LSM6DS0_XL_FS_8G:
+ *fullScale = 8.0f;
+ break;
+ case LSM6DS0_XL_FS_16G:
+ *fullScale = 16.0f;
+ break;
+ default:
+ break;
+ }
+
+ return IMU_6AXES_OK;
}
+/**
+ * @brief Write Accelero Full Scale
+ * @param fullScale the accelerometer full scale to be set
+ * @retval IMU_6AXES_OK in case of success, an error code otherwise
+ */
+IMU_6AXES_StatusTypeDef LSM6DS0::LSM6DS0_X_Set_FS( float fullScale )
+{
+ uint8_t new_fs = 0x00;
+ uint8_t tempReg = 0x00;
+
+ new_fs = ( fullScale <= 2.0f ) ? LSM6DS0_XL_FS_2G
+ : ( fullScale <= 4.0f ) ? LSM6DS0_XL_FS_4G
+ : ( fullScale <= 8.0f ) ? LSM6DS0_XL_FS_8G
+ : LSM6DS0_XL_FS_16G;
+
+ if(LSM6DS0_IO_Read( &tempReg, LSM6DS0_XG_CTRL_REG6_XL, 1 ) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ tempReg &= ~(LSM6DS0_XL_FS_MASK);
+ tempReg |= new_fs;
+
+ if(LSM6DS0_IO_Write(&tempReg, LSM6DS0_XG_CTRL_REG6_XL, 1) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ return IMU_6AXES_OK;
+}
+/**
+ * @brief Read Gyro Output Data Rate
+ * @param odr the pointer where the gyroscope output data rate is stored
+ * @retval IMU_6AXES_OK in case of success, an error code otherwise
+ */
+IMU_6AXES_StatusTypeDef LSM6DS0::LSM6DS0_G_Get_ODR( float *odr )
+{
+ /*Here we have to add the check if the parameters are valid*/
+ uint8_t tempReg = 0x00;
+
+ if(LSM6DS0_IO_Read( &tempReg, LSM6DS0_XG_CTRL_REG1_G, 1 ) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ tempReg &= LSM6DS0_G_ODR_MASK;
+
+ switch( tempReg )
+ {
+ case LSM6DS0_G_ODR_PD:
+ *odr = 0.0f;
+ break;
+ case LSM6DS0_G_ODR_14_9HZ:
+ *odr = 14.9f;
+ break;
+ case LSM6DS0_G_ODR_59_5HZ:
+ *odr = 59.5f;
+ break;
+ case LSM6DS0_G_ODR_119HZ:
+ *odr = 119.0f;
+ break;
+ case LSM6DS0_G_ODR_238HZ:
+ *odr = 238.0f;
+ break;
+ case LSM6DS0_G_ODR_476HZ:
+ *odr = 476.0f;
+ break;
+ case LSM6DS0_G_ODR_952HZ:
+ *odr = 952.0f;
+ break;
+ default:
+ break;
+ }
+
+ return IMU_6AXES_OK;
+}
+
+/**
+ * @brief Write Gyro Output Data Rate
+ * @param odr the gyroscope output data rate to be set
+ * @retval IMU_6AXES_OK in case of success, an error code otherwise
+ */
+IMU_6AXES_StatusTypeDef LSM6DS0::LSM6DS0_G_Set_ODR( float odr )
+{
+ uint8_t new_odr = 0x00;
+ uint8_t tempReg = 0x00;
+
+ new_odr = ( odr <= 0.0f ) ? LSM6DS0_G_ODR_PD /* Power Down */
+ : ( odr <= 14.9f ) ? LSM6DS0_G_ODR_14_9HZ
+ : ( odr <= 59.5f ) ? LSM6DS0_G_ODR_59_5HZ
+ : ( odr <= 119.0f ) ? LSM6DS0_G_ODR_119HZ
+ : ( odr <= 238.0f ) ? LSM6DS0_G_ODR_238HZ
+ : ( odr <= 476.0f ) ? LSM6DS0_G_ODR_476HZ
+ : LSM6DS0_G_ODR_952HZ;
+
+ if(LSM6DS0_IO_Read( &tempReg, LSM6DS0_XG_CTRL_REG1_G, 1 ) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ tempReg &= ~(LSM6DS0_G_ODR_MASK);
+ tempReg |= new_odr;
+
+ if(LSM6DS0_IO_Write(&tempReg, LSM6DS0_XG_CTRL_REG1_G, 1) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ return IMU_6AXES_OK;
+}
/**
* @brief Read Gyro Sensitivity
* @param pfData the pointer where the gyroscope sensitivity is stored
* @retval IMU_6AXES_OK in case of success, an error code otherwise
*/
-IMU_6AXES_StatusTypeDef LSM6DS0::LSM6DS0_G_GetSensitivity( float *pfData )
+IMU_6AXES_StatusTypeDef LSM6DS0::LSM6DS0_G_GetSensitivity( float *pfData )
+{
+ /*Here we have to add the check if the parameters are valid*/
+ uint8_t tempReg = 0x00;
+
+ if(LSM6DS0_IO_Read( &tempReg, LSM6DS0_XG_CTRL_REG1_G, 1 ) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ tempReg &= LSM6DS0_G_FS_MASK;
+
+ switch( tempReg )
+ {
+ case LSM6DS0_G_FS_245:
+ *pfData = 8.75f;
+ break;
+ case LSM6DS0_G_FS_500:
+ *pfData = 17.50f;
+ break;
+ case LSM6DS0_G_FS_2000:
+ *pfData = 70.0f;
+ break;
+ default:
+ break;
+ }
+
+ return IMU_6AXES_OK;
+}
+
+/**
+ * @brief Read Gyro Full Scale
+ * @param fullScale the pointer where the gyroscope full scale is stored
+ * @retval IMU_6AXES_OK in case of success, an error code otherwise
+*/
+IMU_6AXES_StatusTypeDef LSM6DS0::LSM6DS0_G_Get_FS( float *fullScale )
{
- /*Here we have to add the check if the parameters are valid*/
- uint8_t tempReg = 0x00;
-
- if(LSM6DS0_IO_Read( &tempReg, LSM6DS0_XG_CTRL_REG1_G, 1 ) != IMU_6AXES_OK)
- {
- return IMU_6AXES_ERROR;
- }
-
- tempReg &= LSM6DS0_G_FS_MASK;
-
- switch( tempReg )
- {
- case LSM6DS0_G_FS_245:
- *pfData = 8.75;
- break;
- case LSM6DS0_G_FS_500:
- *pfData = 17.50;
- break;
- case LSM6DS0_G_FS_2000:
- *pfData = 70;
- break;
- default:
- break;
- }
-
- return IMU_6AXES_OK;
+ /*Here we have to add the check if the parameters are valid*/
+ uint8_t tempReg = 0x00;
+
+ if(LSM6DS0_IO_Read( &tempReg, LSM6DS0_XG_CTRL_REG1_G, 1 ) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ tempReg &= LSM6DS0_G_FS_MASK;
+
+ switch( tempReg )
+ {
+ case LSM6DS0_G_FS_245:
+ *fullScale = 245.0f;
+ break;
+ case LSM6DS0_G_FS_500:
+ *fullScale = 500.0f;
+ break;
+ case LSM6DS0_G_FS_2000:
+ *fullScale = 2000.0f;
+ break;
+ default:
+ break;
+ }
+
+ return IMU_6AXES_OK;
}
+
+/**
+ * @brief Write Gyro Full Scale
+ * @param fullScale the gyroscope full scale to be set
+ * @retval IMU_6AXES_OK in case of success, an error code otherwise
+*/
+IMU_6AXES_StatusTypeDef LSM6DS0::LSM6DS0_G_Set_FS( float fullScale )
+{
+ uint8_t new_fs = 0x00;
+ uint8_t tempReg = 0x00;
+
+ new_fs = ( fullScale <= 245.0f ) ? LSM6DS0_G_FS_245
+ : ( fullScale <= 500.0f ) ? LSM6DS0_G_FS_500
+ : LSM6DS0_G_FS_2000;
+
+ if(LSM6DS0_IO_Read( &tempReg, LSM6DS0_XG_CTRL_REG1_G, 1 ) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ tempReg &= ~(LSM6DS0_G_FS_MASK);
+ tempReg |= new_fs;
+
+ if(LSM6DS0_IO_Write(&tempReg, LSM6DS0_XG_CTRL_REG1_G, 1) != IMU_6AXES_OK)
+ {
+ return IMU_6AXES_ERROR;
+ }
+
+ return IMU_6AXES_OK;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
