找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2604|回复: 1
打印 上一主题 下一主题
收起左侧

ADXL345 三軸重力加速感測器

[复制链接]
跳转到指定楼层
楼主
ID:399412 发表于 2018-9-18 11:12 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
这是我在网上找的最详细的资料了, 针对 ADXL345 三轴G重力加速 sensor 最新的原理图, 单芯片说明书, ST源成码, Arduino 代码. 希望对你有帮助. 如果觉得好用, 别忘了打赏 !

Arduino .h 代碼:
  1. /**************************************************************************/
  2. /*!
  3.     @file     Adafruit_ADS1015.h
  4.     @author   K. Townsend (Adafruit Industries)
  5.     @license  BSD (see license.txt)

  6.     This is a library for the Adafruit ADS1015 breakout board
  7.     ----> https://www.adafruit.com/products/???

  8.     Adafruit invests time and resources providing this open source code,
  9.     please support Adafruit and open-source hardware by purchasing
  10.     products from Adafruit!

  11.     @section  HISTORY

  12.     v1.0  - First release
  13. */
  14. /**************************************************************************/

  15. #if ARDUINO >= 100
  16. #include "Arduino.h"
  17. #else
  18. #include "WProgram.h"
  19. #endif

  20. #include <Adafruit_Sensor.h>
  21. #include <Wire.h>

  22. /*=========================================================================
  23.     I2C ADDRESS/BITS
  24.     -----------------------------------------------------------------------*/
  25.     #define ADXL345_ADDRESS                 (0x53)    // Assumes ALT address pin low
  26. /*=========================================================================*/

  27. /*=========================================================================
  28.     REGISTERS
  29.     -----------------------------------------------------------------------*/
  30.     #define ADXL345_REG_DEVID               (0x00)    // Device ID
  31.     #define ADXL345_REG_THRESH_TAP          (0x1D)    // Tap threshold
  32.     #define ADXL345_REG_OFSX                (0x1E)    // X-axis offset
  33.     #define ADXL345_REG_OFSY                (0x1F)    // Y-axis offset
  34.     #define ADXL345_REG_OFSZ                (0x20)    // Z-axis offset
  35.     #define ADXL345_REG_DUR                 (0x21)    // Tap duration
  36.     #define ADXL345_REG_LATENT              (0x22)    // Tap latency
  37.     #define ADXL345_REG_WINDOW              (0x23)    // Tap window
  38.     #define ADXL345_REG_THRESH_ACT          (0x24)    // Activity threshold
  39.     #define ADXL345_REG_THRESH_INACT        (0x25)    // Inactivity threshold
  40.     #define ADXL345_REG_TIME_INACT          (0x26)    // Inactivity time
  41.     #define ADXL345_REG_ACT_INACT_CTL       (0x27)    // Axis enable control for activity and inactivity detection
  42.     #define ADXL345_REG_THRESH_FF           (0x28)    // Free-fall threshold
  43.     #define ADXL345_REG_TIME_FF             (0x29)    // Free-fall time
  44.     #define ADXL345_REG_TAP_AXES            (0x2A)    // Axis control for single/double tap
  45.     #define ADXL345_REG_ACT_TAP_STATUS      (0x2B)    // Source for single/double tap
  46.     #define ADXL345_REG_BW_RATE             (0x2C)    // Data rate and power mode control
  47.     #define ADXL345_REG_POWER_CTL           (0x2D)    // Power-saving features control
  48.     #define ADXL345_REG_INT_ENABLE          (0x2E)    // Interrupt enable control
  49.     #define ADXL345_REG_INT_MAP             (0x2F)    // Interrupt mapping control
  50.     #define ADXL345_REG_INT_SOURCE          (0x30)    // Source of interrupts
  51.     #define ADXL345_REG_DATA_FORMAT         (0x31)    // Data format control
  52.     #define ADXL345_REG_DATAX0              (0x32)    // X-axis data 0
  53.     #define ADXL345_REG_DATAX1              (0x33)    // X-axis data 1
  54.     #define ADXL345_REG_DATAY0              (0x34)    // Y-axis data 0
  55.     #define ADXL345_REG_DATAY1              (0x35)    // Y-axis data 1
  56.     #define ADXL345_REG_DATAZ0              (0x36)    // Z-axis data 0
  57.     #define ADXL345_REG_DATAZ1              (0x37)    // Z-axis data 1
  58.     #define ADXL345_REG_FIFO_CTL            (0x38)    // FIFO control
  59.     #define ADXL345_REG_FIFO_STATUS         (0x39)    // FIFO status
  60. /*=========================================================================*/

  61. /*=========================================================================
  62.     REGISTERS
  63.     -----------------------------------------------------------------------*/
  64.     #define ADXL345_MG2G_MULTIPLIER (0.004)  // 4mg per lsb
  65. /*=========================================================================*/

  66. /* Used with register 0x2C (ADXL345_REG_BW_RATE) to set bandwidth */
  67. typedef enum
  68. {
  69.   ADXL345_DATARATE_3200_HZ    = 0b1111, // 1600Hz Bandwidth   140渙 IDD
  70.   ADXL345_DATARATE_1600_HZ    = 0b1110, //  800Hz Bandwidth    90渙 IDD
  71.   ADXL345_DATARATE_800_HZ     = 0b1101, //  400Hz Bandwidth   140渙 IDD
  72.   ADXL345_DATARATE_400_HZ     = 0b1100, //  200Hz Bandwidth   140渙 IDD
  73.   ADXL345_DATARATE_200_HZ     = 0b1011, //  100Hz Bandwidth   140渙 IDD
  74.   ADXL345_DATARATE_100_HZ     = 0b1010, //   50Hz Bandwidth   140渙 IDD
  75.   ADXL345_DATARATE_50_HZ      = 0b1001, //   25Hz Bandwidth    90渙 IDD
  76.   ADXL345_DATARATE_25_HZ      = 0b1000, // 12.5Hz Bandwidth    60渙 IDD
  77.   ADXL345_DATARATE_12_5_HZ    = 0b0111, // 6.25Hz Bandwidth    50渙 IDD
  78.   ADXL345_DATARATE_6_25HZ     = 0b0110, // 3.13Hz Bandwidth    45渙 IDD
  79.   ADXL345_DATARATE_3_13_HZ    = 0b0101, // 1.56Hz Bandwidth    40渙 IDD
  80.   ADXL345_DATARATE_1_56_HZ    = 0b0100, // 0.78Hz Bandwidth    34渙 IDD
  81.   ADXL345_DATARATE_0_78_HZ    = 0b0011, // 0.39Hz Bandwidth    23渙 IDD
  82.   ADXL345_DATARATE_0_39_HZ    = 0b0010, // 0.20Hz Bandwidth    23渙 IDD
  83.   ADXL345_DATARATE_0_20_HZ    = 0b0001, // 0.10Hz Bandwidth    23渙 IDD
  84.   ADXL345_DATARATE_0_10_HZ    = 0b0000  // 0.05Hz Bandwidth    23渙 IDD (default value)
  85. } dataRate_t;

  86. /* Used with register 0x31 (ADXL345_REG_DATA_FORMAT) to set g range */
  87. typedef enum
  88. {
  89.   ADXL345_RANGE_16_G          = 0b11,   // +/- 16g
  90.   ADXL345_RANGE_8_G           = 0b10,   // +/- 8g
  91.   ADXL345_RANGE_4_G           = 0b01,   // +/- 4g
  92.   ADXL345_RANGE_2_G           = 0b00    // +/- 2g (default value)
  93. } range_t;

  94. class Adafruit_ADXL345_Unified : public Adafruit_Sensor {
  95. public:
  96.   Adafruit_ADXL345_Unified(int32_t sensorID = -1);
  97.   Adafruit_ADXL345_Unified(uint8_t clock, uint8_t miso, uint8_t mosi, uint8_t cs, int32_t sensorID = -1);

  98.   bool       begin(void);
  99.   void       setRange(range_t range);
  100.   range_t    getRange(void);
  101.   void       setDataRate(dataRate_t dataRate);
  102.   dataRate_t getDataRate(void);
  103.   bool       getEvent(sensors_event_t*);
  104.   void       getSensor(sensor_t*);

  105.   uint8_t    getDeviceID(void);
  106.   void       writeRegister(uint8_t reg, uint8_t value);
  107.   uint8_t    readRegister(uint8_t reg);
  108.   int16_t    read16(uint8_t reg);

  109.   int16_t    getX(void), getY(void), getZ(void);
  110. private:

  111.   inline uint8_t  i2cread(void);
  112.   inline void     i2cwrite(uint8_t x);

  113.   int32_t _sensorID;
  114.   range_t _range;
  115.   uint8_t _clk, _do, _di, _cs;
  116.   bool    _i2c;
  117. };
复制代码

Arduino .cpp代碼:
  1. /**************************************************************************/
  2. /*!
  3.     @file     Adafruit_ADXL345.cpp
  4.     @author   K.Townsend (Adafruit Industries)
  5.     @license  BSD (see license.txt)

  6.     The ADXL345 is a digital accelerometer with 13-bit resolution, capable
  7.     of measuring up to +/-16g.  This driver communicate using I2C.

  8.     This is a library for the Adafruit ADXL345 breakout
  9.     ----> https://www.adafruit.com/products/1231

  10.     Adafruit invests time and resources providing this open source code,
  11.     please support Adafruit and open-source hardware by purchasing
  12.     products from Adafruit!

  13.     @section  HISTORY
  14.    
  15.     v1.1 - Added Adafruit_Sensor library support
  16.     v1.0 - First release
  17. */
  18. /**************************************************************************/
  19. #if ARDUINO >= 100
  20. #include "Arduino.h"
  21. #else
  22. #include "WProgram.h"
  23. #endif

  24. #include <Wire.h>
  25. #include <limits.h>

  26. #include "Adafruit_ADXL345_U.h"

  27. /**************************************************************************/
  28. /*!
  29.     @brief  Abstract away platform differences in Arduino wire library
  30. */
  31. /**************************************************************************/
  32. inline uint8_t Adafruit_ADXL345_Unified::i2cread(void) {
  33.   #if ARDUINO >= 100
  34.   return Wire.read();
  35.   #else
  36.   return Wire.receive();
  37.   #endif
  38. }

  39. /**************************************************************************/
  40. /*!
  41.     @brief  Abstract away platform differences in Arduino wire library
  42. */
  43. /**************************************************************************/
  44. inline void Adafruit_ADXL345_Unified::i2cwrite(uint8_t x) {
  45.   #if ARDUINO >= 100
  46.   Wire.write((uint8_t)x);
  47.   #else
  48.   Wire.send(x);
  49.   #endif
  50. }

  51. /**************************************************************************/
  52. /*!
  53.     @brief  Abstract away SPI receiver & transmitter
  54. */
  55. /**************************************************************************/
  56. static uint8_t spixfer(uint8_t clock, uint8_t miso, uint8_t mosi, uint8_t data) {
  57.   uint8_t reply = 0;
  58.   for (int i=7; i>=0; i--) {
  59.     reply <<= 1;
  60.     digitalWrite(clock, LOW);
  61.     digitalWrite(mosi, data & (1<<i));
  62.     digitalWrite(clock, HIGH);
  63.     if (digitalRead(miso))
  64.       reply |= 1;
  65.   }
  66.   return reply;
  67. }

  68. /**************************************************************************/
  69. /*!
  70.     @brief  Writes 8-bits to the specified destination register
  71. */
  72. /**************************************************************************/
  73. void Adafruit_ADXL345_Unified::writeRegister(uint8_t reg, uint8_t value) {
  74.   if (_i2c) {
  75.     Wire.beginTransmission(ADXL345_ADDRESS);
  76.     i2cwrite((uint8_t)reg);
  77.     i2cwrite((uint8_t)(value));
  78.     Wire.endTransmission();
  79.   } else {
  80.     digitalWrite(_cs, LOW);
  81.     spixfer(_clk, _di, _do, reg);
  82.     spixfer(_clk, _di, _do, value);
  83.     digitalWrite(_cs, HIGH);
  84.   }
  85. }

  86. /**************************************************************************/
  87. /*!
  88.     @brief  Reads 8-bits from the specified register
  89. */
  90. /**************************************************************************/
  91. uint8_t Adafruit_ADXL345_Unified::readRegister(uint8_t reg) {
  92.   if (_i2c) {
  93.     Wire.beginTransmission(ADXL345_ADDRESS);
  94.     i2cwrite(reg);
  95.     Wire.endTransmission();
  96.     Wire.requestFrom(ADXL345_ADDRESS, 1);
  97.     return (i2cread());
  98.   } else {
  99.     reg |= 0x80; // read byte
  100.     digitalWrite(_cs, LOW);
  101.     spixfer(_clk, _di, _do, reg);
  102.     uint8_t reply = spixfer(_clk, _di, _do, 0xFF);
  103.     digitalWrite(_cs, HIGH);
  104.     return reply;
  105.   }  
  106. }

  107. /**************************************************************************/
  108. /*!
  109.     @brief  Reads 16-bits from the specified register
  110. */
  111. /**************************************************************************/
  112. int16_t Adafruit_ADXL345_Unified::read16(uint8_t reg) {
  113.   if (_i2c) {
  114.     Wire.beginTransmission(ADXL345_ADDRESS);
  115.     i2cwrite(reg);
  116.     Wire.endTransmission();
  117.     Wire.requestFrom(ADXL345_ADDRESS, 2);
  118.     return (uint16_t)(i2cread() | (i2cread() << 8));  
  119.   } else {
  120.     reg |= 0x80 | 0x40; // read byte | multibyte
  121.     digitalWrite(_cs, LOW);
  122.     spixfer(_clk, _di, _do, reg);
  123.     uint16_t reply = spixfer(_clk, _di, _do, 0xFF)  | (spixfer(_clk, _di, _do, 0xFF) << 8);
  124.     digitalWrite(_cs, HIGH);
  125.     return reply;
  126.   }   
  127. }

  128. /**************************************************************************/
  129. /*!
  130.     @brief  Read the device ID (can be used to check connection)
  131. */
  132. /**************************************************************************/
  133. uint8_t Adafruit_ADXL345_Unified::getDeviceID(void) {
  134.   // Check device ID register
  135.   return readRegister(ADXL345_REG_DEVID);
  136. }

  137. /**************************************************************************/
  138. /*!
  139.     @brief  Gets the most recent X axis value
  140. */
  141. /**************************************************************************/
  142. int16_t Adafruit_ADXL345_Unified::getX(void) {
  143.   return read16(ADXL345_REG_DATAX0);
  144. }

  145. /**************************************************************************/
  146. /*!
  147.     @brief  Gets the most recent Y axis value
  148. */
  149. /**************************************************************************/
  150. int16_t Adafruit_ADXL345_Unified::getY(void) {
  151.   return read16(ADXL345_REG_DATAY0);
  152. }

  153. /**************************************************************************/
  154. /*!
  155.     @brief  Gets the most recent Z axis value
  156. */
  157. /**************************************************************************/
  158. int16_t Adafruit_ADXL345_Unified::getZ(void) {
  159.   return read16(ADXL345_REG_DATAZ0);
  160. }

  161. /**************************************************************************/
  162. /*!
  163.     @brief  Instantiates a new ADXL345 class
  164. */
  165. /**************************************************************************/
  166. Adafruit_ADXL345_Unified::Adafruit_ADXL345_Unified(int32_t sensorID) {
  167.   _sensorID = sensorID;
  168.   _range = ADXL345_RANGE_2_G;
  169.   _i2c = true;
  170. }

  171. /**************************************************************************/
  172. /*!
  173.     @brief  Instantiates a new ADXL345 class in SPI mode
  174. */
  175. /**************************************************************************/
  176. Adafruit_ADXL345_Unified::Adafruit_ADXL345_Unified(uint8_t clock, uint8_t miso, uint8_t mosi, uint8_t cs, int32_t sensorID) {
  177.   _sensorID = sensorID;
  178.   _range = ADXL345_RANGE_2_G;
  179.   _cs = cs;
  180.   _clk = clock;
  181.   _do = mosi;
  182.   _di = miso;
  183.   _i2c = false;
  184. }

  185. /**************************************************************************/
  186. /*!
  187.     @brief  Setups the HW (reads coefficients values, etc.)
  188. */
  189. /**************************************************************************/
  190. bool Adafruit_ADXL345_Unified::begin() {
  191.   
  192.   if (_i2c)
  193.     Wire.begin();
  194.   else {
  195.     pinMode(_cs, OUTPUT);
  196.     pinMode(_clk, OUTPUT);
  197.     digitalWrite(_clk, HIGH);
  198.     pinMode(_do, OUTPUT);
  199.     pinMode(_di, INPUT);
  200.   }

  201.   /* Check connection */
  202.   uint8_t deviceid = getDeviceID();
  203.   if (deviceid != 0xE5)
  204.   {
  205.     /* No ADXL345 detected ... return false */
  206.     Serial.println(deviceid, HEX);
  207.     return false;
  208.   }
  209.   
  210.   // Enable measurements
  211.   writeRegister(ADXL345_REG_POWER_CTL, 0x08);  
  212.    
  213.   return true;
  214. }

  215. /**************************************************************************/
  216. /*!
  217.     @brief  Sets the g range for the accelerometer
  218. */
  219. /**************************************************************************/
  220. void Adafruit_ADXL345_Unified::setRange(range_t range)
  221. {
  222.   /* Red the data format register to preserve bits */
  223.   uint8_t format = readRegister(ADXL345_REG_DATA_FORMAT);

  224.   /* Update the data rate */
  225.   format &= ~0x0F;
  226.   format |= range;
  227.   
  228.   /* Make sure that the FULL-RES bit is enabled for range scaling */
  229.   format |= 0x08;
  230.   
  231.   /* Write the register back to the IC */
  232.   writeRegister(ADXL345_REG_DATA_FORMAT, format);
  233.   
  234.   /* Keep track of the current range (to avoid readbacks) */
  235.   _range = range;
  236. }

  237. /**************************************************************************/
  238. /*!
  239.     @brief  Sets the g range for the accelerometer
  240. */
  241. /**************************************************************************/
  242. range_t Adafruit_ADXL345_Unified::getRange(void)
  243. {
  244.   /* Red the data format register to preserve bits */
  245.   return (range_t)(readRegister(ADXL345_REG_DATA_FORMAT) & 0x03);
  246. }

  247. /**************************************************************************/
  248. /*!
  249.     @brief  Sets the data rate for the ADXL345 (controls power consumption)
  250. */
  251. /**************************************************************************/
  252. void Adafruit_ADXL345_Unified::setDataRate(dataRate_t dataRate)
  253. {
  254.   /* Note: The LOW_POWER bits are currently ignored and we always keep
  255.      the device in 'normal' mode */
  256.   writeRegister(ADXL345_REG_BW_RATE, dataRate);
  257. }

  258. /**************************************************************************/
  259. /*!
  260.     @brief  Sets the data rate for the ADXL345 (controls power consumption)
  261. */
  262. /**************************************************************************/
  263. dataRate_t Adafruit_ADXL345_Unified::getDataRate(void)
  264. {
  265.   return (dataRate_t)(readRegister(ADXL345_REG_BW_RATE) & 0x0F);
  266. }

  267. /**************************************************************************/
  268. /*!
  269.     @brief  Gets the most recent sensor event
  270. */
  271. /**************************************************************************/
  272. bool Adafruit_ADXL345_Unified::getEvent(sensors_event_t *event) {
  273.   /* Clear the event */
  274.   memset(event, 0, sizeof(sensors_event_t));
  275.   
  276.   event->version   = sizeof(sensors_event_t);
  277.   event->sensor_id = _sensorID;
  278.   event->type      = SENSOR_TYPE_ACCELEROMETER;
  279.   event->timestamp = 0;
  280.   event->acceleration.x = getX() * ADXL345_MG2G_MULTIPLIER * SENSORS_GRAVITY_STANDARD;
  281.   event->acceleration.y = getY() * ADXL345_MG2G_MULTIPLIER * SENSORS_GRAVITY_STANDARD;
  282.   event->acceleration.z = getZ() * ADXL345_MG2G_MULTIPLIER * SENSORS_GRAVITY_STANDARD;
  283.   
  284.   return true;
  285. }

  286. /**************************************************************************/
  287. /*!
  288.     @brief  Gets the sensor_t data
  289. */
  290. /**************************************************************************/
  291. void Adafruit_ADXL345_Unified::getSensor(sensor_t *sensor) {
  292.   /* Clear the sensor_t object */
  293.   memset(sensor, 0, sizeof(sensor_t));

  294.   /* Insert the sensor name in the fixed length char array */
  295.   strncpy (sensor->name, "ADXL345", sizeof(sensor->name) - 1);
  296.   sensor->name[sizeof(sensor->name)- 1] = 0;
  297.   sensor->version     = 1;
  298.   sensor->sensor_id   = _sensorID;
  299.   sensor->type        = SENSOR_TYPE_PRESSURE;
  300.   sensor->min_delay   = 0;
  301.   sensor->max_value   = -156.9064F; /* -16g = 156.9064 m/s^2  */
  302.   sensor->min_value   = 156.9064F;  /*  16g = 156.9064 m/s^2  */
  303.   sensor->resolution  = 0.03923F;   /*  4mg = 0.0392266 m/s^2 */
  304. }
复制代码

Arduino 測試程序:
  1. #include <Wire.h>
  2. #include <Adafruit_Sensor.h>
  3. #include <Adafruit_ADXL345_U.h>

  4. /* Assign a unique ID to this sensor at the same time */
  5. Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);

  6. void displaySensorDetails(void)
  7. {
  8.   sensor_t sensor;
  9.   accel.getSensor(&sensor);
  10.   Serial.println("------------------------------------");
  11.   Serial.print  ("Sensor:       "); Serial.println(sensor.name);
  12.   Serial.print  ("Driver Ver:   "); Serial.println(sensor.version);
  13.   Serial.print  ("Unique ID:    "); Serial.println(sensor.sensor_id);
  14.   Serial.print  ("Max Value:    "); Serial.print(sensor.max_value); Serial.println(" m/s^2");
  15.   Serial.print  ("Min Value:    "); Serial.print(sensor.min_value); Serial.println(" m/s^2");
  16.   Serial.print  ("Resolution:   "); Serial.print(sensor.resolution); Serial.println(" m/s^2");  
  17.   Serial.println("------------------------------------");
  18.   Serial.println("");
  19.   delay(500);
  20. }

  21. void displayDataRate(void)
  22. {
  23.   Serial.print  ("Data Rate:    ");
  24.   
  25.   switch(accel.getDataRate())
  26.   {
  27.     case ADXL345_DATARATE_3200_HZ:
  28.       Serial.print  ("3200 ");
  29.       break;
  30.     case ADXL345_DATARATE_1600_HZ:
  31.       Serial.print  ("1600 ");
  32.       break;
  33.     case ADXL345_DATARATE_800_HZ:
  34.       Serial.print  ("800 ");
  35.       break;
  36.     case ADXL345_DATARATE_400_HZ:
  37.       Serial.print  ("400 ");
  38.       break;
  39.     case ADXL345_DATARATE_200_HZ:
  40.       Serial.print  ("200 ");
  41.       break;
  42.     case ADXL345_DATARATE_100_HZ:
  43.       Serial.print  ("100 ");
  44.       break;
  45.     case ADXL345_DATARATE_50_HZ:
  46.       Serial.print  ("50 ");
  47.       break;
  48.     case ADXL345_DATARATE_25_HZ:
  49.       Serial.print  ("25 ");
  50.       break;
  51.     case ADXL345_DATARATE_12_5_HZ:
  52.       Serial.print  ("12.5 ");
  53.       break;
  54.     case ADXL345_DATARATE_6_25HZ:
  55.       Serial.print  ("6.25 ");
  56.       break;
  57.     case ADXL345_DATARATE_3_13_HZ:
  58.       Serial.print  ("3.13 ");
  59.       break;
  60.     case ADXL345_DATARATE_1_56_HZ:
  61.       Serial.print  ("1.56 ");
  62.       break;
  63.     case ADXL345_DATARATE_0_78_HZ:
  64.       Serial.print  ("0.78 ");
  65.       break;
  66.     case ADXL345_DATARATE_0_39_HZ:
  67.       Serial.print  ("0.39 ");
  68.       break;
  69.     case ADXL345_DATARATE_0_20_HZ:
  70.       Serial.print  ("0.20 ");
  71.       break;
  72.     case ADXL345_DATARATE_0_10_HZ:
  73.       Serial.print  ("0.10 ");
  74.       break;
  75.     default:
  76.       Serial.print  ("???? ");
  77.       break;
  78.   }  
  79.   Serial.println(" Hz");  
  80. }

  81. void displayRange(void)
  82. {
  83.   Serial.print  ("Range:         +/- ");
  84.   
  85.   switch(accel.getRange())
  86.   {
  87.     case ADXL345_RANGE_16_G:
  88.       Serial.print  ("16 ");
  89.       break;
  90.     case ADXL345_RANGE_8_G:
  91.       Serial.print  ("8 ");
  92.       break;
  93.     case ADXL345_RANGE_4_G:
  94.       Serial.print  ("4 ");
  95.       break;
  96.     case ADXL345_RANGE_2_G:
  97.       Serial.print  ("2 ");
  98.       break;
  99.     default:
  100.       Serial.print  ("?? ");
  101.       break;
  102.   }  
  103.   Serial.println(" g");  
  104. }

  105. void setup(void)
  106. {
  107. #ifndef ESP8266
  108.   while (!Serial); // for Leonardo/Micro/Zero
  109. #endif
  110.   Serial.begin(9600);
  111.   Serial.println("Accelerometer Test"); Serial.println("");
  112.   
  113.   /* Initialise the sensor */
  114.   if(!accel.begin())
  115.   {
  116.     /* There was a problem detecting the ADXL345 ... check your connections */
  117.     Serial.println("Ooops, no ADXL345 detected ... Check your wiring!");
  118.     while(1);
  119.   }

  120.   /* Set the range to whatever is appropriate for your project */
  121.   accel.setRange(ADXL345_RANGE_16_G);
  122.   // displaySetRange(ADXL345_RANGE_8_G);
  123.   // displaySetRange(ADXL345_RANGE_4_G);
  124.   // displaySetRange(ADXL345_RANGE_2_G);
  125.   
  126.   /* Display some basic information on this sensor */
  127.   displaySensorDetails();
  128.   
  129.   /* Display additional settings (outside the scope of sensor_t) */
  130.   displayDataRate();
  131.   displayRange();
  132.   Serial.println("");
  133. }

  134. void loop(void)
  135. {
  136.   /* Get a new sensor event */
  137.   sensors_event_t event;
  138.   accel.getEvent(&event);

  139.   /* Display the results (acceleration is measured in m/s^2) */
  140.   Serial.print("X: "); Serial.print(event.acceleration.x); Serial.print("  ");
  141.   Serial.print("Y: "); Serial.print(event.acceleration.y); Serial.print("  ");
  142.   Serial.print("Z: "); Serial.print(event.acceleration.z); Serial.print("  ");Serial.println("m/s^2 ");
  143.   delay(500);
  144. }
复制代码

STMicro 測試代碼:
  1. //***************************************
  2. // GY-29 ADXL345 IIC
  3. //****************************************
  4. #include  <REG51.H>       
  5. #include  <math.h>    //Keil library  
  6. #include  <stdio.h>   //Keil library       
  7. #include  <INTRINS.H>
  8. #define   uchar unsigned char
  9. #define   uint unsigned int       
  10. #define   DataPort P0    //LCD1602杅擂傷諳
  11. sbit          SCL=P1^0;      //IIC奀笘竘褐隅砱
  12. sbit           SDA=P1^1;      //IIC杅擂竘褐隅砱
  13. sbit      LCM_RS=P2^0;   //LCD1602韜鍔傷諳               
  14. sbit      LCM_RW=P2^1;   //LCD1602韜鍔傷諳               
  15. sbit      LCM_EN=P2^2;   //LCD1602韜鍔傷諳

  16. #define        SlaveAddress   0xA6          //隅砱璃婓IIC軞盄笢腔植華硊,跦擂ALT  ADDRESS華硊竘褐祥肮党蜊
  17.                               //ALT  ADDRESS竘褐諉華奀華硊峈0xA6ㄛ諉萇埭奀華硊峈0x3A
  18. typedef unsigned char  BYTE;
  19. typedef unsigned short WORD;

  20. BYTE BUF[8];                         //諉彶杅擂遣湔             
  21. uchar ge,shi,bai,qian,wan;           //珆尨曹講
  22. int  dis_data;                       //曹講

  23. void delay(unsigned int k);
  24. void InitLcd();                      //場宎趙lcd1602
  25. void Init_ADXL345(void);             //場宎趙ADXL345

  26. void WriteDataLCM(uchar dataW);
  27. void WriteCommandLCM(uchar CMD,uchar Attribc);
  28. void DisplayOneChar(uchar X,uchar Y,uchar DData);
  29. void conversion(uint temp_data);

  30. void  Single_Write_ADXL345(uchar REG_Address,uchar REG_data);   //等跺迡杅擂
  31. uchar Single_Read_ADXL345(uchar REG_Address);                   //等跺黍囀窒敵湔杅擂
  32. void  Multiple_Read_ADXL345();                                  //蟀哿腔黍囀窒敵湔杅擂
  33. //------------------------------------
  34. void Delay5us();
  35. void Delay5ms();
  36. void ADXL345_Start();
  37. void ADXL345_Stop();
  38. void ADXL345_SendACK(bit ack);
  39. bit  ADXL345_RecvACK();
  40. void ADXL345_SendByte(BYTE dat);
  41. BYTE ADXL345_RecvByte();
  42. void ADXL345_ReadPage();
  43. void ADXL345_WritePage();
  44. //-----------------------------------

  45. //*********************************************************
  46. void conversion(uint temp_data)  
  47. {  
  48.     wan=temp_data/10000+0x30 ;
  49.     temp_data=temp_data%10000;   //豻堍呾
  50.         qian=temp_data/1000+0x30 ;
  51.     temp_data=temp_data%1000;    //豻堍呾
  52.     bai=temp_data/100+0x30   ;
  53.     temp_data=temp_data%100;     //豻堍呾
  54.     shi=temp_data/10+0x30    ;
  55.     temp_data=temp_data%10;      //豻堍呾
  56.     ge=temp_data+0x30;        
  57. }

  58. /*******************************/
  59. void delay(unsigned int k)       
  60. {                                               
  61. unsigned int i,j;                               
  62. for(i=0;i<k;i++)
  63. {                       
  64. for(j=0;j<121;j++)                       
  65. {;}}                                               
  66. }
  67. /*******************************/
  68. void WaitForEnable(void)       
  69. {                                       
  70. DataPort=0xff;               
  71. LCM_RS=0;LCM_RW=1;_nop_();
  72. LCM_EN=1;_nop_();_nop_();
  73. while(DataPort&0x80);       
  74. LCM_EN=0;                               
  75. }                                       
  76. /*******************************/
  77. void WriteCommandLCM(uchar CMD,uchar Attribc)
  78. {                                       
  79. if(Attribc)WaitForEnable();       
  80. LCM_RS=0;LCM_RW=0;_nop_();
  81. DataPort=CMD;_nop_();       
  82. LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  83. }                                       
  84. /*******************************/
  85. void WriteDataLCM(uchar dataW)
  86. {                                       
  87. WaitForEnable();               
  88. LCM_RS=1;LCM_RW=0;_nop_();
  89. DataPort=dataW;_nop_();       
  90. LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  91. }               
  92. /***********************************/
  93. void InitLcd()                               
  94. {                       
  95. WriteCommandLCM(0x38,1);       
  96. WriteCommandLCM(0x08,1);       
  97. WriteCommandLCM(0x01,1);       
  98. WriteCommandLCM(0x06,1);       
  99. WriteCommandLCM(0x0c,1);
  100. }                       
  101. /***********************************/
  102. void DisplayOneChar(uchar X,uchar Y,uchar DData)
  103. {                                               
  104. Y&=1;                                               
  105. X&=15;                                               
  106. if(Y)X|=0x40;                                       
  107. X|=0x80;                       
  108. WriteCommandLCM(X,0);               
  109. WriteDataLCM(DData);               
  110. }                                               

  111. /**************************************
  112. 晊奀5峚鏃(STC90C52RC@12M)
  113. 祥肮腔馱釬遠噫,剒猁覃淕森滲杅ㄛ蛁砩奀笘徹辦奀剒猁党蜊
  114. 絞蜊蚚1T腔MCU奀,覃淕森晊奀滲杅
  115. **************************************/
  116. void Delay5us()
  117. {
  118.     _nop_();_nop_();_nop_();_nop_();
  119.     _nop_();_nop_();_nop_();_nop_();
  120.         _nop_();_nop_();_nop_();_nop_();
  121. }

  122. /**************************************
  123. 晊奀5瑭鏃(STC90C52RC@12M)
  124. 祥肮腔馱釬遠噫,剒猁覃淕森滲杅
  125. 絞蜊蚚1T腔MCU奀,覃淕森晊奀滲杅
  126. **************************************/
  127. void Delay5ms()
  128. {
  129.     WORD n = 560;

  130.     while (n--);
  131. }

  132. /**************************************
  133. 宎陓瘍
  134. **************************************/
  135. void ADXL345_Start()
  136. {
  137.     SDA = 1;                    //嶺詢杅擂盄
  138.     SCL = 1;                    //嶺詢奀笘盄
  139.     Delay5us();                 //晊奀
  140.     SDA = 0;                    //莉汜狟蔥朓
  141.     Delay5us();                 //晊奀
  142.     SCL = 0;                    //嶺腴奀笘盄
  143. }

  144. /**************************************
  145. 礿砦陓瘍
  146. **************************************/
  147. void ADXL345_Stop()
  148. {
  149.     SDA = 0;                    //嶺腴杅擂盄
  150.     SCL = 1;                    //嶺詢奀笘盄
  151.     Delay5us();                 //晊奀
  152.     SDA = 1;                    //莉汜奻汔朓
  153.     Delay5us();                 //晊奀
  154. }

  155. /**************************************
  156. 楷冞茼湘陓瘍
  157. 諳統杅:ack (0:ACK 1:NAK)
  158. **************************************/
  159. void ADXL345_SendACK(bit ack)
  160. {
  161.     SDA = ack;                  //迡茼湘陓瘍
  162.     SCL = 1;                    //嶺詢奀笘盄
  163.     Delay5us();                 //晊奀
  164.     SCL = 0;                    //嶺腴奀笘盄
  165.     Delay5us();                 //晊奀
  166. }

  167. /**************************************
  168. 諉彶茼湘陓瘍
  169. **************************************/
  170. bit ADXL345_RecvACK()
  171. {
  172.     SCL = 1;                    //嶺詢奀笘盄
  173.     Delay5us();                 //晊奀
  174.     CY = SDA;                   //黍茼湘陓瘍
  175.     SCL = 0;                    //嶺腴奀笘盄
  176.     Delay5us();                 //晊奀

  177.     return CY;
  178. }

  179. /**************************************
  180. 砃IIC軞盄楷冞珨跺趼誹杅擂
  181. **************************************/
  182. void ADXL345_SendByte(BYTE dat)
  183. {
  184.     BYTE i;

  185.     for (i=0; i<8; i++)         //8弇數杅
  186.     {
  187.         dat <<= 1;              //痄堤杅擂腔郔詢弇
  188.         SDA = CY;               //冞杅擂諳
  189.         SCL = 1;                //嶺詢奀笘盄
  190.         Delay5us();             //晊奀
  191.         SCL = 0;                //嶺腴奀笘盄
  192.         Delay5us();             //晊奀
  193.     }
  194.     ADXL345_RecvACK();
  195. }

  196. /**************************************
  197. 植IIC軞盄諉彶珨跺趼誹杅擂
  198. **************************************/
  199. BYTE ADXL345_RecvByte()
  200. {
  201.     BYTE i;
  202.     BYTE dat = 0;

  203.     SDA = 1;                    //妏夔囀窒奻嶺,袧掘黍杅擂,
  204.     for (i=0; i<8; i++)         //8弇數杅
  205.     {
  206.         dat <<= 1;
  207.         SCL = 1;                //嶺詢奀笘盄
  208.         Delay5us();             //晊奀
  209.         dat |= SDA;             //黍杅擂               
  210.         SCL = 0;                //嶺腴奀笘盄
  211.         Delay5us();             //晊奀
  212.     }
  213.     return dat;
  214. }

  215. //******等趼誹迡*******************************************

  216. void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)
  217. {
  218.     ADXL345_Start();                  //宎陓瘍
  219.     ADXL345_SendByte(SlaveAddress);   //楷冞扢掘華硊+迡陓瘍
  220.     ADXL345_SendByte(REG_Address);    //囀窒敵湔華硊ㄛ統蕉笢恅pdf22珜
  221.     ADXL345_SendByte(REG_data);       //囀窒敵湔杅擂ㄛ統蕉笢恅pdf22珜
  222.     ADXL345_Stop();                   //楷冞礿砦陓瘍
  223. }

  224. //********等趼誹黍*****************************************
  225. uchar Single_Read_ADXL345(uchar REG_Address)
  226. {  uchar REG_data;
  227.     ADXL345_Start();                          //宎陓瘍
  228.     ADXL345_SendByte(SlaveAddress);           //楷冞扢掘華硊+迡陓瘍
  229.     ADXL345_SendByte(REG_Address);                   //楷冞湔揣等啋華硊ㄛ植0羲宎       
  230.     ADXL345_Start();                          //宎陓瘍
  231.     ADXL345_SendByte(SlaveAddress+1);         //楷冞扢掘華硊+黍陓瘍
  232.     REG_data=ADXL345_RecvByte();              //黍堤敵湔杅擂
  233.         ADXL345_SendACK(1);   
  234.         ADXL345_Stop();                           //礿砦陓瘍
  235.     return REG_data;
  236. }
  237. //*********************************************************
  238. //
  239. //蟀哿黍堤ADXL345囀窒樓厒僅杅擂ㄛ華硊毓峓0x32~0x37
  240. //
  241. //*********************************************************
  242. void Multiple_read_ADXL345(void)
  243. {   uchar i;
  244.     ADXL345_Start();                          //宎陓瘍
  245.     ADXL345_SendByte(SlaveAddress);           //楷冞扢掘華硊+迡陓瘍
  246.     ADXL345_SendByte(0x32);                   //楷冞湔揣等啋華硊ㄛ植0x32羲宎       
  247.     ADXL345_Start();                          //宎陓瘍
  248.     ADXL345_SendByte(SlaveAddress+1);         //楷冞扢掘華硊+黍陓瘍
  249.          for (i=0; i<6; i++)                      //蟀哿黍6跺華硊杅擂ㄛ湔揣笢BUF
  250.     {
  251.         BUF[i] = ADXL345_RecvByte();          //BUF[0]湔揣0x32華硊笢腔杅擂
  252.         if (i == 5)
  253.         {
  254.            ADXL345_SendACK(1);                //郔綴珨跺杅擂剒猁隙NOACK
  255.         }
  256.         else
  257.         {
  258.           ADXL345_SendACK(0);                //隙茼ACK
  259.        }
  260.    }
  261.     ADXL345_Stop();                          //礿砦陓瘍
  262.     Delay5ms();
  263. }


  264. //*****************************************************************

  265. //場宎趙ADXL345ㄛ跦擂剒猁統蕉pdf輛俴党蜊************************
  266. void Init_ADXL345()
  267. {
  268.    Single_Write_ADXL345(0x31,0x0B);   //聆講毓峓,淏蛹16gㄛ13弇耀宒
  269.    Single_Write_ADXL345(0x2C,0x08);   //厒薹扢隅峈12.5 統蕉pdf13珜
  270.    Single_Write_ADXL345(0x2D,0x08);   //恁寁萇埭耀宒   統蕉pdf24珜
  271.    Single_Write_ADXL345(0x2E,0x80);   //妏夔 DATA_READY 笢剿
  272.    Single_Write_ADXL345(0x1E,0x00);   //X 痄講 跦擂聆彸換覜腔袨怓迡pdf29珜
  273.    Single_Write_ADXL345(0x1F,0x00);   //Y 痄講 跦擂聆彸換覜腔袨怓迡pdf29珜
  274.    Single_Write_ADXL345(0x20,0x05);   //Z 痄講 跦擂聆彸換覜腔袨怓迡pdf29珜
  275. }
  276. //***********************************************************************
  277. //珆尨x粣
  278. void display_x()
  279. {   float temp;
  280.     dis_data=(BUF[1]<<8)+BUF[0];  //磁傖杅擂   
  281.         if(dis_data<0){
  282.         dis_data=-dis_data;
  283.     DisplayOneChar(2,0,'-');      //珆尨淏蛹睫瘍弇
  284.         }
  285.         else DisplayOneChar(2,0,' '); //珆尨諾跡

  286.     temp=(float)dis_data*3.9;  //數呾杅擂睿珆尨,脤蕉ADXL345辦厒藷菴4珜
  287.     conversion(temp);          //蛌遙堤珆尨剒猁腔杅擂
  288.         DisplayOneChar(0,0,'X');   //菴0俴ㄛ菴0蹈 珆尨X
  289.     DisplayOneChar(1,0,':');
  290.     DisplayOneChar(3,0,qian);
  291.         DisplayOneChar(4,0,'.');
  292.     DisplayOneChar(5,0,bai);
  293.     DisplayOneChar(6,0,shi);
  294.         DisplayOneChar(7,0,'g');
  295. }

  296. //***********************************************************************
  297. //珆尨y粣
  298. void display_y()
  299. {     float temp;
  300.     dis_data=(BUF[3]<<8)+BUF[2];  //磁傖杅擂   
  301.         if(dis_data<0){
  302.         dis_data=-dis_data;
  303.     DisplayOneChar(2,1,'-');      //珆尨淏蛹睫瘍弇
  304.         }
  305.         else DisplayOneChar(2,1,' '); //珆尨諾跡

  306.     temp=(float)dis_data*3.9;  //數呾杅擂睿珆尨,脤蕉ADXL345辦厒藷菴4珜
  307.     conversion(temp);          //蛌遙堤珆尨剒猁腔杅擂
  308.         DisplayOneChar(0,1,'Y');   //菴1俴ㄛ菴0蹈 珆尨y
  309.     DisplayOneChar(1,1,':');
  310.     DisplayOneChar(3,1,qian);
  311.         DisplayOneChar(4,1,'.');
  312.     DisplayOneChar(5,1,bai);
  313.     DisplayOneChar(6,1,shi);  
  314.         DisplayOneChar(7,1,'g');  
  315. }

  316. //***********************************************************************
  317. //珆尨z粣
  318. void display_z()
  319. {      float temp;
  320.     dis_data=(BUF[5]<<8)+BUF[4];    //磁傖杅擂   
  321.         if(dis_data<0){
  322.         dis_data=-dis_data;
  323.     DisplayOneChar(10,1,'-');       //珆尨蛹睫瘍弇
  324.         }
  325.         else DisplayOneChar(10,1,' ');  //珆尨諾跡

  326.     temp=(float)dis_data*3.9;  //數呾杅擂睿珆尨,脤蕉ADXL345辦厒藷菴4珜
  327.     conversion(temp);          //蛌遙堤珆尨剒猁腔杅擂
  328.         DisplayOneChar(10,0,'Z');  //菴0俴ㄛ菴10蹈 珆尨Z
  329.     DisplayOneChar(11,0,':');
  330.     DisplayOneChar(11,1,qian);
  331.         DisplayOneChar(12,1,'.');
  332.     DisplayOneChar(13,1,bai);
  333.     DisplayOneChar(14,1,shi);
  334.         DisplayOneChar(15,1,'g');  
  335. }


  336. //*********************************************************
  337. //******翋最唗********
  338. //*********************************************************
  339. void main()
  340. {
  341.   uchar devid;
  342.   delay(500);                           //奻萇晊奀               
  343.   InitLcd();                      //珘儒場宎趙ADXL345
  344.   Init_ADXL345();                 //場宎趙ADXL345
  345.   devid=Single_Read_ADXL345(0X00);//黍堤腔杅擂峈0XE5,桶尨淏
  346.   while(1)                         //悜遠
  347.   {
  348.     Multiple_Read_ADXL345();       //蟀哿黍堤杅擂ㄛ湔揣婓BUF笢
  349.     display_x();                   //---------珆尨X粣
  350.     display_y();                   //---------珆尨Y粣
  351.     display_z();                   //---------珆尨Z粣
  352.     delay(200);                    //晊奀            
  353.   }
  354. }
复制代码




Adafruit_ADXL345-master.zip

11.46 KB, 下载次数: 7, 下载积分: 黑币 -5

ADXL345_AVR.zip

53.92 KB, 下载次数: 7, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:398299 发表于 2018-9-29 15:17 | 只看该作者
怎么很多的乱码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表