Rohan - COG4050 and ADXL355 Tilt sensing
Dependents: COG4050_adxl355_tilt COG4050_adxl355_tilt COG4050_adxl355_tilt_4050
Fork of ADXL355 by
ADXL355.cpp@0:1b8d65be0eef, 2018-08-15 (annotated)
- Committer:
- RGurav
- Date:
- Wed Aug 15 11:51:45 2018 +0000
- Revision:
- 0:1b8d65be0eef
- Child:
- 1:e80c97768af4
Code to read the X Y Z values of the accelerometer using the EV-COG4050
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
RGurav | 0:1b8d65be0eef | 1 | #include <stdint.h> |
RGurav | 0:1b8d65be0eef | 2 | #include "mbed.h" |
RGurav | 0:1b8d65be0eef | 3 | #include "ADXL355.h" |
RGurav | 0:1b8d65be0eef | 4 | |
RGurav | 0:1b8d65be0eef | 5 | |
RGurav | 0:1b8d65be0eef | 6 | //DigitalOut int1; ///< DigitalOut instance for the chipselect of the ADXL |
RGurav | 0:1b8d65be0eef | 7 | //DigitalOut int2; ///< DigitalOut instance for the chipselect of the ADXL |
RGurav | 0:1b8d65be0eef | 8 | |
RGurav | 0:1b8d65be0eef | 9 | /** ----------------------------------- */ |
RGurav | 0:1b8d65be0eef | 10 | /** SPI (MAX 10MHZ) and reset */ |
RGurav | 0:1b8d65be0eef | 11 | /** ----------------------------------- */ |
RGurav | 0:1b8d65be0eef | 12 | ADXL355::ADXL355(PinName cs_pin, PinName MOSI, PinName MISO, PinName SCK): adxl355(MOSI, MISO, SCK), cs(cs_pin) |
RGurav | 0:1b8d65be0eef | 13 | { |
RGurav | 0:1b8d65be0eef | 14 | cs = 1; |
RGurav | 0:1b8d65be0eef | 15 | adxl355.format(8,_SPI_MODE); |
RGurav | 0:1b8d65be0eef | 16 | adxl355.lock(); |
RGurav | 0:1b8d65be0eef | 17 | axis355_sens = 3.9e-6; |
RGurav | 0:1b8d65be0eef | 18 | axis357_sens = 19.5e-6; |
RGurav | 0:1b8d65be0eef | 19 | calib_data.S[0][0] = 3.9e-6; |
RGurav | 0:1b8d65be0eef | 20 | calib_data.S[1][1] = 3.9e-6; |
RGurav | 0:1b8d65be0eef | 21 | calib_data.S[2][2] = 3.9e-6; |
RGurav | 0:1b8d65be0eef | 22 | } |
RGurav | 0:1b8d65be0eef | 23 | void ADXL355::frequency(int hz) |
RGurav | 0:1b8d65be0eef | 24 | { |
RGurav | 0:1b8d65be0eef | 25 | adxl355.frequency(hz); |
RGurav | 0:1b8d65be0eef | 26 | } |
RGurav | 0:1b8d65be0eef | 27 | void ADXL355::reset(void) |
RGurav | 0:1b8d65be0eef | 28 | { |
RGurav | 0:1b8d65be0eef | 29 | adxl355.format(8, _SPI_MODE); |
RGurav | 0:1b8d65be0eef | 30 | cs = false; |
RGurav | 0:1b8d65be0eef | 31 | // Writing Code 0x52 (representing the letter, R, in ASCII or unicode) to this register immediately resets the ADXL362. |
RGurav | 0:1b8d65be0eef | 32 | write_reg(RESET, _RESET); |
RGurav | 0:1b8d65be0eef | 33 | cs = true; |
RGurav | 0:1b8d65be0eef | 34 | axis355_sens = 3.9e-6; |
RGurav | 0:1b8d65be0eef | 35 | axis357_sens = 19.5e-6; |
RGurav | 0:1b8d65be0eef | 36 | } |
RGurav | 0:1b8d65be0eef | 37 | /** ----------------------------------- */ |
RGurav | 0:1b8d65be0eef | 38 | /** Writes the reg register with data */ |
RGurav | 0:1b8d65be0eef | 39 | /** ----------------------------------- */ |
RGurav | 0:1b8d65be0eef | 40 | void ADXL355::write_reg(ADXL355_register_t reg, uint8_t data) |
RGurav | 0:1b8d65be0eef | 41 | { |
RGurav | 0:1b8d65be0eef | 42 | adxl355.format(8, _SPI_MODE); |
RGurav | 0:1b8d65be0eef | 43 | cs = false; |
RGurav | 0:1b8d65be0eef | 44 | adxl355.write(static_cast<uint8_t>(reg<<1) | _WRITE_REG_CMD); |
RGurav | 0:1b8d65be0eef | 45 | adxl355.write(data); |
RGurav | 0:1b8d65be0eef | 46 | cs = true; |
RGurav | 0:1b8d65be0eef | 47 | } |
RGurav | 0:1b8d65be0eef | 48 | void ADXL355::write_reg_u16(ADXL355_register_t reg, uint16_t data) |
RGurav | 0:1b8d65be0eef | 49 | { |
RGurav | 0:1b8d65be0eef | 50 | adxl355.format(8, _SPI_MODE); |
RGurav | 0:1b8d65be0eef | 51 | cs = false; |
RGurav | 0:1b8d65be0eef | 52 | adxl355.write(static_cast<uint8_t>(reg<<1) | _WRITE_REG_CMD); |
RGurav | 0:1b8d65be0eef | 53 | adxl355.write(static_cast<uint8_t>(data & 0xff)); |
RGurav | 0:1b8d65be0eef | 54 | adxl355.write(static_cast<uint8_t>((data & 0xff00) >> 8)); |
RGurav | 0:1b8d65be0eef | 55 | cs = true; |
RGurav | 0:1b8d65be0eef | 56 | } |
RGurav | 0:1b8d65be0eef | 57 | /** ----------------------------------- */ |
RGurav | 0:1b8d65be0eef | 58 | /** Reads the reg register */ |
RGurav | 0:1b8d65be0eef | 59 | /** ----------------------------------- */ |
RGurav | 0:1b8d65be0eef | 60 | uint8_t ADXL355::read_reg(ADXL355_register_t reg) |
RGurav | 0:1b8d65be0eef | 61 | { |
RGurav | 0:1b8d65be0eef | 62 | uint8_t ret_val; |
RGurav | 0:1b8d65be0eef | 63 | adxl355.format(8, _SPI_MODE); |
RGurav | 0:1b8d65be0eef | 64 | cs = false; |
RGurav | 0:1b8d65be0eef | 65 | adxl355.write(static_cast<uint8_t>(reg<<1) | _READ_REG_CMD); |
RGurav | 0:1b8d65be0eef | 66 | ret_val = adxl355.write(_DUMMY_BYTE); |
RGurav | 0:1b8d65be0eef | 67 | cs = true; |
RGurav | 0:1b8d65be0eef | 68 | return ret_val; |
RGurav | 0:1b8d65be0eef | 69 | } |
RGurav | 0:1b8d65be0eef | 70 | uint16_t ADXL355::read_reg_u16(ADXL355_register_t reg){ |
RGurav | 0:1b8d65be0eef | 71 | uint16_t ret_val = 0; |
RGurav | 0:1b8d65be0eef | 72 | adxl355.format(8, _SPI_MODE); |
RGurav | 0:1b8d65be0eef | 73 | cs = false; |
RGurav | 0:1b8d65be0eef | 74 | adxl355.write(static_cast<uint8_t>(reg<<1) | _READ_REG_CMD); |
RGurav | 0:1b8d65be0eef | 75 | ret_val = adxl355.write(_DUMMY_BYTE); |
RGurav | 0:1b8d65be0eef | 76 | ret_val = (ret_val<<8) | adxl355.write(_DUMMY_BYTE); |
RGurav | 0:1b8d65be0eef | 77 | cs = true; |
RGurav | 0:1b8d65be0eef | 78 | return ret_val; |
RGurav | 0:1b8d65be0eef | 79 | } |
RGurav | 0:1b8d65be0eef | 80 | uint32_t ADXL355::read_reg_u20(ADXL355_register_t reg){ |
RGurav | 0:1b8d65be0eef | 81 | uint32_t ret_val = 0; |
RGurav | 0:1b8d65be0eef | 82 | adxl355.format(8, _SPI_MODE); |
RGurav | 0:1b8d65be0eef | 83 | cs = false; |
RGurav | 0:1b8d65be0eef | 84 | adxl355.write((reg<<1) | _READ_REG_CMD); |
RGurav | 0:1b8d65be0eef | 85 | ret_val = 0x0f & adxl355.write(_DUMMY_BYTE); |
RGurav | 0:1b8d65be0eef | 86 | ret_val = (ret_val<<8) | adxl355.write(_DUMMY_BYTE); |
RGurav | 0:1b8d65be0eef | 87 | ret_val = (ret_val<<8) | adxl355.write(_DUMMY_BYTE); |
RGurav | 0:1b8d65be0eef | 88 | cs = true; |
RGurav | 0:1b8d65be0eef | 89 | return ret_val; |
RGurav | 0:1b8d65be0eef | 90 | } |
RGurav | 0:1b8d65be0eef | 91 | /** ----------------------------------- */ |
RGurav | 0:1b8d65be0eef | 92 | /** Sets the CTL registers */ |
RGurav | 0:1b8d65be0eef | 93 | /** ----------------------------------- */ |
RGurav | 0:1b8d65be0eef | 94 | void ADXL355::set_power_ctl_reg(uint8_t data){ |
RGurav | 0:1b8d65be0eef | 95 | write_reg(POWER_CTL, data); |
RGurav | 0:1b8d65be0eef | 96 | } |
RGurav | 0:1b8d65be0eef | 97 | void ADXL355::set_filter_ctl_reg(ADXL355_filter_ctl_t hpf, ADXL355_filter_ctl_t odr){ |
RGurav | 0:1b8d65be0eef | 98 | write_reg(FILTER, static_cast<uint8_t>(hpf|odr)); |
RGurav | 0:1b8d65be0eef | 99 | } |
RGurav | 0:1b8d65be0eef | 100 | void ADXL355::set_clk(ADXL355_sync_ctl_t data) { |
RGurav | 0:1b8d65be0eef | 101 | write_reg(SYNC, static_cast<uint8_t>(data)); |
RGurav | 0:1b8d65be0eef | 102 | } |
RGurav | 0:1b8d65be0eef | 103 | void ADXL355::set_device(ADXL355_range_ctl_t range) { |
RGurav | 0:1b8d65be0eef | 104 | write_reg(RANGE, static_cast<uint8_t>(range)); |
RGurav | 0:1b8d65be0eef | 105 | switch(range){ |
RGurav | 0:1b8d65be0eef | 106 | case 0x01: |
RGurav | 0:1b8d65be0eef | 107 | axis355_sens = 3.9e-6; |
RGurav | 0:1b8d65be0eef | 108 | axis357_sens = 19.5e-6; |
RGurav | 0:1b8d65be0eef | 109 | break; |
RGurav | 0:1b8d65be0eef | 110 | case 0x02: |
RGurav | 0:1b8d65be0eef | 111 | axis355_sens = 7.8e-6; |
RGurav | 0:1b8d65be0eef | 112 | axis357_sens = 39e-6; |
RGurav | 0:1b8d65be0eef | 113 | break; |
RGurav | 0:1b8d65be0eef | 114 | case 0x03: |
RGurav | 0:1b8d65be0eef | 115 | axis355_sens = 15.6e-6; |
RGurav | 0:1b8d65be0eef | 116 | axis357_sens = 78e-6; |
RGurav | 0:1b8d65be0eef | 117 | break; |
RGurav | 0:1b8d65be0eef | 118 | } |
RGurav | 0:1b8d65be0eef | 119 | } |
RGurav | 0:1b8d65be0eef | 120 | /** ----------------------------------- */ |
RGurav | 0:1b8d65be0eef | 121 | /** Read the STATUS registers */ |
RGurav | 0:1b8d65be0eef | 122 | /** ----------------------------------- */ |
RGurav | 0:1b8d65be0eef | 123 | uint8_t ADXL355::read_status(){ |
RGurav | 0:1b8d65be0eef | 124 | return read_reg(STATUS); |
RGurav | 0:1b8d65be0eef | 125 | } |
RGurav | 0:1b8d65be0eef | 126 | /** ----------------------------------- */ |
RGurav | 0:1b8d65be0eef | 127 | /** ADXL must be set in measurement */ |
RGurav | 0:1b8d65be0eef | 128 | /** mode to read the data registers */ |
RGurav | 0:1b8d65be0eef | 129 | /** ----------------------------------- */ |
RGurav | 0:1b8d65be0eef | 130 | uint32_t ADXL355::scanx(){ |
RGurav | 0:1b8d65be0eef | 131 | return read_reg_u20(XDATA3); |
RGurav | 0:1b8d65be0eef | 132 | } |
RGurav | 0:1b8d65be0eef | 133 | uint32_t ADXL355::scany(){ |
RGurav | 0:1b8d65be0eef | 134 | return read_reg_u20(YDATA3); |
RGurav | 0:1b8d65be0eef | 135 | } |
RGurav | 0:1b8d65be0eef | 136 | uint32_t ADXL355::scanz(){ |
RGurav | 0:1b8d65be0eef | 137 | return read_reg_u20(ZDATA3); |
RGurav | 0:1b8d65be0eef | 138 | } |
RGurav | 0:1b8d65be0eef | 139 | uint16_t ADXL355::scant(){ |
RGurav | 0:1b8d65be0eef | 140 | return read_reg_u16(TEMP2); |
RGurav | 0:1b8d65be0eef | 141 | } |
RGurav | 0:1b8d65be0eef | 142 | /** ----------------------------------- */ |
RGurav | 0:1b8d65be0eef | 143 | /** Activity SetUp - the measured */ |
RGurav | 0:1b8d65be0eef | 144 | /** acceleration on any axis is above */ |
RGurav | 0:1b8d65be0eef | 145 | /** the ACT_THRESH bits for ACT_COUNT */ |
RGurav | 0:1b8d65be0eef | 146 | /** consecutive measurements. */ |
RGurav | 0:1b8d65be0eef | 147 | /** ----------------------------------- */ |
RGurav | 0:1b8d65be0eef | 148 | |
RGurav | 0:1b8d65be0eef | 149 | void ADXL355::set_activity_axis(ADXL355_act_ctl_t axis) { |
RGurav | 0:1b8d65be0eef | 150 | write_reg(ACT_EN, axis); |
RGurav | 0:1b8d65be0eef | 151 | } |
RGurav | 0:1b8d65be0eef | 152 | void ADXL355::set_activity_cnt(uint8_t count) { |
RGurav | 0:1b8d65be0eef | 153 | write_reg(ACT_COUNT, count); |
RGurav | 0:1b8d65be0eef | 154 | } |
RGurav | 0:1b8d65be0eef | 155 | void ADXL355::set_activity_threshold(uint8_t data_h, uint8_t data_l) { |
RGurav | 0:1b8d65be0eef | 156 | uint16_t ret_val = static_cast<uint16_t>((data_h<<8)|data_l); |
RGurav | 0:1b8d65be0eef | 157 | write_reg_u16(ACT_THRESH_H, ret_val); |
RGurav | 0:1b8d65be0eef | 158 | } |
RGurav | 0:1b8d65be0eef | 159 | void ADXL355::set_inactivity() { |
RGurav | 0:1b8d65be0eef | 160 | write_reg(ACT_EN, 0x00); |
RGurav | 0:1b8d65be0eef | 161 | } |
RGurav | 0:1b8d65be0eef | 162 | /** ----------------------------------- */ |
RGurav | 0:1b8d65be0eef | 163 | /** ----------------------------------- */ |
RGurav | 0:1b8d65be0eef | 164 | void ADXL355::set_interrupt1_pin(PinName in, ADXL355_intmap_ctl_t mode) {} |
RGurav | 0:1b8d65be0eef | 165 | void ADXL355::set_interrupt2_pin(PinName in, ADXL355_intmap_ctl_t mode) {} |
RGurav | 0:1b8d65be0eef | 166 | void ADXL355::enable_interrupt1() {} |
RGurav | 0:1b8d65be0eef | 167 | void ADXL355::enable_interrupt2() {} |
RGurav | 0:1b8d65be0eef | 168 | void ADXL355::disable_interrupt1() {} |
RGurav | 0:1b8d65be0eef | 169 | void ADXL355::disable_interrupt2() {} |
RGurav | 0:1b8d65be0eef | 170 | void ADXL355::set_polling_interrupt1_pin(uint8_t data) {} |
RGurav | 0:1b8d65be0eef | 171 | void ADXL355::set_polling_interrupt2_pin(uint8_t data) {} |
RGurav | 0:1b8d65be0eef | 172 | bool get_int1() {} |
RGurav | 0:1b8d65be0eef | 173 | bool get_int2() {} |
RGurav | 0:1b8d65be0eef | 174 | /** ----------------------------------- */ |
RGurav | 0:1b8d65be0eef | 175 | /** FIFO set up and read operation */ |
RGurav | 0:1b8d65be0eef | 176 | /** ----------------------------------- */ |
RGurav | 0:1b8d65be0eef | 177 | uint8_t ADXL355::fifo_read_nr_of_entries(){ |
RGurav | 0:1b8d65be0eef | 178 | return read_reg(FIFO_ENTRIES); |
RGurav | 0:1b8d65be0eef | 179 | } |
RGurav | 0:1b8d65be0eef | 180 | void ADXL355::fifo_setup(uint8_t nr_of_entries){ |
RGurav | 0:1b8d65be0eef | 181 | if (nr_of_entries > 0x60) { |
RGurav | 0:1b8d65be0eef | 182 | nr_of_entries = nr_of_entries; |
RGurav | 0:1b8d65be0eef | 183 | } |
RGurav | 0:1b8d65be0eef | 184 | write_reg(FIFO_SAMPLES, nr_of_entries); |
RGurav | 0:1b8d65be0eef | 185 | } |
RGurav | 0:1b8d65be0eef | 186 | uint32_t ADXL355::fifo_read_u32() { |
RGurav | 0:1b8d65be0eef | 187 | uint32_t ret_val = 0; |
RGurav | 0:1b8d65be0eef | 188 | adxl355.format(8, _SPI_MODE); |
RGurav | 0:1b8d65be0eef | 189 | cs = false; |
RGurav | 0:1b8d65be0eef | 190 | adxl355.write(_READ_FIFO_CMD); |
RGurav | 0:1b8d65be0eef | 191 | ret_val = adxl355.write(_DUMMY_BYTE); |
RGurav | 0:1b8d65be0eef | 192 | ret_val = (ret_val<<8) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE)); |
RGurav | 0:1b8d65be0eef | 193 | ret_val = (ret_val<<4) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE)>>4); |
RGurav | 0:1b8d65be0eef | 194 | cs = true; |
RGurav | 0:1b8d65be0eef | 195 | return ret_val; |
RGurav | 0:1b8d65be0eef | 196 | } |
RGurav | 0:1b8d65be0eef | 197 | uint64_t ADXL355::fifo_scan() { |
RGurav | 0:1b8d65be0eef | 198 | uint64_t ret_val = 0; |
RGurav | 0:1b8d65be0eef | 199 | uint32_t x = 0, y = 0, z = 0, dummy; |
RGurav | 0:1b8d65be0eef | 200 | adxl355.format(8, _SPI_MODE); |
RGurav | 0:1b8d65be0eef | 201 | cs = false; |
RGurav | 0:1b8d65be0eef | 202 | adxl355.write(_READ_FIFO_CMD); |
RGurav | 0:1b8d65be0eef | 203 | for(uint8_t i = 0; i < 3; i++) { |
RGurav | 0:1b8d65be0eef | 204 | dummy = adxl355.write(_DUMMY_BYTE); |
RGurav | 0:1b8d65be0eef | 205 | dummy = (dummy<<8) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE)); |
RGurav | 0:1b8d65be0eef | 206 | dummy = (dummy<<4) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE)>>4); |
RGurav | 0:1b8d65be0eef | 207 | dummy = dummy & 0xffff; |
RGurav | 0:1b8d65be0eef | 208 | switch(i) { |
RGurav | 0:1b8d65be0eef | 209 | case 0: // x |
RGurav | 0:1b8d65be0eef | 210 | x = dummy; |
RGurav | 0:1b8d65be0eef | 211 | break; |
RGurav | 0:1b8d65be0eef | 212 | case 1: // y |
RGurav | 0:1b8d65be0eef | 213 | y = dummy; |
RGurav | 0:1b8d65be0eef | 214 | break; |
RGurav | 0:1b8d65be0eef | 215 | case 2: // z |
RGurav | 0:1b8d65be0eef | 216 | z = dummy; |
RGurav | 0:1b8d65be0eef | 217 | break; |
RGurav | 0:1b8d65be0eef | 218 | } |
RGurav | 0:1b8d65be0eef | 219 | } |
RGurav | 0:1b8d65be0eef | 220 | cs = true; |
RGurav | 0:1b8d65be0eef | 221 | // format (24)xx(24)yy(24)zz |
RGurav | 0:1b8d65be0eef | 222 | ret_val = static_cast<uint64_t> (x) << 48; |
RGurav | 0:1b8d65be0eef | 223 | ret_val |= static_cast<uint64_t>(y) << 24; |
RGurav | 0:1b8d65be0eef | 224 | ret_val |= static_cast<uint64_t>(z) ; |
RGurav | 0:1b8d65be0eef | 225 | return ret_val; |
RGurav | 0:1b8d65be0eef | 226 | } |
RGurav | 0:1b8d65be0eef | 227 | /** ----------------------------------- */ |
RGurav | 0:1b8d65be0eef | 228 | /** CALIBRATION AND CONVERSION */ |
RGurav | 0:1b8d65be0eef | 229 | /** ----------------------------------- */ |
RGurav | 0:1b8d65be0eef | 230 | float ADXL355::convert(uint32_t data){ |
RGurav | 0:1b8d65be0eef | 231 | // If a positive value, return it |
RGurav | 0:1b8d65be0eef | 232 | if ((data & 0x80000) == 0) |
RGurav | 0:1b8d65be0eef | 233 | { |
RGurav | 0:1b8d65be0eef | 234 | return float(data); |
RGurav | 0:1b8d65be0eef | 235 | } |
RGurav | 0:1b8d65be0eef | 236 | //uint32_t rawValue = data<<(32-nbit); |
RGurav | 0:1b8d65be0eef | 237 | // Otherwise perform the 2's complement math on the value |
RGurav | 0:1b8d65be0eef | 238 | return float((~(data - 0x01)) & 0xfffff) * -1; |
RGurav | 0:1b8d65be0eef | 239 | } |
RGurav | 0:1b8d65be0eef | 240 | ADXL355::ADXL355_calibdata_t ADXL355::convert_2p(float angle[11][2], float meas[11][2]){ |
RGurav | 0:1b8d65be0eef | 241 | ADXL355_calibdata_t res; |
RGurav | 0:1b8d65be0eef | 242 | for(int i=0; i<3; i++){ |
RGurav | 0:1b8d65be0eef | 243 | res.S[i][i]= (angle[i][1]-angle[i][0])/(meas[i][1]-meas[i][0]); |
RGurav | 0:1b8d65be0eef | 244 | res.B[i][0]= (angle[i][0]*meas[i][1]-angle[i][1]*meas[i][0])/(meas[i][1]-meas[i][0]); |
RGurav | 0:1b8d65be0eef | 245 | } |
RGurav | 0:1b8d65be0eef | 246 | return res; |
RGurav | 0:1b8d65be0eef | 247 | } |
RGurav | 0:1b8d65be0eef | 248 | ADXL355::ADXL355_calibdata_t ADXL355::convert_3to8p(float angle[11][2], float meas[11][2], int count){} |
RGurav | 0:1b8d65be0eef | 249 | ADXL355::ADXL355_calibdata_t ADXL355::convert_12p(float angle[11][2], float meas[11][2]){} |