valeria toffoli / Mbed OS COG4050_adxl355_adxl357

Dependencies:   COG4050_ADT7420 ADXL362

Fork of COG4050_adxl355_adxl357-ver2 by ADI_CAC

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ADXL355.cpp Source File

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     }