This commit is contained in:
William Clark 2023-12-22 08:26:10 +00:00
parent 509bae290b
commit 31bcd4d12f
4 changed files with 50 additions and 23 deletions

View File

@ -4,11 +4,23 @@
``` ```
$ ./lis3dh $ ./lis3dh
init OK x: 0.5520 g, y: -0.8800 g, z: 0.0760 g, mag: 1.0416
configure OK x: 0.5560 g, y: -0.9000 g, z: -0.0040 g, mag: 1.0579
poll OK x: 0.5840 g, y: -0.8680 g, z: 0.0360 g, mag: 1.0468
read OK x: 0.5440 g, y: -0.8680 g, z: 0.0920 g, mag: 1.0285
x: 0.552, y: -0.864, z: -0.152 x: 0.5240 g, y: -0.9000 g, z: -0.0600 g, mag: 1.0432
mag: 1.04 x: 0.6040 g, y: -0.8960 g, z: 0.1000 g, mag: 1.0852
deinit OK x: 0.5440 g, y: -0.8680 g, z: 0.0000 g, mag: 1.0244
x: 0.5720 g, y: -0.9040 g, z: -0.0160 g, mag: 1.0699
x: 0.5480 g, y: -0.8680 g, z: 0.0200 g, mag: 1.0267
x: 0.5360 g, y: -0.9120 g, z: 0.0240 g, mag: 1.0581
x: 0.5600 g, y: -0.9040 g, z: 0.0000 g, mag: 1.0634
x: 0.5960 g, y: -0.8760 g, z: 0.0640 g, mag: 1.0615
x: 0.5360 g, y: -0.8960 g, z: -0.0040 g, mag: 1.0441
x: 0.5320 g, y: -0.8800 g, z: -0.0080 g, mag: 1.0283
x: 0.5520 g, y: -0.9000 g, z: -0.0440 g, mag: 1.0567
x: 0.5760 g, y: -0.8800 g, z: 0.0320 g, mag: 1.0522
x: 0.5560 g, y: -0.8840 g, z: -0.0240 g, mag: 1.0446
x: 0.5120 g, y: -0.9040 g, z: -0.0360 g, mag: 1.0395
x: 0.6000 g, y: -0.8720 g, z: 0.0320 g, mag: 1.0590
``` ```

View File

@ -32,6 +32,7 @@ int lis3dh_init(lis3dh_t *lis3dh) {
int lis3dh_configure(lis3dh_t *lis3dh) { int lis3dh_configure(lis3dh_t *lis3dh) {
uint8_t ctrl_reg1, ctrl_reg4; uint8_t ctrl_reg1, ctrl_reg4;
uint8_t ref;
int err = 0; int err = 0;
/* last 0b111 enables Z, Y and X axis */ /* last 0b111 enables Z, Y and X axis */
@ -46,9 +47,19 @@ int lis3dh_configure(lis3dh_t *lis3dh) {
ctrl_reg4 |= 0x08; ctrl_reg4 |= 0x08;
} }
/* set LPen */
if (lis3dh->cfg.mode == LIS3DH_MODE_LP) {
ctrl_reg1 |= 0b1000;
}
err |= lis3dh->dev.write(REG_CTRL_REG1, ctrl_reg1); err |= lis3dh->dev.write(REG_CTRL_REG1, ctrl_reg1);
err |= lis3dh->dev.write(REG_CTRL_REG4, ctrl_reg4); err |= lis3dh->dev.write(REG_CTRL_REG4, ctrl_reg4);
/* read REFERENCE to clear internal filter struct */
err |= lis3dh->dev.read(REG_REFERENCE, &ref, 1);
/* sleep for a period TBD ~ ODR */
lis3dh->dev.sleep(5000); /* 5 ms */
return err; return err;
} }
@ -121,7 +132,7 @@ static uint8_t acc_sensitivity(lis3dh_t *lis3dh) {
if (mode == LIS3DH_MODE_LP) { if (mode == LIS3DH_MODE_LP) {
return 192; return 192;
} else if (mode == LIS3DH_MODE_NORMAL) { } else if (mode == LIS3DH_MODE_NORMAL) {
return 148; return 48;
} else { } else {
return 12; return 12;
} }
@ -145,6 +156,7 @@ int lis3dh_read(lis3dh_t *lis3dh) {
have the device auto-increment the address. */ have the device auto-increment the address. */
err |= lis3dh->dev.read(REG_OUT_X_L | 0x80, data, 6); err |= lis3dh->dev.read(REG_OUT_X_L | 0x80, data, 6);
/* x,y,z are now in mg */
x = (((int16_t)((data[0] << 8) | data[1])) >> scale) * sens; x = (((int16_t)((data[0] << 8) | data[1])) >> scale) * sens;
y = (((int16_t)((data[2] << 8) | data[3])) >> scale) * sens; y = (((int16_t)((data[2] << 8) | data[3])) >> scale) * sens;
z = (((int16_t)((data[4] << 8) | data[5])) >> scale) * sens; z = (((int16_t)((data[4] << 8) | data[5])) >> scale) * sens;

View File

@ -4,6 +4,7 @@
#include <stdint.h> #include <stdint.h>
/* rates */ /* rates */
#define LIS3DH_ODR_POWEROFF 0b0000
#define LIS3DH_ODR_1_HZ 0b0001 #define LIS3DH_ODR_1_HZ 0b0001
#define LIS3DH_ODR_10_HZ 0b0010 #define LIS3DH_ODR_10_HZ 0b0010
#define LIS3DH_ODR_25_HZ 0b0011 #define LIS3DH_ODR_25_HZ 0b0011

26
main.c
View File

@ -23,31 +23,33 @@ int main() {
lis.dev.deinit = i2c_deinit; lis.dev.deinit = i2c_deinit;
if (!lis3dh_init(&lis)) { if (lis3dh_init(&lis)) {
puts("init OK"); puts("init ERR");
} }
lis.cfg.mode = LIS3DH_MODE_NORMAL; lis.cfg.mode = LIS3DH_MODE_NORMAL;
lis.cfg.range = LIS3DH_FS_2G; lis.cfg.range = LIS3DH_FS_2G;
lis.cfg.rate = LIS3DH_ODR_100_HZ; lis.cfg.rate = LIS3DH_ODR_100_HZ;
if (!lis3dh_configure(&lis)) { if (lis3dh_configure(&lis)) {
puts("configure OK"); puts("configure ERR");
} }
if (!lis3dh_poll(&lis)) { for(int i=0; i<100; i++) {
puts("poll OK"); if (lis3dh_poll(&lis)) {
puts("poll ERR");
} }
if (!lis3dh_read(&lis)) { if (lis3dh_read(&lis)) {
puts("read OK"); puts("read ERR");
} }
printf("x: %.3g, y: %.3g, z: %.3g\n", lis.acc.x, lis.acc.y, lis.acc.z); printf("x: % 04.04f g, y: % 04.04f g, z: % 04.04f g, mag:% 04.04f\n",
printf("mag: %.3g\n", accel_mag(&lis)); lis.acc.x, lis.acc.y, lis.acc.z, accel_mag(&lis));
}
if (!lis3dh_deinit(&lis)) { if (lis3dh_deinit(&lis)) {
puts("deinit OK"); puts("deinit ERR");
} }
return 0; return 0;