amiro-os / include / amiro / accel / lis331dlh.hpp @ 4270bbde
History | View | Annotate | Download (5.662 KB)
| 1 | 58fe0e0b | Thomas Schöpping | #ifndef LIS331DLH_HPP_
|
|---|---|---|---|
| 2 | #define LIS331DLH_HPP_
|
||
| 3 | |||
| 4 | #include <ch.hpp> |
||
| 5 | |||
| 6 | namespace amiro {
|
||
| 7 | |||
| 8 | class HWSPIDriver; |
||
| 9 | |||
| 10 | class LIS331DLH : public chibios_rt::BaseStaticThread<256> { |
||
| 11 | |||
| 12 | public:
|
||
| 13 | |||
| 14 | struct InterruptConfig {
|
||
| 15 | |||
| 16 | uint8_t config; |
||
| 17 | uint8_t ths; |
||
| 18 | uint8_t duration; |
||
| 19 | |||
| 20 | } __attribute__((packed)); |
||
| 21 | |||
| 22 | struct LIS331DLHConfig {
|
||
| 23 | uint8_t ctrl1; |
||
| 24 | uint8_t ctrl2; |
||
| 25 | uint8_t ctrl3; |
||
| 26 | uint8_t ctrl4; |
||
| 27 | uint8_t ctrl5; |
||
| 28 | InterruptConfig int1_cfg; |
||
| 29 | InterruptConfig int2_cfg; |
||
| 30 | }; |
||
| 31 | |||
| 32 | enum {
|
||
| 33 | AOI_OR_INT = 0x00u,
|
||
| 34 | AOI_6MOVE = 0x40u,
|
||
| 35 | AOI_AND_INT = 0x80u,
|
||
| 36 | AOI_6POS = 0xC0u,
|
||
| 37 | ZHIE = 0x20u,
|
||
| 38 | ZLIE = 0x10u,
|
||
| 39 | YHIE = 0x08u,
|
||
| 40 | YLIE = 0x04u,
|
||
| 41 | XHIE = 0x02u,
|
||
| 42 | XLIE = 0x01u,
|
||
| 43 | }; |
||
| 44 | |||
| 45 | enum {
|
||
| 46 | IA = 0x40u,
|
||
| 47 | ZH = 0x20u,
|
||
| 48 | ZL = 0x10u,
|
||
| 49 | YH = 0x08u,
|
||
| 50 | YL = 0x04u,
|
||
| 51 | XH = 0x02u,
|
||
| 52 | XL = 0x01u,
|
||
| 53 | }; |
||
| 54 | |||
| 55 | enum {
|
||
| 56 | THS_MASK = 0x7Fu,
|
||
| 57 | }; |
||
| 58 | |||
| 59 | enum {
|
||
| 60 | DURATION_MASK = 0x7Fu,
|
||
| 61 | }; |
||
| 62 | |||
| 63 | enum {
|
||
| 64 | PM_OFF = 0x00u,
|
||
| 65 | PM_ODR = 0x20u,
|
||
| 66 | PM_0_5_HZ = 0x40u,
|
||
| 67 | PM_1_HZ = 0x60u,
|
||
| 68 | PM_2_HZ = 0x80u,
|
||
| 69 | PM_5_HZ = 0xA0u,
|
||
| 70 | PM_10_HZ = 0xC0u,
|
||
| 71 | DR_50HZ_37LP = 0x00u,
|
||
| 72 | DR_100HZ_74LP = 0x08u,
|
||
| 73 | DR_400HZ_292LP = 0x10u,
|
||
| 74 | DR_1000HZ_780LP = 0x18u,
|
||
| 75 | ZEN = 0x04u,
|
||
| 76 | YEN = 0x02u,
|
||
| 77 | XEN = 0x01u,
|
||
| 78 | }; |
||
| 79 | |||
| 80 | enum {
|
||
| 81 | BOOT_REBOOT = 0x80u,
|
||
| 82 | HPM_NORMAL0 = 0x00u,
|
||
| 83 | HPM_REF = 0x20u,
|
||
| 84 | HPM_NORMAL1 = 0x40u,
|
||
| 85 | FDS_FILTER = 0x10u,
|
||
| 86 | HPEN_INT2 = 0x08u,
|
||
| 87 | HPEN_INT1 = 0x04u,
|
||
| 88 | HPCF_8 = 0x00u,
|
||
| 89 | HPCF_16 = 0x01u,
|
||
| 90 | HPCF_32 = 0x02u,
|
||
| 91 | HPCF_64 = 0x03u,
|
||
| 92 | }; |
||
| 93 | |||
| 94 | enum {
|
||
| 95 | INT_HIGH = 0x00u,
|
||
| 96 | INT_LOW = 0x80u,
|
||
| 97 | PUSH_PULL = 0x00u,
|
||
| 98 | OPEN_DRAIN = 0x40u,
|
||
| 99 | LIR2_LATCH = 0x20u,
|
||
| 100 | I2_CFG_I2 = 0x00u,
|
||
| 101 | I2_CFG_I1_I2 = 0x08u,
|
||
| 102 | I2_CFG_DRY = 0x10u,
|
||
| 103 | I2_CFG_BOOT = 0x18u,
|
||
| 104 | LIR1_LATCH = 0x04u,
|
||
| 105 | I1_CFG_I1 = 0x00u,
|
||
| 106 | I1_CFG_I1_I2 = 0x01u,
|
||
| 107 | I1_CFG_DRY = 0x02u,
|
||
| 108 | I1_CFG_BOOT = 0x03u,
|
||
| 109 | }; |
||
| 110 | |||
| 111 | enum {
|
||
| 112 | BDU_CONT = 0x00u,
|
||
| 113 | BDU_STOP = 0x80u,
|
||
| 114 | BLE_LE = 0x00u,
|
||
| 115 | BLE_BE = 0x40u,
|
||
| 116 | FS_2G = 0x00u,
|
||
| 117 | FS_4G = 0x10u,
|
||
| 118 | FS_8G = 0x30u,
|
||
| 119 | STSIGN_POS = 0x00u,
|
||
| 120 | STSIGN_NEG = 0x08u,
|
||
| 121 | ST_DISABLE = 0x00u,
|
||
| 122 | ST_ENABLE = 0x02u,
|
||
| 123 | SIM_4WI = 0x00u,
|
||
| 124 | SIM_3WI = 0x01u,
|
||
| 125 | }; |
||
| 126 | |||
| 127 | enum {
|
||
| 128 | SLEEP_TO_WAKE_OFF = 0x00u,
|
||
| 129 | SLEEP_TO_WAKE_ON = 0x03u,
|
||
| 130 | }; |
||
| 131 | |||
| 132 | /**
|
||
| 133 | * Return types of getCheck()
|
||
| 134 | */
|
||
| 135 | enum {
|
||
| 136 | CHECK_OK = 0x00,
|
||
| 137 | CHECK_FAIL = 0x01,
|
||
| 138 | }; |
||
| 139 | |||
| 140 | /**
|
||
| 141 | * Top view of the AMiRo with charger in the back (F:Front, B:Back).
|
||
| 142 | * Z is pointing into the ground (Apply right-hand-rule):
|
||
| 143 | * ___________
|
||
| 144 | * / F \
|
||
| 145 | * / X \
|
||
| 146 | * | | |
|
||
| 147 | * | Z---Y |
|
||
| 148 | * | |
|
||
| 149 | * \ /
|
||
| 150 | * \____B______/
|
||
| 151 | */
|
||
| 152 | enum {
|
||
| 153 | AXIS_X = 0x00u,
|
||
| 154 | AXIS_Y = 0x01u,
|
||
| 155 | AXIS_Z = 0x02u,
|
||
| 156 | }; |
||
| 157 | |||
| 158 | //private:
|
||
| 159 | |||
| 160 | struct registers {
|
||
| 161 | uint8_t reserved_0x00_0x0E[0x0Fu];
|
||
| 162 | uint8_t who_am_i; |
||
| 163 | uint8_t reserved_0x10_0x1F[0x10u];
|
||
| 164 | uint8_t ctrl_reg1; |
||
| 165 | uint8_t ctrl_reg2; |
||
| 166 | uint8_t ctrl_reg3; |
||
| 167 | uint8_t ctrl_reg4; |
||
| 168 | uint8_t ctrl_reg5; |
||
| 169 | uint8_t hp_filter_reset; |
||
| 170 | uint8_t reference; |
||
| 171 | uint8_t status_reg; |
||
| 172 | uint16_t out_x; /* LE */
|
||
| 173 | uint16_t out_y; /* LE */
|
||
| 174 | uint16_t out_z; /* LE */
|
||
| 175 | uint8_t reserved_0x2E_0x2F[0x02u];
|
||
| 176 | uint8_t int1_cfg; |
||
| 177 | uint8_t int1_src; |
||
| 178 | uint8_t int1_ths; |
||
| 179 | uint8_t int1_duration; |
||
| 180 | uint8_t int2_cfg; |
||
| 181 | uint8_t int2_src; |
||
| 182 | uint8_t int2_ths; |
||
| 183 | uint8_t int2_duration; |
||
| 184 | uint8_t reserved_0x38_0x3F[0x08u];
|
||
| 185 | } __attribute__((packed)); |
||
| 186 | |||
| 187 | enum {
|
||
| 188 | LIS331DLH_ID = 0x32u
|
||
| 189 | }; |
||
| 190 | |||
| 191 | enum {
|
||
| 192 | ZYXOR = 0x80,
|
||
| 193 | ZOR = 0x40,
|
||
| 194 | YOR = 0x20,
|
||
| 195 | XOR = 0x10,
|
||
| 196 | ZYXDA = 0x08,
|
||
| 197 | ZDA = 0x04,
|
||
| 198 | YDA = 0x02,
|
||
| 199 | XDA = 0x01,
|
||
| 200 | }; |
||
| 201 | |||
| 202 | enum {
|
||
| 203 | SPI_MULT = 0x40u,
|
||
| 204 | SPI_READ = 0x80u,
|
||
| 205 | SPI_WRITE = 0x00u,
|
||
| 206 | }; |
||
| 207 | |||
| 208 | public:
|
||
| 209 | LIS331DLH(HWSPIDriver* driver); |
||
| 210 | virtual ~LIS331DLH();
|
||
| 211 | |||
| 212 | chibios_rt::EvtSource* getEventSource(); |
||
| 213 | msg_t configure(LIS331DLHConfig* config); |
||
| 214 | |||
| 215 | /**
|
||
| 216 | * Return the accelaration in LSB for the given axis.
|
||
| 217 | *
|
||
| 218 | * @param axis can be one of the axis [AXIS_X | AXIS_Y | AXIS_Z]
|
||
| 219 | *
|
||
| 220 | * @return Measured accelaration in in LSB for the given axis
|
||
| 221 | */
|
||
| 222 | int16_t getAcceleration(const uint8_t axis);
|
||
| 223 | |||
| 224 | /**
|
||
| 225 | * Return the accelaration in milli g for the given axis
|
||
| 226 | *
|
||
| 227 | * @param axis can be one of the axis [AXIS_X | AXIS_Y | AXIS_Z]
|
||
| 228 | *
|
||
| 229 | * @return Measured accelaration in in milli g for the given axis
|
||
| 230 | */
|
||
| 231 | int16_t getAccelerationForce(const uint8_t axis);
|
||
| 232 | |||
| 233 | /**
|
||
| 234 | * Check the presence of the accelerometer by reading
|
||
| 235 | * the identifier register and comparing it to the standard
|
||
| 236 | * value
|
||
| 237 | *
|
||
| 238 | * @return [CHECK_OK | CHECK_FAIL]
|
||
| 239 | */
|
||
| 240 | uint8_t getCheck(); |
||
| 241 | |||
| 242 | /**
|
||
| 243 | * Do the build in self-test of the device by applying
|
||
| 244 | * an electrostatic force and measuring the amplitude.
|
||
| 245 | * The result is then checked against the standard values
|
||
| 246 | * of the manual
|
||
| 247 | * TODO Check if it works correct
|
||
| 248 | *
|
||
| 249 | * @param config A working config as template (if NULL, predefined config is taken)
|
||
| 250 | */
|
||
| 251 | void printSelfTest(LIS331DLHConfig* config);
|
||
| 252 | |||
| 253 | protected:
|
||
| 254 | virtual msg_t main();
|
||
| 255 | |||
| 256 | private:
|
||
| 257 | inline void updateSensorData(); |
||
| 258 | |||
| 259 | private:
|
||
| 260 | |||
| 261 | HWSPIDriver* driver; |
||
| 262 | chibios_rt::EvtSource eventSource; |
||
| 263 | int16_t accelerations[AXIS_Z - AXIS_X + 1];
|
||
| 264 | /**
|
||
| 265 | * Stores the configuration [FS_2G | FS_4G | FS_8G] of
|
||
| 266 | * the current setup
|
||
| 267 | */
|
||
| 268 | uint8_t currentFullScaleConfiguration; |
||
| 269 | |||
| 270 | |||
| 271 | }; |
||
| 272 | |||
| 273 | } /* amiro */
|
||
| 274 | |||
| 275 | #endif /* LIS331DLH_HPP_ */ |