This commit is contained in:
William Clark 2024-01-03 15:41:58 +00:00
parent bce3d7f8f0
commit da27083859
2 changed files with 19 additions and 19 deletions

View File

@ -1,45 +1,47 @@
# LIS3DH # LIS3DH
A C89 driver for the 3-axis accelerometer LIS3DH. Supports both i2c and SPI. A C89 driver for the 3-axis accelerometer LIS3DH. Supports both I2C and SPI.
> ### Features ### Features
> - FIFO > - FIFO
> - HP filter > - HP filter
> - 2G, 4G, 8G and 16G > - 2G, 4G, 8G and 16G
> - Low-power mode, normal mode and high-resolution mode > - Low-power mode, normal mode and high-resolution mode
> - ADC (x3) and temperature sensing > - ADC and temperature sensing
> - Interrupt generation > - Interrupt generation
> - Free-fall detection (soon) > - Free-fall detection
> - Single-click detection > - Single-click detection
> - Double-click detection > - Double-click detection
> - 4D/6D orientation detection (soon) > - 4D/6D orientation detection (soon)
## Examples ## Examples
See the examples/ dir for complete code examples See the `examples/` dir for complete code examples
## Implementation ## Implementation
This driver requires the user to provide pointers to the following abstractely named functions: This driver requires the user to implement the following interface functions:
This project has example interface code for I2C used on Raspberry Pi. This project has example interface code for I2C used on Raspberry Pi.
```c ```c
/* initialise the "interface" */ /* initialise the "interface" */
int init(void); int init(void);
/* read from device register `reg`, `size` amount of bytes and write them to `dst` */ /* read from register `reg`, `size` amount of bytes, and write them to `dst` */
int read(uint8_t reg, uint8_t *dst, uint32_t size); int read(uint8_t reg, uint8_t *dst, uint32_t size);
/* write `value` to device register `reg` */ /* write `value` to register `reg` */
int write(uint8_t reg, uint8_t value); int write(uint8_t reg, uint8_t value);
/* sleep for `dur_us` microseconds */ /* sleep for `dur_us` microseconds */
int sleep(uint32_t dur_us); int sleep(uint32_t dur_us);
/* deinitalise the "interface" */ /* deinitalise the "interface" */
int deinit(void); int deinit(void);
``` ```
All above functions return `0` on success. All above functions return `0` on success, and any non-zero value on error.
The `init` and `deinit` pointers can both be set to `NULL` and they won't be run. If `init` and `deinit` are set to `NULL`, they will be ignored. Useful on microcontrollers.
---
### Using i2c on STM32 ### Using i2c on STM32
Simple example code Example code because I couldn't previously find working examples.
```c ```c
#define LIS3DH_I2C_ADDR 0x18 #define LIS3DH_I2C_ADDR 0x18

View File

@ -4,16 +4,14 @@
Basic example of how to use this device Basic example of how to use this device
### file: fifo.c ### file: fifo.c
Instead of polling for every single [x y z] set, a FIFO with programmable capacity ("watermark") can be used, and then dumped into memory once full. Instead of polling for every single [x y z] set, a FIFO with programmable capacity ("watermark") can be used, and then dumped into memory once full. All FIFO readings use 10-bit resolution regardless of the mode set in `lis.cfg.mode`. The watermark level can be adjusted to a value [0-31] by modifying the `lis.cfg.fifo.fth` property before calling `lis3dh_configure()`.
All FIFO readings use 10-bit resolution regardless of the mode set in `lis.cfg.mode`.
The watermark level can be adjusted to a value [0-31] by modifying the `lis.cfg.fifo.fth` property before calling `lis3dh_configure()`.
The LIS3DH can optionally apply a HP filter on the sample data. It can be used to greatly reduce the "DC acceleration" present. The LIS3DH can optionally apply a HP filter on the sample data. It can be used to greatly reduce the "DC acceleration" present.
### file: interrupts.c ### file: interrupts.c
This device supports two different interrupt "output pins," `INT1` and `INT2`. The appropriate flag must be set in either `cfg.pin1` or `cfg.pin2` and the interrupt source must be configured to trigger into `INT1` or `INT2`. This file contains example code that listens and receives an interrupt when the FIFO watermark is reached i.e. it is full. This device supports two different interrupt "output pins," `INT1` and `INT2`. The appropriate flag must be set in either `cfg.pin1` or `cfg.pin2` and the interrupt source must be configured to trigger into `INT1` or `INT2`.
This file contains example code that listens and receives an interrupt when the FIFO watermark is reached i.e. it is full.
### file: single-click.c ### file: single-click.c
@ -40,6 +38,8 @@ Enable and read built-in temperature sensor
### Inertial interrupts ### Inertial interrupts
There are two interrupt registers, `int1` and `int2` that can be configured for inertial interrupts. The config structs are identical and contain the fields: `zh`, `zl`, `yh`, `yl`, `xh`, `xl`, and more. `zh` stands for `Z_axis_high` and `zl` stands for `Z_axis_low`. If both are enabled, the device will generate an interrupt upon Z-axis acceleration exceeding `threshold`, or upon Z-axis acceleration reading at or below `-threshold` (in OR mode. Not possible in AND mode).
| aoi | en_6d | interrupt mode | | aoi | en_6d | interrupt mode |
|-----|-------|-------------------------| |-----|-------|-------------------------|
@ -65,8 +65,6 @@ An interrupt is generated when all of the configures axes are at or above the th
An interrupt is generated when the device is "stable" in a known direction. The interrupt is active as long as the direction is maintained. An interrupt is generated when the device is "stable" in a known direction. The interrupt is active as long as the direction is maintained.
There are two interrupt registers, `int1` and `int2` that can be configured for inertial interrupts. The config structs are identical and contain the fields: `zh`, `zl`, `yh`, `yl`, `xh`, `xl`, and more. `zh` stands for `Z_axis_high` and `zl` stands for `Z_axis_low`. If both are enabled, the device will generate an interrupt upon Z-axis acceleration exceeding `threshold`, or upon Z-axis acceleration reading at or below `-threshold` (in OR mode. Not possible in AND mode).
### file: inertial-wakeup.c ### file: inertial-wakeup.c
Inertial interrupt example in OR mode (easily changed to AND mode) with configurable axes, threshold and minimum acceleration duration. Inertial interrupt example in OR mode (easily changed to AND mode) with configurable axes, threshold and minimum acceleration duration.