Rohan - COG4050 and ADXL355 Tilt sensing

Dependents:   COG4050_adxl355_tilt COG4050_adxl355_tilt COG4050_adxl355_tilt_4050

Fork of ADXL355 by Rohan Gurav

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?

UserRevisionLine numberNew 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]){}