base program for tilt measurement

Dependencies:   COG4050_ADT7420 ADXL362

Fork of COG4050_adxl355_adxl357-ver2 by ADI_CAC

Committer:
vtoffoli
Date:
Fri Sep 07 15:50:53 2018 +0000
Revision:
10:f5ba762b58b4
Parent:
8:9e6ead2ee8d7
basic driver;

Who changed what in which revision?

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