Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: COG4050_ADT7420 ADXL362
Fork of COG4050_adxl355_adxl357-ver2 by
ADXL355.cpp
00001 #include <stdint.h> 00002 #include "mbed.h" 00003 #include "ADXL355.h" 00004 00005 00006 //DigitalOut int1; ///< DigitalOut instance for the chipselect of the ADXL 00007 //DigitalOut int2; ///< DigitalOut instance for the chipselect of the ADXL 00008 00009 /** ----------------------------------- */ 00010 /** SPI (MAX 10MHZ) and reset */ 00011 /** ----------------------------------- */ 00012 ADXL355::ADXL355(PinName cs_pin, PinName MOSI, PinName MISO, PinName SCK): adxl355(MOSI, MISO, SCK), cs(cs_pin) 00013 { 00014 cs = 1; 00015 adxl355.format(8,_SPI_MODE); 00016 adxl355.lock(); 00017 axis355_sens = 3.9e-6; 00018 axis357_sens = 19.5e-6; 00019 } 00020 void ADXL355::frequency(int hz) 00021 { 00022 adxl355.frequency(hz); 00023 } 00024 void ADXL355::reset(void) 00025 { 00026 adxl355.format(8, _SPI_MODE); 00027 cs = false; 00028 // Writing Code 0x52 (representing the letter, R, in ASCII or unicode) to this register immediately resets the ADXL362. 00029 write_reg(RESET, _RESET); 00030 cs = true; 00031 axis355_sens = 3.9e-6; 00032 axis357_sens = 19.5e-6; 00033 } 00034 /** ----------------------------------- */ 00035 /** Writes the reg register with data */ 00036 /** ----------------------------------- */ 00037 void ADXL355::write_reg(ADXL355_register_t reg, uint8_t data) 00038 { 00039 adxl355.format(8, _SPI_MODE); 00040 cs = false; 00041 adxl355.write(static_cast<uint8_t>(reg<<1) | _WRITE_REG_CMD); 00042 adxl355.write(data); 00043 cs = true; 00044 } 00045 void ADXL355::write_reg_u16(ADXL355_register_t reg, uint16_t data) 00046 { 00047 adxl355.format(8, _SPI_MODE); 00048 cs = false; 00049 adxl355.write(static_cast<uint8_t>(reg<<1) | _WRITE_REG_CMD); 00050 adxl355.write(static_cast<uint8_t>(data & 0xff)); 00051 adxl355.write(static_cast<uint8_t>((data & 0xff00) >> 8)); 00052 cs = true; 00053 } 00054 /** ----------------------------------- */ 00055 /** Reads the reg register */ 00056 /** ----------------------------------- */ 00057 uint8_t ADXL355::read_reg(ADXL355_register_t reg) 00058 { 00059 uint8_t ret_val; 00060 adxl355.format(8, _SPI_MODE); 00061 cs = false; 00062 adxl355.write(static_cast<uint8_t>(reg<<1) | _READ_REG_CMD); 00063 ret_val = adxl355.write(_DUMMY_BYTE); 00064 cs = true; 00065 return ret_val; 00066 } 00067 uint16_t ADXL355::read_reg_u16(ADXL355_register_t reg){ 00068 uint16_t ret_val = 0; 00069 adxl355.format(8, _SPI_MODE); 00070 cs = false; 00071 adxl355.write(static_cast<uint8_t>(reg<<1) | _READ_REG_CMD); 00072 ret_val = adxl355.write(_DUMMY_BYTE); 00073 ret_val = (ret_val<<8) | adxl355.write(_DUMMY_BYTE); 00074 cs = true; 00075 return ret_val; 00076 } 00077 uint32_t ADXL355::read_reg_u20(ADXL355_register_t reg){ 00078 uint32_t ret_val = 0; 00079 adxl355.format(8, _SPI_MODE); 00080 cs = false; 00081 adxl355.write((reg<<1) | _READ_REG_CMD); 00082 ret_val = 0x0f & adxl355.write(_DUMMY_BYTE); 00083 ret_val = (ret_val<<8) | adxl355.write(_DUMMY_BYTE); 00084 ret_val = (ret_val<<4) | (adxl355.write(_DUMMY_BYTE)>>4); 00085 cs = true; 00086 return ret_val; 00087 } 00088 /** ----------------------------------- */ 00089 /** Sets the CTL registers */ 00090 /** ----------------------------------- */ 00091 void ADXL355::set_power_ctl_reg(uint8_t data){ 00092 write_reg(POWER_CTL, data); 00093 } 00094 void ADXL355::set_filter_ctl_reg(ADXL355_filter_ctl_t hpf, ADXL355_filter_ctl_t odr){ 00095 write_reg(FILTER, static_cast<uint8_t>(hpf|odr)); 00096 } 00097 void ADXL355::set_clk(ADXL355_sync_ctl_t data) { 00098 write_reg(SYNC, static_cast<uint8_t>(data)); 00099 } 00100 void ADXL355::set_device(ADXL355_range_ctl_t range) { 00101 write_reg(RANGE, static_cast<uint8_t>(range)); 00102 switch(range){ 00103 case 0x01: 00104 axis355_sens = 3.9e-6; 00105 axis357_sens = 19.5e-6; 00106 break; 00107 case 0x02: 00108 axis355_sens = 7.8e-6; 00109 axis357_sens = 39e-6; 00110 break; 00111 case 0x03: 00112 axis355_sens = 15.6e-6; 00113 axis357_sens = 78e-6; 00114 break; 00115 } 00116 } 00117 /** ----------------------------------- */ 00118 /** Read the STATUS registers */ 00119 /** ----------------------------------- */ 00120 uint8_t ADXL355::read_status(){ 00121 return read_reg(STATUS); 00122 } 00123 /** ----------------------------------- */ 00124 /** ADXL must be set in measurement */ 00125 /** mode to read the data registers */ 00126 /** ----------------------------------- */ 00127 uint32_t ADXL355::scanx(){ 00128 return read_reg_u20(XDATA3); 00129 } 00130 uint32_t ADXL355::scany(){ 00131 return read_reg_u20(YDATA3); 00132 } 00133 uint32_t ADXL355::scanz(){ 00134 return read_reg_u20(ZDATA3); 00135 } 00136 uint16_t ADXL355::scant(){ 00137 return read_reg_u16(TEMP2); 00138 } 00139 /** ----------------------------------- */ 00140 /** Activity SetUp - the measured */ 00141 /** acceleration on any axis is above */ 00142 /** the ACT_THRESH bits for ACT_COUNT */ 00143 /** consecutive measurements. */ 00144 /** ----------------------------------- */ 00145 00146 void ADXL355::set_activity_axis(ADXL355_act_ctl_t axis) { 00147 write_reg(ACT_EN, axis); 00148 } 00149 void ADXL355::set_activity_cnt(uint8_t count) { 00150 write_reg(ACT_COUNT, count); 00151 } 00152 void ADXL355::set_activity_threshold(uint8_t data_h, uint8_t data_l) { 00153 uint16_t ret_val = static_cast<uint16_t>((data_h<<8)|data_l); 00154 write_reg_u16(ACT_THRESH_H, ret_val); 00155 } 00156 void ADXL355::set_inactivity() { 00157 write_reg(ACT_EN, 0x00); 00158 } 00159 /** ----------------------------------- */ 00160 /** ----------------------------------- */ 00161 void ADXL355::set_interrupt1_pin(PinName in, ADXL355_intmap_ctl_t mode) {} 00162 void ADXL355::set_interrupt2_pin(PinName in, ADXL355_intmap_ctl_t mode) {} 00163 void ADXL355::enable_interrupt1() {} 00164 void ADXL355::enable_interrupt2() {} 00165 void ADXL355::disable_interrupt1() {} 00166 void ADXL355::disable_interrupt2() {} 00167 void ADXL355::set_polling_interrupt1_pin(uint8_t data) {} 00168 void ADXL355::set_polling_interrupt2_pin(uint8_t data) {} 00169 bool get_int1() {} 00170 bool get_int2() {} 00171 /** ----------------------------------- */ 00172 /** FIFO set up and read operation */ 00173 /** ----------------------------------- */ 00174 uint8_t ADXL355::fifo_read_nr_of_entries(){ 00175 return read_reg(FIFO_ENTRIES); 00176 } 00177 void ADXL355::fifo_setup(uint8_t nr_of_entries){ 00178 if (nr_of_entries > 0x60) { 00179 nr_of_entries = nr_of_entries; 00180 } 00181 write_reg(FIFO_SAMPLES, nr_of_entries); 00182 } 00183 uint32_t ADXL355::fifo_read_u32() { 00184 uint32_t ret_val = 0; 00185 adxl355.format(8, _SPI_MODE); 00186 cs = false; 00187 adxl355.write(_READ_FIFO_CMD); 00188 ret_val = adxl355.write(_DUMMY_BYTE); 00189 ret_val = (ret_val<<8) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE)); 00190 ret_val = (ret_val<<4) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE)>>4); 00191 cs = true; 00192 return ret_val; 00193 } 00194 uint64_t ADXL355::fifo_scan() { 00195 uint64_t ret_val = 0; 00196 uint32_t x = 0, y = 0, z = 0, dummy; 00197 adxl355.format(8, _SPI_MODE); 00198 cs = false; 00199 adxl355.write(_READ_FIFO_CMD); 00200 for(uint8_t i = 0; i < 3; i++) { 00201 dummy = adxl355.write(_DUMMY_BYTE); 00202 dummy = (dummy<<8) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE)); 00203 dummy = (dummy<<4) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE)>>4); 00204 dummy = dummy & 0xffff; 00205 switch(i) { 00206 case 0: // x 00207 x = dummy; 00208 break; 00209 case 1: // y 00210 y = dummy; 00211 break; 00212 case 2: // z 00213 z = dummy; 00214 break; 00215 } 00216 } 00217 cs = true; 00218 // format (24)xx(24)yy(24)zz 00219 ret_val = static_cast<uint64_t> (x) << 48; 00220 ret_val |= static_cast<uint64_t>(y) << 24; 00221 ret_val |= static_cast<uint64_t>(z) ; 00222 return ret_val; 00223 } 00224 /** ----------------------------------- */ 00225 /** CALIBRATION AND CONVERSION */ 00226 /** ----------------------------------- */ 00227 float ADXL355::convert(uint32_t data){ 00228 // If a positive value, return it 00229 if ((data & 0x80000) == 0) 00230 { 00231 return float(data); 00232 } 00233 //uint32_t rawValue = data<<(32-nbit); 00234 // Otherwise perform the 2's complement math on the value 00235 return float((~(data - 0x01)) & 0xfffff) * -1; 00236 } 00237 00238 /** ----------------------------------- */ 00239 /** ANGLE MEASUREMENT */ 00240 /** ----------------------------------- */ 00241 //single axis 00242 float ADXL355::single_axis(float x) 00243 { 00244 float Y; 00245 //int a=4; 00246 Y = floor(asin(x)*100)/100; 00247 //void arm_cmplx_mag_f32 (double *Y, double *X, int32_t a); 00248 00249 Y = floor(((57.2957f)*(Y))*100)/100; 00250 return Y; 00251 00252 } 00253 00254 //Dual Axis 00255 float ADXL355::dual_axis(float x, float y) 00256 { 00257 float Y; 00258 Y = 57.2957f * (atan(x/y)); 00259 Y = floor(Y*100)/100; 00260 return Y; 00261 } 00262 00263 //Triaxial 00264 float ADXL355::tri_axis(float x, float y, float z) 00265 { 00266 float Y; 00267 float X; 00268 X = (x)/(sqrt((y*y)+(z*z))); 00269 Y= atan(X); 00270 Y = floor(Y*57.2957*100)/100; 00271 return Y; 00272 }
Generated on Thu Jul 21 2022 06:24:42 by
1.7.2
