Add functions to read Ax, Ay and Az individually
Embed:
(wiki syntax)
Show/hide line numbers
ADXL345.h
00001 /** 00002 * @author Aaron Berk 00003 * 00004 * @section LICENSE 00005 * 00006 * Copyright (c) 2010 ARM Limited 00007 * 00008 * Permission is hereby granted, free of charge, to any person obtaining a copy 00009 * of this software and associated documentation files (the "Software"), to deal 00010 * in the Software without restriction, including without limitation the rights 00011 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00012 * copies of the Software, and to permit persons to whom the Software is 00013 * furnished to do so, subject to the following conditions: 00014 * 00015 * The above copyright notice and this permission notice shall be included in 00016 * all copies or substantial portions of the Software. 00017 * 00018 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00019 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00020 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00021 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00022 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00023 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00024 * THE SOFTWARE. 00025 * 00026 * @section DESCRIPTION 00027 * 00028 * ADXL345, triple axis, digital interface, accelerometer. 00029 * 00030 * Datasheet: 00031 * 00032 * http://www.analog.com/static/imported-files/data_sheets/ADXL345.pdf 00033 */ 00034 00035 #ifndef ADXL345_H 00036 #define ADXL345_H 00037 00038 /** 00039 * Includes 00040 */ 00041 #include "mbed.h" 00042 00043 /** 00044 * Defines 00045 */ 00046 //Registers. 00047 #define ADXL345_DEVID_REG 0x00 00048 #define ADXL345_THRESH_TAP_REG 0x1D 00049 #define ADXL345_OFSX_REG 0x1E 00050 #define ADXL345_OFSY_REG 0x1F 00051 #define ADXL345_OFSZ_REG 0x20 00052 #define ADXL345_DUR_REG 0x21 00053 #define ADXL345_LATENT_REG 0x22 00054 #define ADXL345_WINDOW_REG 0x23 00055 #define ADXL345_THRESH_ACT_REG 0x24 00056 #define ADXL345_THRESH_INACT_REG 0x25 00057 #define ADXL345_TIME_INACT_REG 0x26 00058 #define ADXL345_ACT_INACT_CTL_REG 0x27 00059 #define ADXL345_THRESH_FF_REG 0x28 00060 #define ADXL345_TIME_FF_REG 0x29 00061 #define ADXL345_TAP_AXES_REG 0x2A 00062 #define ADXL345_ACT_TAP_STATUS_REG 0x2B 00063 #define ADXL345_BW_RATE_REG 0x2C 00064 #define ADXL345_POWER_CTL_REG 0x2D 00065 #define ADXL345_INT_ENABLE_REG 0x2E 00066 #define ADXL345_INT_MAP_REG 0x2F 00067 #define ADXL345_INT_SOURCE_REG 0x30 00068 #define ADXL345_DATA_FORMAT_REG 0x31 00069 #define ADXL345_DATAX0_REG 0x32 00070 #define ADXL345_DATAX1_REG 0x33 00071 #define ADXL345_DATAY0_REG 0x34 00072 #define ADXL345_DATAY1_REG 0x35 00073 #define ADXL345_DATAZ0_REG 0x36 00074 #define ADXL345_DATAZ1_REG 0x37 00075 #define ADXL345_FIFO_CTL 0x38 00076 #define ADXL345_FIFO_STATUS 0x39 00077 00078 //Data rate codes. 00079 #define ADXL345_3200HZ 0x0F 00080 #define ADXL345_1600HZ 0x0E 00081 #define ADXL345_800HZ 0x0D 00082 #define ADXL345_400HZ 0x0C 00083 #define ADXL345_200HZ 0x0B 00084 #define ADXL345_100HZ 0x0A 00085 #define ADXL345_50HZ 0x09 00086 #define ADXL345_25HZ 0x08 00087 #define ADXL345_12HZ5 0x07 00088 #define ADXL345_6HZ25 0x06 00089 00090 #define ADXL345_SPI_READ 0x80 00091 #define ADXL345_SPI_WRITE 0x00 00092 #define ADXL345_MULTI_BYTE 0x60 00093 00094 #define ADXL345_X 0x00 00095 #define ADXL345_Y 0x01 00096 #define ADXL345_Z 0x02 00097 00098 /** 00099 * ADXL345 triple axis, digital interface, accelerometer. 00100 */ 00101 class ADXL345 { 00102 00103 public: 00104 00105 /** 00106 * Constructor. 00107 * 00108 * @param mosi mbed pin to use for MOSI line of SPI interface. 00109 * @param miso mbed pin to use for MISO line of SPI interface. 00110 * @param sck mbed pin to use for SCK line of SPI interface. 00111 * @param cs mbed pin to use for not chip select line of SPI interface. 00112 */ 00113 ADXL345(PinName mosi, PinName miso, PinName sck, PinName cs); 00114 00115 /** 00116 * Read the device ID register on the device. 00117 * 00118 * @return The device ID code [0xE5] 00119 */ 00120 int getDevId(void); 00121 00122 /** 00123 * Read the tap threshold on the device. 00124 * 00125 * @return The tap threshold as an 8-bit number with a scale factor of 00126 * 62.5mg/LSB. 00127 */ 00128 int getTapThreshold(void); 00129 00130 /** 00131 * Set the tap threshold. 00132 * 00133 * @param The tap threshold as an 8-bit number with a scale factor of 00134 * 62.5mg/LSB. 00135 */ 00136 void setTapThreshold(int threshold); 00137 00138 /** 00139 * Get the current offset for a particular axis. 00140 * 00141 * @param axis 0x00 -> X-axis 00142 * 0x01 -> Y-axis 00143 * 0x02 -> Z-axis 00144 * @return The current offset as an 8-bit 2's complement number with scale 00145 * factor 15.6mg/LSB. 00146 */ 00147 int getOffset(int axis); 00148 00149 /** 00150 * Set the offset for a particular axis. 00151 * 00152 * @param axis 0x00 -> X-axis 00153 * 0x01 -> Y-axis 00154 * 0x02 -> Z-axis 00155 * @param offset The offset as an 8-bit 2's complement number with scale 00156 * factor 15.6mg/LSB. 00157 */ 00158 void setOffset(int axis, char offset); 00159 00160 /** 00161 * Get the tap duration required to trigger an event. 00162 * 00163 * @return The max time that an event must be above the tap threshold to 00164 * qualify as a tap event, in microseconds. 00165 */ 00166 int getTapDuration(void); 00167 00168 /** 00169 * Set the tap duration required to trigger an event. 00170 * 00171 * @param duration_us The max time that an event must be above the tap 00172 * threshold to qualify as a tap event, in microseconds. 00173 * Time will be normalized by the scale factor which is 00174 * 625us/LSB. A value of 0 disables the single/double 00175 * tap functions. 00176 */ 00177 void setTapDuration(int duration_us); 00178 00179 /** 00180 * Get the tap latency between the detection of a tap and the time window. 00181 * 00182 * @return The wait time from the detection of a tap event to the start of 00183 * the time window during which a possible second tap event can be 00184 * detected in milliseconds. 00185 */ 00186 float getTapLatency(void); 00187 00188 /** 00189 * Set the tap latency between the detection of a tap and the time window. 00190 * 00191 * @param latency_ms The wait time from the detection of a tap event to the 00192 * start of the time window during which a possible 00193 * second tap event can be detected in milliseconds. 00194 * A value of 0 disables the double tap function. 00195 */ 00196 void setTapLatency(int latency_ms); 00197 00198 /** 00199 * Get the time of window between tap latency and a double tap. 00200 * 00201 * @return The amount of time after the expiration of the latency time 00202 * during which a second valid tap can begin, in milliseconds. 00203 */ 00204 float getWindowTime(void); 00205 00206 /** 00207 * Set the time of the window between tap latency and a double tap. 00208 * 00209 * @param window_ms The amount of time after the expiration of the latency 00210 * time during which a second valid tap can begin, 00211 * in milliseconds. 00212 */ 00213 void setWindowTime(int window_ms); 00214 00215 /** 00216 * Get the threshold value for detecting activity. 00217 * 00218 * @return The threshold value for detecting activity as an 8-bit number. 00219 * Scale factor is 62.5mg/LSB. 00220 */ 00221 int getActivityThreshold(void); 00222 00223 /** 00224 * Set the threshold value for detecting activity. 00225 * 00226 * @param threshold The threshold value for detecting activity as an 8-bit 00227 * number. Scale factor is 62.5mg/LSB. A value of 0 may 00228 * result in undesirable behavior if the activity 00229 * interrupt is enabled. 00230 */ 00231 void setActivityThreshold(int threshold); 00232 00233 /** 00234 * Get the threshold value for detecting inactivity. 00235 * 00236 * @return The threshold value for detecting inactivity as an 8-bit number. 00237 * Scale factor is 62.5mg/LSB. 00238 */ 00239 int getInactivityThreshold(void); 00240 00241 /** 00242 * Set the threshold value for detecting inactivity. 00243 * 00244 * @param threshold The threshold value for detecting inactivity as an 00245 * 8-bit number. Scale factor is 62.5mg/LSB. 00246 */ 00247 void setInactivityThreshold(int threshold); 00248 00249 /** 00250 * Get the time required for inactivity to be declared. 00251 * 00252 * @return The amount of time that acceleration must be less than the 00253 * inactivity threshold for inactivity to be declared, in 00254 * seconds. 00255 */ 00256 int getTimeInactivity(void); 00257 00258 /** 00259 * Set the time required for inactivity to be declared. 00260 * 00261 * @param inactivity The amount of time that acceleration must be less than 00262 * the inactivity threshold for inactivity to be 00263 * declared, in seconds. A value of 0 results in an 00264 * interrupt when the output data is less than the 00265 * threshold inactivity. 00266 */ 00267 void setTimeInactivity(int timeInactivity); 00268 00269 /** 00270 * Get the activity/inactivity control settings. 00271 * 00272 * D7 D6 D5 D4 00273 * +-----------+--------------+--------------+--------------+ 00274 * | ACT ac/dc | ACT_X enable | ACT_Y enable | ACT_Z enable | 00275 * +-----------+--------------+--------------+--------------+ 00276 * 00277 * D3 D2 D1 D0 00278 * +-------------+----------------+----------------+----------------+ 00279 * | INACT ac/dc | INACT_X enable | INACT_Y enable | INACT_Z enable | 00280 * +-------------+----------------+----------------+----------------+ 00281 * 00282 * See datasheet for details. 00283 * 00284 * @return The contents of the ACT_INACT_CTL register. 00285 */ 00286 int getActivityInactivityControl(void); 00287 00288 /** 00289 * Set the activity/inactivity control settings. 00290 * 00291 * D7 D6 D5 D4 00292 * +-----------+--------------+--------------+--------------+ 00293 * | ACT ac/dc | ACT_X enable | ACT_Y enable | ACT_Z enable | 00294 * +-----------+--------------+--------------+--------------+ 00295 * 00296 * D3 D2 D1 D0 00297 * +-------------+----------------+----------------+----------------+ 00298 * | INACT ac/dc | INACT_X enable | INACT_Y enable | INACT_Z enable | 00299 * +-------------+----------------+----------------+----------------+ 00300 * 00301 * See datasheet for details. 00302 * 00303 * @param settings The control byte to write to the ACT_INACT_CTL register. 00304 */ 00305 void setActivityInactivityControl(int settings); 00306 00307 /** 00308 * Get the threshold for free fall detection. 00309 * 00310 * @return The threshold value for free-fall detection, as an 8-bit number, 00311 * with scale factor 62.5mg/LSB. 00312 */ 00313 int getFreefallThreshold(void); 00314 00315 /** 00316 * Set the threshold for free fall detection. 00317 * 00318 * @return The threshold value for free-fall detection, as an 8-bit number, 00319 * with scale factor 62.5mg/LSB. A value of 0 may result in 00320 * undesirable behavior if the free-fall interrupt is enabled. 00321 * Values between 300 mg and 600 mg (0x05 to 0x09) are recommended. 00322 */ 00323 void setFreefallThreshold(int threshold); 00324 00325 /** 00326 * Get the time required to generate a free fall interrupt. 00327 * 00328 * @return The minimum time that the value of all axes must be less than 00329 * the freefall threshold to generate a free-fall interrupt, in 00330 * milliseconds. 00331 */ 00332 int getFreefallTime(void); 00333 00334 /** 00335 * Set the time required to generate a free fall interrupt. 00336 * 00337 * @return The minimum time that the value of all axes must be less than 00338 * the freefall threshold to generate a free-fall interrupt, in 00339 * milliseconds. A value of 0 may result in undesirable behavior 00340 * if the free-fall interrupt is enabled. Values between 100 ms 00341 * and 350 ms (0x14 to 0x46) are recommended. 00342 */ 00343 void setFreefallTime(int freefallTime_ms); 00344 00345 /** 00346 * Get the axis tap settings. 00347 * 00348 * D3 D2 D1 D0 00349 * +----------+--------------+--------------+--------------+ 00350 * | Suppress | TAP_X enable | TAP_Y enable | TAP_Z enable | 00351 * +----------+--------------+--------------+--------------+ 00352 * 00353 * (D7-D4 are 0s). 00354 * 00355 * See datasheet for more details. 00356 * 00357 * @return The contents of the TAP_AXES register. 00358 */ 00359 int getTapAxisControl(void); 00360 00361 /** 00362 * Set the axis tap settings. 00363 * 00364 * D3 D2 D1 D0 00365 * +----------+--------------+--------------+--------------+ 00366 * | Suppress | TAP_X enable | TAP_Y enable | TAP_Z enable | 00367 * +----------+--------------+--------------+--------------+ 00368 * 00369 * (D7-D4 are 0s). 00370 * 00371 * See datasheet for more details. 00372 * 00373 * @param The control byte to write to the TAP_AXES register. 00374 */ 00375 void setTapAxisControl(int settings); 00376 00377 /** 00378 * Get the source of a tap. 00379 * 00380 * @return The contents of the ACT_TAP_STATUS register. 00381 */ 00382 int getTapSource(void); 00383 00384 /** 00385 * Set the power mode. 00386 * 00387 * @param mode 0 -> Normal operation. 00388 * 1 -> Reduced power operation. 00389 */ 00390 void setPowerMode(char mode); 00391 00392 /** 00393 * Set the data rate. 00394 * 00395 * @param rate The rate code (see #defines or datasheet). 00396 */ 00397 void setDataRate(int rate); 00398 00399 /** 00400 * Get the power control settings. 00401 * 00402 * See datasheet for details. 00403 * 00404 * @return The contents of the POWER_CTL register. 00405 */ 00406 int getPowerControl(void); 00407 00408 /** 00409 * Set the power control settings. 00410 * 00411 * See datasheet for details. 00412 * 00413 * @param The control byte to write to the POWER_CTL register. 00414 */ 00415 void setPowerControl(int settings); 00416 00417 /** 00418 * Get the interrupt enable settings. 00419 * 00420 * @return The contents of the INT_ENABLE register. 00421 */ 00422 int getInterruptEnableControl(void); 00423 00424 /** 00425 * Set the interrupt enable settings. 00426 * 00427 * @param settings The control byte to write to the INT_ENABLE register. 00428 */ 00429 void setInterruptEnableControl(int settings); 00430 00431 /** 00432 * Get the interrupt mapping settings. 00433 * 00434 * @return The contents of the INT_MAP register. 00435 */ 00436 int getInterruptMappingControl(void); 00437 00438 /** 00439 * Set the interrupt mapping settings. 00440 * 00441 * @param settings The control byte to write to the INT_MAP register. 00442 */ 00443 void setInterruptMappingControl(int settings); 00444 00445 /** 00446 * Get the interrupt source. 00447 * 00448 * @return The contents of the INT_SOURCE register. 00449 */ 00450 int getInterruptSource(void); 00451 00452 /** 00453 * Get the data format settings. 00454 * 00455 * @return The contents of the DATA_FORMAT register. 00456 */ 00457 int getDataFormatControl(void); 00458 00459 /** 00460 * Set the data format settings. 00461 * 00462 * @param settings The control byte to write to the DATA_FORMAT register. 00463 */ 00464 void setDataFormatControl(int settings); 00465 00466 /** 00467 * Get the output of all three axes. 00468 * 00469 * @param Pointer to a buffer to hold the accelerometer value for the 00470 * x-axis, y-axis and z-axis [in that order]. 00471 */ 00472 void getOutput(int* readings); 00473 00474 00475 /** 00476 * Get acceleration of X axis. 00477 * 00478 *@return Accelerometer value for the x-axis. 00479 */ 00480 int getAx(); 00481 00482 00483 /** 00484 * Get acceleration of Y axis. 00485 * 00486 *@return Accelerometer value for the y-axis 00487 */ 00488 int getAy(); 00489 00490 00491 /** 00492 * Get acceleration of Z axis. 00493 * 00494 *@return Accelerometer value for the z-axis 00495 */ 00496 int getAz(); 00497 00498 00499 00500 00501 00502 /** 00503 * Get the FIFO control settings. 00504 * 00505 * @return The contents of the FIFO_CTL register. 00506 */ 00507 int getFifoControl(void); 00508 00509 /** 00510 * Set the FIFO control settings. 00511 * 00512 * @param The control byte to write to the FIFO_CTL register. 00513 */ 00514 void setFifoControl(int settings); 00515 00516 /** 00517 * Get FIFO status. 00518 * 00519 * @return The contents of the FIFO_STATUS register. 00520 */ 00521 int getFifoStatus(void); 00522 00523 private: 00524 00525 SPI spi_; 00526 DigitalOut nCS_; 00527 00528 /** 00529 * Read one byte from a register on the device. 00530 * 00531 * @param address Address of the register to read. 00532 * 00533 * @return The contents of the register address. 00534 */ 00535 int oneByteRead(int address); 00536 00537 /** 00538 * Write one byte to a register on the device. 00539 * 00540 * @param address Address of the register to write to. 00541 * @param data The data to write into the register. 00542 */ 00543 void oneByteWrite(int address, char data); 00544 00545 /** 00546 * Read several consecutive bytes on the device. 00547 * 00548 * @param startAddress The address of the first register to read from. 00549 * @param buffer Pointer to a buffer to store data read from the device. 00550 * @param size The number of bytes to read. 00551 */ 00552 void multiByteRead(int startAddress, char* buffer, int size); 00553 00554 /** 00555 * Write several consecutive bytes on the device. 00556 * 00557 * @param startAddress The address of the first register to write to. 00558 * @param buffer Pointer to a buffer which contains the data to write. 00559 * @param size The number of bytes to write. 00560 */ 00561 void multiByteWrite(int startAddress, char* buffer, int size); 00562 00563 }; 00564 00565 #endif /* ADXL345_H */
Generated on Thu Jul 14 2022 20:07:13 by 1.7.2