mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
220 lines
7.6 KiB
C
220 lines
7.6 KiB
C
/*
|
|
* Copyright (C) 2014 Freie Universität Berlin
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU Lesser
|
|
* General Public License v2.1. See the file LICENSE in the top level
|
|
* directory for more details.
|
|
*/
|
|
|
|
/**
|
|
* @defgroup drivers_lsm303dlhc LSM303DLHC 3D accelerometer/magnetometer
|
|
* @ingroup drivers_sensors
|
|
* @ingroup drivers_saul
|
|
* @brief Device driver for the LSM303DLHC 3D accelerometer/magnetometer
|
|
*
|
|
* This driver provides @ref drivers_saul capabilities.
|
|
* @{
|
|
*
|
|
* @file
|
|
* @brief Device driver interface for the LSM303DLHC 3D accelerometer/magnetometer
|
|
*
|
|
* @author Thomas Eichinger <thomas.eichinger@fu-berlin.de>
|
|
*/
|
|
|
|
#ifndef LSM303DLHC_H
|
|
#define LSM303DLHC_H
|
|
|
|
#include <stdint.h>
|
|
#include "periph/i2c.h"
|
|
#include "periph/gpio.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @name The sensors default I2C address
|
|
* @{
|
|
*/
|
|
#define LSM303DLHC_ACC_DEFAULT_ADDRESS (0x19)
|
|
#define LSM303DLHC_MAG_DEFAULT_ADDRESS (0x1e)
|
|
/** @} */
|
|
|
|
/**
|
|
* @brief Possible accelerometer sample rates
|
|
*/
|
|
typedef enum {
|
|
LSM303DLHC_ACC_SAMPLE_RATE_1HZ = 0x10, /**< 1Hz sample rate */
|
|
LSM303DLHC_ACC_SAMPLE_RATE_10HZ = 0x20, /**< 10Hz sample rate */
|
|
LSM303DLHC_ACC_SAMPLE_RATE_25HZ = 0x30, /**< 25Hz sample rate */
|
|
LSM303DLHC_ACC_SAMPLE_RATE_50HZ = 0x40, /**< 50Hz sample rate */
|
|
LSM303DLHC_ACC_SAMPLE_RATE_100HZ = 0x50, /**< 100Hz sample rate */
|
|
LSM303DLHC_ACC_SAMPLE_RATE_200HZ = 0x60, /**< 200Hz sample rate */
|
|
LSM303DLHC_ACC_SAMPLE_RATE_400HZ = 0x70, /**< 400Hz sample rate */
|
|
LSM303DLHC_ACC_SAMPLE_RATE_1620HZ = 0x80, /**< 1620Hz sample rate */
|
|
LSM303DLHC_ACC_SAMPLE_RATE_N1344HZ_L5376HZ = 0x90 /**< 1344Hz normal mode,
|
|
* 5376Hz low power mode */
|
|
} lsm303dlhc_acc_sample_rate_t;
|
|
|
|
/**
|
|
* @brief Possible accelerometer scales
|
|
*/
|
|
typedef enum {
|
|
LSM303DLHC_ACC_SCALE_2G = 0x00, /**< +- 2g range */
|
|
LSM303DLHC_ACC_SCALE_4G = 0x10, /**< +- 4g range */
|
|
LSM303DLHC_ACC_SCALE_8G = 0x20, /**< +- 8g range */
|
|
LSM303DLHC_ACC_SCALE_16G = 0x30, /**< +-16g range */
|
|
} lsm303dlhc_acc_scale_t;
|
|
|
|
/**
|
|
* @brief Possible magnetometer sample rates
|
|
*/
|
|
typedef enum {
|
|
LSM303DLHC_MAG_SAMPLE_RATE_0_75HZ = 0x00, /**< 0.75Hz sample rate */
|
|
LSM303DLHC_MAG_SAMPLE_RATE_1_5HZ = 0x04, /**< 1.5 Hz sample rate */
|
|
LSM303DLHC_MAG_SAMPLE_RATE_3HZ = 0x08, /**< 3 Hz sample rate */
|
|
LSM303DLHC_MAG_SAMPLE_RATE_7_5HZ = 0x0c, /**< 7.5 Hz sample rate */
|
|
LSM303DLHC_MAG_SAMPLE_RATE_15HZ = 0x10, /**< 15 Hz sample rate */
|
|
LSM303DLHC_MAG_SAMPLE_RATE_30HZ = 0x14, /**< 30 Hz sample rate */
|
|
LSM303DLHC_MAG_SAMPLE_RATE_75HZ = 0x18, /**< 75 Hz sample rate */
|
|
LSM303DLHC_MAG_SAMPLE_RATE_220HZ = 0x1c, /**< 220 Hz sample rate */
|
|
} lsm303dlhc_mag_sample_rate_t;
|
|
|
|
/**
|
|
* @brief Possible magnetometer gain values
|
|
*/
|
|
typedef enum {
|
|
LSM303DLHC_MAG_GAIN_1100_980_GAUSS = 0x20, /**< 1100Gauss XYZ 980Gauss Z */
|
|
LSM303DLHC_MAG_GAIN_855_760_GAUSS = 0x40, /**< 855Gauss XYZ 760Gauss Z */
|
|
LSM303DLHC_MAG_GAIN_670_600_GAUSS = 0x60, /**< 670Gauss XYZ 600Gauss Z */
|
|
LSM303DLHC_MAG_GAIN_450_400_GAUSS = 0x80, /**< 450Gauss XYZ 400Gauss Z */
|
|
LSM303DLHC_MAG_GAIN_400_355_GAUSS = 0xa0, /**< 400Gauss XYZ 355Gauss Z */
|
|
LSM303DLHC_MAG_GAIN_330_295_GAUSS = 0xc0, /**< 330Gauss XYZ 295Gauss Z */
|
|
LSM303DLHC_MAG_GAIN_230_205_GAUSS = 0xe0, /**< 230Gauss XYZ 205Gauss Z */
|
|
} lsm303dlhc_mag_gain_t;
|
|
|
|
/**
|
|
* @brief 3d data container
|
|
*/
|
|
typedef struct {
|
|
int16_t x_axis; /**< holds the x axis value. WOW! */
|
|
int16_t y_axis; /**< holds the y axis value. Not kidding. */
|
|
int16_t z_axis; /**< surprise, holds the z axis value */
|
|
} lsm303dlhc_3d_data_t;
|
|
|
|
/**
|
|
* @brief Data structure holding all the information needed for initialization
|
|
*/
|
|
typedef struct {
|
|
i2c_t i2c; /**< I2C bus used */
|
|
uint8_t acc_addr; /**< accelerometer I2C address */
|
|
gpio_t acc_pin; /**< accelerometer EXTI pin */
|
|
lsm303dlhc_acc_sample_rate_t acc_rate; /**< accelerometer sample rate */
|
|
lsm303dlhc_acc_scale_t acc_scale; /**< accelerometer scale factor */
|
|
uint8_t mag_addr; /**< magnetometer I2C address */
|
|
gpio_t mag_pin; /**< magnetometer EXTI pin */
|
|
lsm303dlhc_mag_sample_rate_t mag_rate; /**< magnetometer sample rate */
|
|
lsm303dlhc_mag_gain_t mag_gain; /**< magnetometer gain */
|
|
} lsm303dlhc_params_t;
|
|
|
|
/**
|
|
* @brief Device descriptor for LSM303DLHC sensors
|
|
*/
|
|
typedef struct {
|
|
lsm303dlhc_params_t params; /**< device initialization parameters */
|
|
} lsm303dlhc_t;
|
|
|
|
/**
|
|
* @brief Initialize a new LSM303DLHC device
|
|
*
|
|
* @param[in] dev device descriptor of an LSM303DLHC device
|
|
* @param[in] params initialization parameters
|
|
*
|
|
* @return 0 on success
|
|
* @return -1 on error
|
|
*/
|
|
int lsm303dlhc_init(lsm303dlhc_t *dev, const lsm303dlhc_params_t *params);
|
|
|
|
/**
|
|
* @brief Read a accelerometer value from the sensor.
|
|
*
|
|
* @details This function provides raw acceleration data. To get the
|
|
* corresponding values in g please refer to the following
|
|
* table:
|
|
* measurement range | factor
|
|
* --------------------+---------
|
|
* +- 2g | 1*10^-3
|
|
* +- 4g | 2*10^-3
|
|
* +- 8g | 4*10^-3
|
|
* +-16g | 8*10^-3
|
|
*
|
|
* @param[in] dev device descriptor of an LSM303DLHC device
|
|
* @param[out] data the measured accelerometer data
|
|
*
|
|
* @return 0 on success
|
|
* @return -1 on error
|
|
*/
|
|
int lsm303dlhc_read_acc(const lsm303dlhc_t *dev, lsm303dlhc_3d_data_t *data);
|
|
|
|
/**
|
|
* @brief Read a magnetometer value from the sensor.
|
|
*
|
|
* @details This function returns raw magnetic data. To get the
|
|
* corresponding values in gauss please refer to the following
|
|
* table:
|
|
* measurement range | factor
|
|
* --------------------+---------
|
|
* +- 1.3 gauss | 1/1100
|
|
* +- 1.9 gauss | 1/855
|
|
* +- 2.5 gauss | 1/670
|
|
* +- 4.0 gauss | 1/450
|
|
* +- 4.7 gauss | 1/400
|
|
* +- 5.6 gauss | 1/330
|
|
* +- 8.1 gauss | 1/230
|
|
*
|
|
* @param[in] dev device descriptor of an LSM303DLHC device
|
|
* @param[out] data the measured magnetometer data
|
|
*
|
|
* @return 0 on success
|
|
* @return -1 on error
|
|
*/
|
|
int lsm303dlhc_read_mag(const lsm303dlhc_t *dev, lsm303dlhc_3d_data_t *data);
|
|
|
|
/**
|
|
* @brief Read a temperature value from the sensor.
|
|
*
|
|
* @param[in] dev device descriptor of an LSM303DLHC device
|
|
* @param[out] value the measured temperature
|
|
*
|
|
* @return 0 on success
|
|
* @return -1 on error
|
|
*/
|
|
int lsm303dlhc_read_temp(const lsm303dlhc_t *dev, int16_t *value);
|
|
|
|
/**
|
|
* @brief Enable the given sensor
|
|
*
|
|
* @param[in] dev device descriptor of an LSM303DLHC device
|
|
*
|
|
* @return 0 on success
|
|
* @return -1 on error
|
|
*/
|
|
int lsm303dlhc_enable(const lsm303dlhc_t *dev);
|
|
|
|
/**
|
|
* @brief Disable the given sensor
|
|
*
|
|
* @param[in] dev device descriptor of an LSM303DLHC device
|
|
*
|
|
* @return 0 on success
|
|
* @return -1 on error
|
|
*/
|
|
int lsm303dlhc_disable(const lsm303dlhc_t *dev);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* LSM303DLHC_H */
|
|
/** @} */
|