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.
LIS302.cpp
00001 /* mbed LIS302 Accelerometer 00002 * Copyright (c) 2008-2009 cstyles, wreynolds, sford 00003 * Released under the MIT License: http://mbed.org/license/mit 00004 */ 00005 00006 #include "LIS302.h" 00007 #include "mbed.h" 00008 00009 #define LIS302_WHOAMI 0x0F 00010 #define LIS302_CTRL_REG1 0x20 00011 #define LIS302_CTRL_REG2 0x21 00012 #define LIS302_CTRL_REG3 0x22 00013 #define LIS302_HP_FILTER_RST 0x23 00014 #define LIS302_STATUS_REG 0x27 00015 #define LIS302_OUTX 0x29 00016 #define LIS302_OUTY 0x2B 00017 #define LIS302_OUTZ 0x2D 00018 #define LIS302_FF_WU_CFG1 0x30 00019 #define LIS302_FF_WU_SRC_1 0x31 00020 #define LIS302_FF_WU_THS_1 0x32 00021 #define LIS302_FF_WU_DURATION_1 0x33 00022 #define LIS302_FF_WU_CFG_2 0x34 00023 #define LIS302_FF_WU_SRC_2 0x35 00024 #define LIS302_FF_WU_THS_2 0x36 00025 #define LIS302_FF_WU_DURATION_2 0x37 00026 #define LIS302_CLICK_CFG 0x38 00027 #define LIS302_CLICK_SRC 0x39 00028 #define LIS302_CLICK_THSY_X 0x3B 00029 #define LIS302_CLICK_THSZ 0x3C 00030 #define LIS302_READ 0x80 00031 #define LIS302_WRITE 0x00 00032 00033 #define LIS302_STATUS_X_AVAILABLE 0x1 00034 #define LIS302_STATUS_Y_AVAILABLE 0x2 00035 #define LIS302_STATUS_Z_AVAILABLE 0x4 00036 00037 #define FACTOR_2g 55.6 00038 #define FACTOR_8g 13.9 00039 00040 LIS302::LIS302(PinName mosi, PinName miso, PinName clk, PinName ncs) 00041 : _spi(mosi, miso, clk), _ncs(ncs) { 00042 00043 // Make sure CS is high 00044 _ncs = 1; 00045 00046 // Set up the spi interface 00047 _spi.format(8, 3); 00048 _spi.frequency(1000000); 00049 00050 // Write to CTRL_REG1 00051 _ncs = 0; 00052 _spi.write(LIS302_WRITE | LIS302_CTRL_REG1); 00053 _spi.write (0x47); 00054 _ncs = 1; 00055 00056 // Write to CTRL_REG2 00057 _ncs = 0; 00058 _spi.write(LIS302_WRITE | LIS302_CTRL_REG2); 00059 _spi.write (0x0); // This is default anyway 00060 _ncs = 1; 00061 00062 // Write to CTRL_REG3 00063 _ncs = 0; 00064 _spi.write(LIS302_WRITE | LIS302_CTRL_REG3); 00065 _spi.write (0x0); // This is default anyway 00066 _ncs = 1; 00067 00068 range(0); 00069 calibrate(); 00070 } 00071 00072 float LIS302::x() { 00073 // wait for a new sample 00074 while(!(status() & LIS302_STATUS_X_AVAILABLE)); 00075 00076 _ncs = 0; 00077 _spi.write(LIS302_READ | LIS302_OUTX); 00078 signed char raw = _spi.write(0x00); 00079 _ncs = 1; 00080 00081 float gradient = (2.0/(_maxx-_minx)); 00082 return (gradient*(float)(raw)/_factor)+((-gradient*_maxx)+1); 00083 } 00084 00085 float LIS302::y() { 00086 // wait for a new sample 00087 while(!(status() & LIS302_STATUS_Y_AVAILABLE)); 00088 00089 _ncs = 0; 00090 _spi.write(LIS302_READ | LIS302_OUTY); 00091 signed char raw = _spi.write(0x00); 00092 _ncs = 1; 00093 00094 float gradient = (2.0/(_maxy-_miny)); 00095 return (gradient*(float)(raw)/_factor)+((-gradient*_maxy)+1); 00096 } 00097 00098 float LIS302::z() { 00099 // wait for a new sample 00100 while(!(status() & LIS302_STATUS_Z_AVAILABLE)); 00101 00102 _ncs = 0; 00103 _spi.write(LIS302_READ | LIS302_OUTZ); 00104 signed char raw = _spi.write(0x00); 00105 _ncs = 1; 00106 00107 float gradient = (2.0/(_maxz-_minz)); 00108 return (gradient*(float)(raw)/_factor)+((-gradient*_maxz)+1); 00109 } 00110 00111 void LIS302::range(int g) { 00112 00113 // fetch the current CRTL_REG1 00114 _ncs = 0; 00115 _spi.write(LIS302_READ | LIS302_CTRL_REG1); 00116 int value = _spi.write(0x00); 00117 _ncs = 1; 00118 00119 // set the range bit, and the calculation factor 00120 if(g) { 00121 value |= 0x20; // 8g 00122 _factor = FACTOR_8g; 00123 } else { 00124 value &= ~0x20; // 2g 00125 _factor = FACTOR_2g; 00126 } 00127 00128 _ncs = 0; 00129 _spi.write(LIS302_WRITE | LIS302_CTRL_REG1); 00130 _spi.write(value); 00131 _ncs = 1; 00132 } 00133 00134 void LIS302::calibrate(float maxx, float minx, float maxy, float miny, float maxz, float minz) { 00135 _maxx = maxx; 00136 _minx = minx; 00137 _maxy = maxy; 00138 _miny = miny; 00139 _maxz = maxz; 00140 _minz = minz; 00141 } 00142 00143 int LIS302::whoami() { 00144 _ncs = 0; 00145 _spi.write(LIS302_READ | LIS302_WHOAMI); 00146 int value = _spi.write(0x00); 00147 _ncs = 1; 00148 return value; 00149 } 00150 00151 int LIS302::status() { 00152 _ncs = 0; 00153 _spi.write(0xA7); 00154 int value = _spi.write(LIS302_READ | LIS302_STATUS_REG); 00155 _ncs = 1; 00156 return value; 00157 }
Generated on Sun Jul 24 2022 08:07:46 by
1.7.2