Skip to content

Commit 21321fb

Browse files
microbuildercfriedt
authored andcommitted
drivers: sensor: lsm303dlhc_mag: Fix gain factor
The magnetometer on the LSM303DLHC has a different gain conversion factor for LSB to Gauss for the Z axis than it does for X, Y. This commit takes into account the different conversion factors, and adds the correct coefficients for each gain setting and axis. Signed-off-by: Kevin Townsend <[email protected]>
1 parent f9e2fc3 commit 21321fb

File tree

2 files changed

+30
-16
lines changed

2 files changed

+30
-16
lines changed

drivers/sensor/lsm303dlhc_magn/lsm303dlhc_magn.c

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,18 @@ static int lsm303dlhc_sample_fetch(const struct device *dev,
5252
return 0;
5353
}
5454

55-
static void lsm303dlhc_convert(struct sensor_value *val,
55+
static void lsm303dlhc_convert_xy(struct sensor_value *val,
5656
int64_t raw_val)
5757
{
58-
val->val1 = raw_val / LSM303DLHC_MAGN_LSB_GAUSS;
59-
val->val2 = (1000000 * raw_val / LSM303DLHC_MAGN_LSB_GAUSS) % 1000000;
58+
val->val1 = raw_val / LSM303DLHC_MAGN_LSB_GAUSS_XY;
59+
val->val2 = (1000000 * raw_val / LSM303DLHC_MAGN_LSB_GAUSS_XY) % 1000000;
60+
}
61+
62+
static void lsm303dlhc_convert_z(struct sensor_value *val,
63+
int64_t raw_val)
64+
{
65+
val->val1 = raw_val / LSM303DLHC_MAGN_LSB_GAUSS_Z;
66+
val->val2 = (1000000 * raw_val / LSM303DLHC_MAGN_LSB_GAUSS_Z) % 1000000;
6067
}
6168

6269
static int lsm303dlhc_channel_get(const struct device *dev,
@@ -67,18 +74,18 @@ static int lsm303dlhc_channel_get(const struct device *dev,
6774

6875
switch (chan) {
6976
case SENSOR_CHAN_MAGN_X:
70-
lsm303dlhc_convert(val, drv_data->magn_x);
77+
lsm303dlhc_convert_xy(val, drv_data->magn_x);
7178
break;
7279
case SENSOR_CHAN_MAGN_Y:
73-
lsm303dlhc_convert(val, drv_data->magn_y);
80+
lsm303dlhc_convert_xy(val, drv_data->magn_y);
7481
break;
7582
case SENSOR_CHAN_MAGN_Z:
76-
lsm303dlhc_convert(val, drv_data->magn_z);
83+
lsm303dlhc_convert_z(val, drv_data->magn_z);
7784
break;
7885
case SENSOR_CHAN_MAGN_XYZ:
79-
lsm303dlhc_convert(val, drv_data->magn_x);
80-
lsm303dlhc_convert(val + 1, drv_data->magn_y);
81-
lsm303dlhc_convert(val + 2, drv_data->magn_z);
86+
lsm303dlhc_convert_xy(val, drv_data->magn_x);
87+
lsm303dlhc_convert_xy(val + 1, drv_data->magn_y);
88+
lsm303dlhc_convert_z(val + 2, drv_data->magn_z);
8289
break;
8390
default:
8491
return -ENOTSUP;

drivers/sensor/lsm303dlhc_magn/lsm303dlhc_magn.h

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,26 @@
3737
LSM303DLHC_MAGN_ODR_SHIFT)
3838

3939
#if (CONFIG_LSM303DLHC_MAGN_RANGE == 1)
40-
#define LSM303DLHC_MAGN_LSB_GAUSS 1100
40+
#define LSM303DLHC_MAGN_LSB_GAUSS_XY 1100
41+
#define LSM303DLHC_MAGN_LSB_GAUSS_Z 980
4142
#elif (CONFIG_LSM303DLHC_MAGN_RANGE == 2)
42-
#define LSM303DLHC_MAGN_LSB_GAUSS 760
43+
#define LSM303DLHC_MAGN_LSB_GAUSS_XY 855
44+
#define LSM303DLHC_MAGN_LSB_GAUSS_Z 760
4345
#elif (CONFIG_LSM303DLHC_MAGN_RANGE == 3)
44-
#define LSM303DLHC_MAGN_LSB_GAUSS 600
46+
#define LSM303DLHC_MAGN_LSB_GAUSS_XY 670
47+
#define LSM303DLHC_MAGN_LSB_GAUSS_Z 600
4548
#elif (CONFIG_LSM303DLHC_MAGN_RANGE == 4)
46-
#define LSM303DLHC_MAGN_LSB_GAUSS 400
49+
#define LSM303DLHC_MAGN_LSB_GAUSS_XY 450
50+
#define LSM303DLHC_MAGN_LSB_GAUSS_Z 400
4751
#elif (CONFIG_LSM303DLHC_MAGN_RANGE == 5)
48-
#define LSM303DLHC_MAGN_LSB_GAUSS 355
52+
#define LSM303DLHC_MAGN_LSB_GAUSS_XY 400
53+
#define LSM303DLHC_MAGN_LSB_GAUSS_Z 355
4954
#elif (CONFIG_LSM303DLHC_MAGN_RANGE == 6)
50-
#define LSM303DLHC_MAGN_LSB_GAUSS 295
55+
#define LSM303DLHC_MAGN_LSB_GAUSS_XY 330
56+
#define LSM303DLHC_MAGN_LSB_GAUSS_Z 295
5157
#elif (CONFIG_LSM303DLHC_MAGN_RANGE == 7)
52-
#define LSM303DLHC_MAGN_LSB_GAUSS 205
58+
#define LSM303DLHC_MAGN_LSB_GAUSS_XY 230
59+
#define LSM303DLHC_MAGN_LSB_GAUSS_Z 205
5360
#endif
5461

5562
#define LSM303DLHC_MAGN_FS_SHIFT 5

0 commit comments

Comments
 (0)