0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ADXL345数字加速度计的介绍

454398 来源:网络整理 作者:网络整理 2020-01-31 17:47 次阅读

概述

ADXL345数字加速度计的介绍

ADXL345是一款低功耗,三轴MEMS加速度计模块,具有I2C和SPI接口。这些模块的Adafruit Breakout板载板载3.3v电压调节和电平转换功能,使其易于与Arduino等5v微控制器接口。

ADXL345具有4个灵敏度范围,从+/- 2G到+/- 16G。它支持10Hz到3200Hz的输出数据速率。

工作原理

MEMS-微型机电系统传感器由硅晶片上的微机械结构组成。该结构由多晶硅弹簧悬挂,当在X,Y和/或Z轴上受到加速度时,它可以在任何方向上平滑偏转。挠曲会导致固定板和连接到悬挂结构的板之间的电容发生变化。每个轴上的电容变化都会转换为与该轴上的加速度成比例的输出电压。

组装和接线

该板随附所有预焊接的表面贴装组件。随附的接头板可以焊接,以便在面包板上或带有0.1英寸连接器的情况下方便使用。但是,对于承受极高加速度,冲击或振动的应用,建议使用锁定连接器或直接焊接。

组装:

放置标头:如有必要,将标头切成适当大小,然后插入标头-

添加分组讨论:对齐分组讨论板并将其放在面包板上的排针上。

然后焊接!请务必焊接所有引脚以确保良好的电气接触。

I2C接线: ADXL345分支的I2C地址为0x53。只要每个设备具有唯一的地址,它就可以与其他I2C设备共享I2C总线。 I2C通信仅需要4个连接:

GND-》 GND

VIN-》 + 5v

SDA-》 SDA(“经典Arduino”上的模拟4)

SCL-》 SCL(“经典Arduinos”上的模拟5)

Adafruit分支具有电平转换和调节电路因此您可以从3-5V供电,并为i2c使用3V或5V逻辑电平

编程和校准

下载并安装ADXL345库。如果尚未安装Adafruit Sensor库,您还将需要它。

本指南将帮助您完成安装过程。

测试:点击“文件-》示例-》 Adafruit_ADXL345-》 sensortest”以从库中加载示例草图。

然后单击编译/上传按钮进行编译并将草图上传到Arduino。您应该看到类似于以下的输出。观察移动木板时值的变化。

校准: ADXL芯片在出厂时已校准精度足以满足大多数用途。对于要求更高精确度的关键应用,您可能希望自己重新校准传感器。

校准不会改变传感器的输出。但是它告诉您在每个轴上的两个方向上,已知的稳定参考力所对应的传感器输出。知道这一点后,您可以根据传感器读数计算出校正后的输出。

重力作为校准参考加速度可以以重力或“ G”为单位进行测量,其中1G表示在地球表面的重力。重力是一个相对稳定的力,可以为地面住宅的接地提供方便和可靠的校准参考。

校准方法:要将传感器校准为重力参考,需要确定每个轴与重力拉力轴精确对齐时的传感器输出。实验室质量校准使用精密定位夹具。这里描述的方法很简单,仅用一块木头就能获得令人惊讶的良好结果。

安装传感器:首先将传感器牢固地安装到模块或盒子上。只要所有侧面成直角,大小都不重要。只要是相当坚硬的材料就不重要。

加载校准草图:加载并运行下面的校准草图。打开串行监视器,等待提示。

将模块定位:

将模块放置在坚固的平面上,例如坚固的桌子上。在串行监视器中键入一个字符,然后按回车键。草图将对该轴进行测量并打印结果。

重新放置块:旋转块,使桌子的另一侧平坦,然后键入另一个键来测量该轴。

重复: 对块的所有六个侧面重复以测量每个轴的正向和负向。

(提示:) 用于被分线板和/或电线遮挡的侧面,将方块按在桌子底部,同时

校准结果:一旦对所有六个面都进行了采样,串行监视器中打印的值将代表每个轴上+/- 1G力的实际测量值。这些值可用于重新缩放读数以提高准确性。

校准草图:

下载:文件

复制代码

#include

#include

#include

/* Assign a unique ID to this sensor at the same time */

Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);

float AccelMinX = 0;

float AccelMaxX = 0;

float AccelMinY = 0;

float AccelMaxY = 0;

float AccelMinZ = 0;

float AccelMaxZ = 0;

void setup(void)

{

Serial.begin(9600);

Serial.println(“ADXL345 Accelerometer Calibration”);

Serial.println(“”);

/* Initialise the sensor */

if(!accel.begin())

{

/* There was a problem detecting the ADXL345 。。. check your connections */

Serial.println(“Ooops, no ADXL345 detected 。。. Check your wiring!”);

while(1);

}

}

void loop(void)

{

Serial.println(“Type key when ready.。。”);

while (!Serial.available()){} // wait for a character

/* Get a new sensor event */

sensors_event_t accelEvent;

accel.getEvent(&accelEvent);

if (accelEvent.acceleration.x 《 AccelMinX) AccelMinX = accelEvent.acceleration.x;

if (accelEvent.acceleration.x 》 AccelMaxX) AccelMaxX = accelEvent.acceleration.x;

if (accelEvent.acceleration.y 《 AccelMinY) AccelMinY = accelEvent.acceleration.y;

if (accelEvent.acceleration.y 》 AccelMaxY) AccelMaxY = accelEvent.acceleration.y;

if (accelEvent.acceleration.z 《 AccelMinZ) AccelMinZ = accelEvent.acceleration.z;

if (accelEvent.acceleration.z 》 AccelMaxZ) AccelMaxZ = accelEvent.acceleration.z;

Serial.print(“Accel Minimums: ”); Serial.print(AccelMinX); Serial.print(“ ”);Serial.print(AccelMinY); Serial.print(“ ”); Serial.print(AccelMinZ); Serial.println();

Serial.print(“Accel Maximums: ”); Serial.print(AccelMaxX); Serial.print(“ ”);Serial.print(AccelMaxY); Serial.print(“ ”); Serial.print(AccelMaxZ); Serial.println();

while (Serial.available())

{

Serial.read(); // clear the input buffer

}

} #include

#include

#include

/* Assign a unique ID to this sensor at the same time */

Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);

float AccelMinX = 0;

float AccelMaxX = 0;

float AccelMinY = 0;

float AccelMaxY = 0;

float AccelMinZ = 0;

float AccelMaxZ = 0;

void setup(void)

{

Serial.begin(9600);

Serial.println(“ADXL345 Accelerometer Calibration”);

Serial.println(“”);

/* Initialise the sensor */

if(!accel.begin())

{

/* There was a problem detecting the ADXL345 。。. check your connections */

Serial.println(“Ooops, no ADXL345 detected 。。. Check your wiring!”);

while(1);

}

}

void loop(void)

{

Serial.println(“Type key when ready.。。”);

while (!Serial.available()){} // wait for a character

/* Get a new sensor event */

sensors_event_t accelEvent;

accel.getEvent(&accelEvent);

if (accelEvent.acceleration.x 《 AccelMinX) AccelMinX = accelEvent.acceleration.x;

if (accelEvent.acceleration.x 》 AccelMaxX) AccelMaxX = accelEvent.acceleration.x;

if (accelEvent.acceleration.y 《 AccelMinY) AccelMinY = accelEvent.acceleration.y;

if (accelEvent.acceleration.y 》 AccelMaxY) AccelMaxY = accelEvent.acceleration.y;

if (accelEvent.acceleration.z 《 AccelMinZ) AccelMinZ = accelEvent.acceleration.z;

if (accelEvent.acceleration.z 》 AccelMaxZ) AccelMaxZ = accelEvent.acceleration.z;

Serial.print(“Accel Minimums: ”); Serial.print(AccelMinX); Serial.print(“ ”);Serial.print(AccelMinY); Serial.print(“ ”); Serial.print(AccelMinZ); Serial.println();

Serial.print(“Accel Maximums: ”); Serial.print(AccelMaxX); Serial.print(“ ”);Serial.print(AccelMaxY); Serial.print(“ ”); Serial.print(AccelMaxZ); Serial.println();

while (Serial.available())

{

Serial.read(); // clear the input buffer

}

}

典型校准输出:

下载:文件

复制代码

ADXL345 Accelerometer Calibration

Type key when ready.。。

Accel Minimums: 0.00 0.00 0.00

Accel Maximums: 0.12 0.20 1.14

Type key when ready.。。

Accel Minimums: 0.00 0.00 0.00

Accel Maximums: 0.12 0.20 1.14

Type key when ready.。。

Accel Minimums: 0.00 0.00 0.00

Accel Maximums: 0.12 0.20 1.14

Type key when ready.。。

Accel Minimums: 0.00 0.00 0.00

Accel Maximums: 0.12 0.20 1.14

Type key when ready.。。

Accel Minimums: 0.00 0.00 -0.24

Accel Maximums: 0.12 1.37 1.14

Type key when ready.。。

Accel Minimums: 0.00 0.00 -0.24

Accel Maximums: 0.12 1.37 1.14

Type key when ready.。。

Accel Minimums: 0.00 -1.22 -0.27

Accel Maximums: 0.12 1.37 1.14

Type key when ready.。。

Accel Minimums: 0.00 -1.22 -0.27

Accel Maximums: 0.12 1.37 1.14

Type key when ready.。。

Accel Minimums: -1.18 -1.22 -0.27

Accel Maximums: 0.12 1.37 1.14

Type key when ready.。。

ADXL345 Accelerometer Calibration

Type key when ready.。。

Accel Minimums: 0.00 0.00 0.00

Accel Maximums: 0.12 0.20 1.14

Type key when ready.。。

Accel Minimums: 0.00 0.00 0.00

Accel Maximums: 0.12 0.20 1.14

Type key when ready.。。

Accel Minimums: 0.00 0.00 0.00

Accel Maximums: 0.12 0.20 1.14

Type key when ready.。。

Accel Minimums: 0.00 0.00 0.00

Accel Maximums: 0.12 0.20 1.14

Type key when ready.。。

Accel Minimums: 0.00 0.00 -0.24

Accel Maximums: 0.12 1.37 1.14

Type key when ready.。。

Accel Minimums: 0.00 0.00 -0.24

Accel Maximums: 0.12 1.37 1.14

Type key when ready.。。

Accel Minimums: 0.00 -1.22 -0.27

Accel Maximums: 0.12 1.37 1.14

Type key when ready.。。

Accel Minimums: 0.00 -1.22 -0.27

Accel Maximums: 0.12 1.37 1.14

Type key when ready.。。

Accel Minimums: -1.18 -1.22 -0.27

Accel Maximums: 0.12 1.37 1.14

Type key when ready.。。

校准草图的结果可用于进行两点校准,如下所述:两点校准

库参考

构造函数: Adafruit_ADXL345(int32_t sensorID = -1)

构造ADXL345设备驱动程序对象的实例。 “ sensorID”是设备标识符。每次调用getEvent()时,它将在sensor_event中返回它。 sensorID对驱动程序或设备的操作没有影响,但是在管理具有多个传感器的系统中的传感器事件时很有用。

Initialization() bool begin(void )

begin()函数初始化与设备的通信。如果成功连接到ADXL345,则返回值为‘true’。

传感器详细信息: void getSensor(sensor_t *);

getSensor()函数返回有关传感器的基本信息。有关sensor_t结构的详细信息,请参阅Adafruit Sensor Library的自述文件。

获取并设置操作范围: void setRange(range_t range)

setRange()函数设置传感器的工作范围。较高的值将具有较宽的测量范围。较低的值将具有更高的灵敏度。

有效范围常数为:

ADXL345_RANGE_16_G

ADXL345_RANGE_8_G

ADXL345_RANGE_4_G

ADXL345_RANGE_2_G (默认值)

range_t getRange(void);

getRange()函数返回由setRange()设置的当前工作范围

获取和设置数据速率: void setDataRate(dataRate_t dataRate);

setDataRate()函数设置传感器输出更新的速率。高于100 Hz的速率将显示增加的噪声。低于6.25 Hz的速率将对温度变化更加敏感。有关详细信息,请参见数据表。

有效数据速率常数为:

ADXL345_DATARATE_3200_HZ

ADXL345_DATARATE_1600_HZ

ADXL345_DATARATE_800_HZ

ADXL345_DATARATE_400_HZ

ADXL345_DATARATE_200_HZ

ADXL345_DATARATE_100_HZ

ADXL345_DATARATE_50_HZ

ADXL345_DATARATE_25_HZ

ADXL345_DATARATE_12_5_HZ

ADXL345_DATARATE_6_25HZ

ADXL345_DATARATE_3_13_HZ

ADXL345_DATARATE_1_56_HZ

ADXL345_DATARATE_0_78_HZ

ADXL345_DATARATE_0_39_HZ

ADXL345_DATARATE_0_20_HZ

ADXL345_DATARATE_0_10_HZ (默认值)

dataRate_t getDataRate(void);

getDataRate ()函数返回由setDataRate()设置的当前数据速率。

读取传感器事件: void getEvent(sensors_event_t *);

getEvent()函数以sensor_event的形式返回下一个可用的读数。 sensor_event包含传递给构造函数的sensor_id以及来自加速度计的X,Y和Z轴读数。有关sensor_events的更多信息,请参见Adafruit Sensor Library的自述文件。

Python和CircuitPython

很容易将ADXL343或ADXL345与Python和CircuitPython以及Adafruit CircuitPython ADXL34x模块结合使用。此模块使您可以轻松编写Python代码,以读取中断中的加速度,敲击,运动等信息。

您可以将此传感器与任何CircuitPython微控制器板或具有GPIO和Python的计算机配合使用,谢谢。到我们的CircuitPython-for-Python兼容性库Adafruit_Blinka。

ADXL343和ADXL345略有不同,但是芯片基本相同。此页面包括每个接线图的不同接线图。除了初始化适当的芯片外,两者的代码都相同!

CircuitPython微控制器接线

首先,完全按照上一页中的说明接线。以下是将ADXL343连接到Feather M0的示例:

将羽毛上的 SCL 连接到ADXL343

上的 SCL

将羽毛上的 SDA 连接到ADXL343上的 SDA

将羽毛上的 GND 连接到 ADXL343上的GND

将羽毛上的 3.3V 连接到ADXL343

上的 VIN div》

下面是将ADXL345连接到羽毛M0的示例:

上的 VIN

将羽毛上的 SCL 连接到 ADXL345上的SCL

Connect SDA 羽毛上的ong》到ADXL345中的 SDA

将羽毛上的 GND 连接到ADXL345上的 GND

将羽毛上的 3.3V 连接到ADXL345

Python计算机接线

您可以使用的数十款Linux计算机/主板,我们将显示Raspberry Pi的接线。对于其他平台,请访问Linux上的CircuitPython指南,以了解您的平台是否受支持。

下图显示了连接到ADXL343的Raspberry Pi:

Connect SCL 在ADXL343上将RPi链接到 SCL

在RXL上将RPi链接到 SDA

将Rpi上的 GND 连接到ADXL343上的 GND

将Rpi上的 3.3V 连接到 ADXL343上的VIN

下图显示了连接到ADXL345的Raspberry Pi:

连接 SCL 到ADXL345上的 SCL

将RPi上的 SDA 连接到 SDA 将RPi上的ADXL345

连接 GND 中的音频连接到ADXL345

Connect 3.3V 中的 GND 》在RPi上为 VIN 在ADXL345上

库安装

您需要在CircuitPython板上安装Adafruit CircuitPython ADXL34x库。

首先请确保您的电路板正在运行最新版本的Adafruit CircuitPython。

接下来,您需要安装必要的库以使用硬件-仔细按照以下步骤查找并安装这些库来自Adafruit的CircuitPython库捆绑包。我们的CircuitPython入门指南上有一个很棒的页面,说明如何安装库捆绑包。

对于诸如Trinket M0或Gemma M0的非表达板,您需要从捆绑包中手动安装必要的库:

adafruit_adxl34x.mpy

adafruit_bus_device

在继续之前,请确保您的板的lib文件夹或根文件系统已复制 adafruit_adxl34x.mpy 和 adafruit_bus_device 文件和文件夹。 p》

下一步连接到开发板的串行REPL,因此您在CircuitPython 》》》 提示符下。

ADXL34x库的Python安装

您需要安装 Adafruit_Blinka 库在Python中提供CircuitPython支持。这可能还需要在您的平台上启用I2C并验证您正在运行Python3。由于每个平台都有所不同,并且Linux经常更改,请访问Linux上的CircuitPython指南以准备好您的计算机!

完成后,从命令行运行以下命令:

sudo pip3 install adafruit-circuitpython-adxl34x

如果您的默认Python是版本3,则可能需要改为运行“ pip”。只要确保您不尝试在Python 2.x上使用CircuitPython,就不支持它!

CircuitPython和Python的用法

为演示突破的用法,我们将对其进行初始化,并从开发板的Python REPL中读取加速度以及更多信息。

运行以下代码以导入必要的模块并创建I2C对象:

下载:文件

复制代码

import time

import board

import busio

import adafruit_adxl34x

i2c = busio.I2C(board.SCL, board.SDA) import time

import board

import busio

import adafruit_adxl34x

i2c = busio.I2C(board.SCL, board.SDA)

如果您使用的是 ADXL343 ,运行以下命令以使用中断初始化I2C连接:

下载:文件

复制代码

accelerometer = adafruit_adxl34x.ADXL343(i2c) accelerometer = adafruit_adxl34x.ADXL343(i2c)

如果您使用的是 ADXL345 ,请运行以下使用中断初始化I2C连接:

下载:文件

复制代码

accelerometer = adafruit_adxl34x.ADXL345(i2c) accelerometer = adafruit_adxl34x.ADXL345(i2c)

现在,您可以使用以下任意一种方法从突破中读取值并启用突破功能:

加速-x,y和z轴上的加速度值

enable_motion_detection -启用运动检测。允许设置阈值。阈值默认为18。

enable_tap_detection -启用点击检测。允许单次或两次点击检测。

enable_freefall_detection -启用自由落体检测。允许设置阈值和时间。阈值默认为10,时间默认为25。

事件-用于在启用运动检测,敲击检测和自由落体检测时读取事件。需要指定要尝试读取的事件。

要打印加速度值:

下载:文件

复制代码

while True:

print(accelerometer.acceleration)

time.sleep(0.2) while True:

print(accelerometer.acceleration)

time.sleep(0.2)

这就是使用CircuitPython从ADXL343和ADXL345读取加速度值的全部内容!

完整示例代码

下载:Project Zip 或 adxl34x_simpletest.py | 在Github上查看

复制代码

import time

import board

import busio

import adafruit_adxl34x

i2c = busio.I2C(board.SCL, board.SDA)

# For ADXL343

accelerometer = adafruit_adxl34x.ADXL343(i2c)

# For ADXL345

# accelerometer = adafruit_adxl34x.ADXL345(i2c)

while True:

print(“%f %f %f” % accelerometer.acceleration)

time.sleep(0.2)

import time

import board

import busio

import adafruit_adxl34x

i2c = busio.I2C(board.SCL, board.SDA)

# For ADXL343

accelerometer = adafruit_adxl34x.ADXL343(i2c)

# For ADXL345

# accelerometer = adafruit_adxl34x.ADXL345(i2c)

while True:

print(“%f %f %f” % accelerometer.acceleration)

time.sleep(0.2)

运动,轻击和自由落落

有一些启用和使用运动,轻击和自由落落的示例在GitHub上:

在ADXL343和ADXL345上进行运动检测

在ADXL343和ADXL345上进行抽头检测

在ADXL343和ADXL345上进行自由落体检测

将任何文件另存为CircuitPython板上的 code.py ,或从Python运行在您的Linux计算机上进行REPL,以进行尝试。

下载

文件

ADXL345数据表

Adafruit Fritzing库中的Fritzing对象

GitHub上的EagleCAD PCB文件

示意图和构造打印

责任编辑:wv

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 加速度计
    +关注

    关注

    6

    文章

    699

    浏览量

    45890
  • ADXL345
    +关注

    关注

    13

    文章

    69

    浏览量

    33888
收藏 人收藏

    评论

    相关推荐

    ADXL355三轴加速度计手册

    电子发烧友网站提供《ADXL355三轴加速度计手册.zip》资料免费下载
    发表于 07-11 11:24 1次下载

    adxl345 klipper不识别

    ADXL345是一种MEMS加速度计,广泛应用于许多领域,如运动追踪、健康监测和自动导航等。然而,有时候我们可能会遇到ADXL345在klipper中不被识别的问题。本文将详细介绍这个
    的头像 发表于 01-07 15:47 939次阅读

    ADXL345和MPU6050的区别

    探讨。 设计差异: ADXL345是一款由ADI(Analog Devices Inc.)生产的数字式三轴加速度计,采用了MEMS(Microelectromechanical Systems)技术
    的头像 发表于 01-04 11:30 7544次阅读

    adxl345的fifo总共有32个字节,是三轴共享的吗?

    我刚用下adxl345三轴加速度计,有些问题想请教一下哦。adxl345的fifo总共有32个字节,是三轴共享的吗?在读取FIFO_STATUS寄存器时,获取的可用字节数是哪个轴的呢?急盼回复!
    发表于 01-03 08:14

    ADXL345的x轴测出的加速度是离心加速度吗?

    请问当ADXL345安放在一个旋转物体的圆周上,而且ADXL345的x轴指向旋转物体的圆心,ADXL345的x轴测出的加速度是离心加速度么?
    发表于 01-01 08:16

    adxl345的工作原理,输出的电压与加速度有什么关系?

    最近在用adxl345做一个周界安防系统,ADXL345测量围栏上的振动加速度,请问adxl345的输出电压与加速度具体是一个什么关系???
    发表于 12-29 07:53

    ADXL1001加速度计没有输出的原因?

    近期在使用ADXL1001加速度计时出现问题,具体表现为供电电压为5V时加速度计没有输出电压,所以我们无法判断是加速度计本身有问题,还是我们电路设计有问题,电路原理图如图所示,电源为1
    发表于 12-29 07:05

    ADXL354/355与ADXL345都可以测倾角吗?

    我想请问一下ADXL354/355与ADXL345都是三轴加速度计345可以测两个倾角,想请问一下354/355也可以测两个倾角吗?谢谢~~~
    发表于 12-29 06:55

    ADXL345上读到的加速度信号怎么转换成速度信号?

    ADXL345上读到的加速度信号(1g=9807mm/sec 2)通过一次积分运算可以得出速度信号(mm/s)吗?得出的速度信号精度怎么样?
    发表于 12-29 06:25

    两轴加速度计和三轴加速度计的使用区别?

    有个问题请教一下:在静态测量的情况下,两轴的加速度计在测得X、Y轴上的加速度后,是不是就可以根据这两个值和重力加速度g算出Z轴方向的加速度,这样的话XYZ三个方向的角度也可以推导出来。
    发表于 12-29 06:06

    请问ADXL345输出加速度的最小有效位数是?

    ADXL345加速度计采集的值分辨力是多少呢?最小有效位数
    发表于 12-28 08:15

    请问ADXL1004加速度计背面引脚的材料是什么?

    我想问下ADXL1004加速度计背面引脚的材料是什么?我想从背面引线出来,需要知道引脚的材料来确定引线的材料
    发表于 12-28 06:25

    ADXL345加速度值读取异常是什么原因造成的?

    采用STM32L051与ADXL345做SPI通讯,采用IO口模拟SPI时序,目前是读写ADXL345的寄存器的数值是正确的,但是读取数据寄存器的加速度值,数值异常,量程是4G,但是测出来的值远超量程,不知道什么原因造成的。
    发表于 12-27 08:28

    adxl356加速度计输出10g正常吗?

    adxl356加速度计输出10g,正常吗,分辨率80mv/g?
    发表于 12-27 06:50

    ADXL345加速度传感器低温下数据有误怎么解决?

    高低温测试,常温下都是正常的,一到低温数据就是错的。为了验证是芯片而不是PCB的问题,我们拿了一个低温下加速度数据正常的PCB和不正常的PCB上的ADXL345加速度计互换位置,此时两个板子的结果也互换了。说明是芯片本身的问题。
    发表于 12-27 06:34