diff --git a/README.md b/README.md index 14e4a26..1d7cb0e 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,23 @@ ``` $ ./lis3dh -init OK -configure OK -poll OK -read OK -x: 0.552, y: -0.864, z: -0.152 -mag: 1.04 -deinit OK +x: 0.5520 g, y: -0.8800 g, z: 0.0760 g, mag: 1.0416 +x: 0.5560 g, y: -0.9000 g, z: -0.0040 g, mag: 1.0579 +x: 0.5840 g, y: -0.8680 g, z: 0.0360 g, mag: 1.0468 +x: 0.5440 g, y: -0.8680 g, z: 0.0920 g, mag: 1.0285 +x: 0.5240 g, y: -0.9000 g, z: -0.0600 g, mag: 1.0432 +x: 0.6040 g, y: -0.8960 g, z: 0.1000 g, mag: 1.0852 +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 ``` \ No newline at end of file diff --git a/lis3dh.c b/lis3dh.c index 4753f72..29ad357 100644 --- a/lis3dh.c +++ b/lis3dh.c @@ -32,6 +32,7 @@ int lis3dh_init(lis3dh_t *lis3dh) { int lis3dh_configure(lis3dh_t *lis3dh) { uint8_t ctrl_reg1, ctrl_reg4; + uint8_t ref; int err = 0; /* last 0b111 enables Z, Y and X axis */ @@ -46,9 +47,19 @@ int lis3dh_configure(lis3dh_t *lis3dh) { 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_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; } @@ -121,7 +132,7 @@ static uint8_t acc_sensitivity(lis3dh_t *lis3dh) { if (mode == LIS3DH_MODE_LP) { return 192; } else if (mode == LIS3DH_MODE_NORMAL) { - return 148; + return 48; } else { return 12; } @@ -145,6 +156,7 @@ int lis3dh_read(lis3dh_t *lis3dh) { have the device auto-increment the address. */ 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; y = (((int16_t)((data[2] << 8) | data[3])) >> scale) * sens; z = (((int16_t)((data[4] << 8) | data[5])) >> scale) * sens; diff --git a/lis3dh.h b/lis3dh.h index 6598664..ea6cd3e 100644 --- a/lis3dh.h +++ b/lis3dh.h @@ -4,6 +4,7 @@ #include /* rates */ +#define LIS3DH_ODR_POWEROFF 0b0000 #define LIS3DH_ODR_1_HZ 0b0001 #define LIS3DH_ODR_10_HZ 0b0010 #define LIS3DH_ODR_25_HZ 0b0011 diff --git a/main.c b/main.c index 0a7495f..e5ef0b6 100644 --- a/main.c +++ b/main.c @@ -23,31 +23,33 @@ int main() { lis.dev.deinit = i2c_deinit; - if (!lis3dh_init(&lis)) { - puts("init OK"); + if (lis3dh_init(&lis)) { + puts("init ERR"); } lis.cfg.mode = LIS3DH_MODE_NORMAL; lis.cfg.range = LIS3DH_FS_2G; lis.cfg.rate = LIS3DH_ODR_100_HZ; - if (!lis3dh_configure(&lis)) { - puts("configure OK"); + if (lis3dh_configure(&lis)) { + puts("configure ERR"); } - if (!lis3dh_poll(&lis)) { - puts("poll OK"); + for(int i=0; i<100; i++) { + if (lis3dh_poll(&lis)) { + puts("poll ERR"); + } + + if (lis3dh_read(&lis)) { + puts("read ERR"); + } + + printf("x: % 04.04f g, y: % 04.04f g, z: % 04.04f g, mag:% 04.04f\n", + lis.acc.x, lis.acc.y, lis.acc.z, accel_mag(&lis)); } - if (!lis3dh_read(&lis)) { - puts("read OK"); - } - - printf("x: %.3g, y: %.3g, z: %.3g\n", lis.acc.x, lis.acc.y, lis.acc.z); - printf("mag: %.3g\n", accel_mag(&lis)); - - if (!lis3dh_deinit(&lis)) { - puts("deinit OK"); + if (lis3dh_deinit(&lis)) { + puts("deinit ERR"); } return 0;