风筝
发表于: 2023-2-23 17:24:03 | 显示全部楼层

你有没有想过智能手机是如何知道哪个方向是上? 它是当今智能手机最具创新性的功能之一。 它们都有一个微型设备,称为加速度计,内置于电路中,可检测您何时将设备左右倾斜。 这就是您的智能手机知道何时从纵向模式切换到横向模式的方式。


加速度计广泛用于低功耗、低成本的运动和倾斜传感应用,例如移动设备、游戏系统、磁盘驱动器保护、图像稳定以及运动和健康设备。


让我们回顾一下它们是什么、它们做什么以及它们如何工作。


加速度计如何工作?

要了解加速度计的工作原理,请想象一个位于3D立方体中的小球。


假设立方体在外太空,那里的一切都是失重的,球会简单地漂浮在立方体的中心。


现在,假设每面墙代表一个特定的轴。


如果我们突然以1g的加速度向左移动盒子(单个G力1g相当于重力加速度9.8m/s2),球无疑会撞到墙壁X。如果我们测量球对墙壁X施加的力 ,我们可以获得沿X轴的1g的输出值。


让我们看看当把这个立方体放在地球上时会发生什么。 球将简单地落在墙Z上,施加1g的力,如下图所示:


在这种情况下,盒子没有移动,但我们仍然在Z轴上得到1g的读数。 这是因为重力(实际上是加速度的一种形式)以1g的力向下拉球。


虽然此模型并不完全代表真实世界的加速度计传感器是如何构建的,但它通常有助于理解为什么加速度计的输出信号通常以±g为单位指定,或者为什么加速度计在静止时在z轴上读数为1g,或者您可以在不同方向上获得什么样的加速度计读数。


在现实世界中,加速度计基于微机电系统(MEMS 制造技术)。 那么,让我们了解MEMS加速度计的工作原理。


MEMS加速度计如何工作?

MEMS(Micro-Electro-Mechanical System,微机电系统)加速度计是一种建立在硅晶片顶部的微机械结构。


该结构由多晶硅弹簧悬挂。 它允许结构在沿 X、Y 和/或 Z 轴加速时偏转。


由于偏转,固定板和连接到悬挂结构的板之间的电容发生变化。 这种电容变化与沿该轴的加速度成正比。传感器处理这种电容变化并将其转换为模拟输出电压。


ADXL335模块硬件概述

该模块的核心是一个Analog Devices公司的小型、低功耗、低噪声三轴MEMS加速度计 – ADXL335。 它不仅可以测量由重力引起的静态加速度,还可以测量由运动、冲击或振动引起的动态加速度。

ADXL335-Accelerometer-Module-Hardware-Overview.jpg


这个适用于面包板的模块将ADXL335的每个引脚都分解成一个6引脚、0.1英寸间距的排针,包括3个用于X、Y和Z轴测量的模拟输出、2个电源引脚和一个自测引脚。


电源

ADXL335的工作电压为1.8V至3.6V(通常为3.3V)。 然而,板载3.3V稳压器使其成为与Arduino等5V微控制器连接的理想选择。


该传感器在正常工作期间仅消耗350μA的电流。


测量范围

ADXL335具有±3g的完整感应范围。 这意味着ADXL335可以准确测量并表示为输出的最大加速度为±3g。 例如,如果以4g加速,加速度计不会损坏,但输出可能会下降。


ADXL335的绝对最大加速度为10,000g。 当加速度超过10,000g时,ADXL335可能会失效。


比例输出

ADXL335输出是比例输出,因此输出电压在整个范围内随加速度线性增加。 这意味着0g测量输出始终为3.3V 电源电压 (1.65V) 的一半,-3g 为 0v,+3g 为3.3V,两者之间为全刻度。


ADXL335加速度计模块的引脚排列

在我们介绍连接和示例代码之前,先看一下它的引脚排列。

ADXL335-Accelerometer-Module-Pinout.png


VCC 为模块供电。 将它连接到Arduino的5V输出。

X-Out 输出与X轴加速度成正比的模拟电压。

Y-Out 输出与Y轴加速度成正比的模拟电压。

Z-Out 输出与Z轴加速度成正比的模拟电压。

GND 是地脚。

ST(自检)引脚控制自检功能,允许您在最终应用中测试传感器的功能。


将ADXL335加速度计连接到Arduino开发板

现在我们知道了ADXL335加速度计的工作原理,我们可以继续将它连接到Arduino开发板。


连接非常简单。首先将加速度计安装在面包板上。将VCC引脚连接到Arduino的5V引脚,将GND引脚连接到Arduino的接地引脚。 将X、Y和Z输出连接到Arduino的模拟引脚A0、A1和A2。


为了获得准确的结果,我们需要更改Arduino上的模拟参考 (AREF) 电压。将Arduino的3.3V引脚连接到AREF引脚来实现的。下图显示了接线。

Wiring-ADXL335-Accelerometer-Module-to-Arduino-UNO.png

跳转到指定楼层
风筝
发表于: 2023-2-23 17:58:48 | 显示全部楼层

Arduino示例代码 - 读取ADXL335加速度计数据

代码很简单。只实现在串口上显示每个轴校准后的传感器输出。在我们详解之前先试试草图。

  1. const int xInput = A0;
  2. const int yInput = A1;
  3. const int zInput = A2;

  4. // initialize minimum and maximum Raw Ranges for each axis
  5. int RawMin = 0;
  6. int RawMax = 1023;

  7. // Take multiple samples to reduce noise
  8. const int sampleSize = 10;

  9. void setup()
  10. {
  11.         analogReference(EXTERNAL);
  12.         Serial.begin(9600);
  13. }

  14. void loop()
  15. {
  16.         //Read raw values
  17.         int xRaw = ReadAxis(xInput);
  18.         int yRaw = ReadAxis(yInput);
  19.         int zRaw = ReadAxis(zInput);

  20.         // Convert raw values to 'milli-Gs"
  21.         long xScaled = map(xRaw, RawMin, RawMax, -3000, 3000);
  22.         long yScaled = map(yRaw, RawMin, RawMax, -3000, 3000);
  23.         long zScaled = map(zRaw, RawMin, RawMax, -3000, 3000);

  24.         // re-scale to fractional Gs
  25.         float xAccel = xScaled / 1000.0;
  26.         float yAccel = yScaled / 1000.0;
  27.         float zAccel = zScaled / 1000.0;

  28.         Serial.print("X, Y, Z  :: ");
  29.         Serial.print(xRaw);
  30.         Serial.print(", ");
  31.         Serial.print(yRaw);
  32.         Serial.print(", ");
  33.         Serial.print(zRaw);
  34.         Serial.print(" :: ");
  35.         Serial.print(xAccel,0);
  36.         Serial.print("G, ");
  37.         Serial.print(yAccel,0);
  38.         Serial.print("G, ");
  39.         Serial.print(zAccel,0);
  40.         Serial.println("G");

  41.         delay(200);
  42. }

  43. // Take samples and return the average
  44. int ReadAxis(int axisPin)
  45. {
  46.         long reading = 0;
  47.         analogRead(axisPin);
  48.         delay(1);
  49.         for (int i = 0; i < sampleSize; i++)
  50.         {
  51.         reading += analogRead(axisPin);
  52.         }
  53.         return reading/sampleSize;
  54. }
复制代码

下图显示了不同方向的加速度计读数。

ADXL335-Accelerometer-Output-on-X-axis.png


ADXL335-Accelerometer-Output-on-Y-axis.png


ADXL335-Accelerometer-Output-on-Z-axis.png


代码说明

首先声明Arduino的模拟输入引脚,传感器的X、Y和Z输出引脚连接到这些引脚。

  1. const int xInput = A0;
  2. const int yInput = A1;
  3. const int zInput = A2;
复制代码

接下来,定义两个变量RawMinRawMax。因为Arduino有一个10位ADC(2^10 = 1024),它将ADXL335的输出电压(范围从0到3.3V)映射到0到1023之间的整数值。这就是为什么RawMin设置为0和RawMax设置为1023。

  1. // initialize minimum and maximum Raw Ranges for each axis
  2. int RawMin = 0;
  3. int RawMax = 1023;
复制代码

sampleSize 变量指定每次转换期间Arduino应采集的样本数。在例子中,我们将sampleSize设置为10以获得更准确的结果。

  1. // Take multiple samples to reduce noise
  2. const int sampleSize = 10;
复制代码

在setup()函数中,我们首先通过调用 analogReference(EXTERNAL) 将模拟参考设置为EXTERNAL。 然后我们启动与PC的串行通信。

  1. analogReference(EXTERNAL);
  2. Serial.begin(9600);
复制代码

在loop()函数中,我们每200毫秒从传感器读取一次模拟输出。 请注意,我们调用ReadAxis()自定义函数而不是analogRead()函数。 此函数仅获取十个ADC转换样本并返回平均值。

  1. //Read raw values
  2. int xRaw = ReadAxis(xInput);
  3. int yRaw = ReadAxis(yInput);
  4. int zRaw = ReadAxis(zInput);
复制代码

将ADXL335输出转换为加速度 (g)

下面的代码片段是程序中最重要的部分。 它将传感器的模拟输出电压映射并转换为重力加速度 (G)。


映射由IDE的内置map()函数处理。 当我们调用map(xRaw, RawMin, RawMax, -3000, 3000) 时,RawMin的值映射到-3000,RawMax的值映射到3000,中间值映射到中间值。


数字-3000 和3000不是随机的。 它们实际上表示传感器测量的重力加速度,单位为毫g,即±3g。


例如:

●    如果传感器在x轴上输出0V,即 xRaw=0,则 map() 函数将返回 -3000,对应于-3g。

●    如果传感器在x轴上输出1.65V,即 xRaw=511,则 map() 函数将返回 0,对应于 0g。

●    如果传感器在x轴上输出3.3V,即 xRaw=1023,则 map() 函数将返回 3000,对应于 +3g。

由于输出电压在整个范围内随加速度线性增加,因此术语Ratiometric更有意义。

  1. // Convert raw values to 'milli-Gs"
  2. long xScaled = map(xRaw, RawMin, RawMax, -3000, 3000);
  3. long yScaled = map(yRaw, RawMin, RawMax, -3000, 3000);
  4. long zScaled = map(zRaw, RawMin, RawMax, -3000, 3000);
复制代码

最后,通过将传感器的输出除以1000 将其缩小为小数Gs,并显示在串口监视器上。

  1. // re-scale to fractional Gs
  2. float xAccel = xScaled / 1000.0;
  3. float yAccel = yScaled / 1000.0;
  4. float zAccel = zScaled / 1000.0;

  5. Serial.print("X, Y, Z  :: ");
  6. Serial.print(xRaw);
  7. Serial.print(", ");
  8. Serial.print(yRaw);
  9. Serial.print(", ");
  10. Serial.print(zRaw);
  11. Serial.print(" :: ");
  12. Serial.print(xAccel,0);
  13. Serial.print("G, ");
  14. Serial.print(yAccel,0);
  15. Serial.print("G, ");
  16. Serial.print(zAccel,0);
  17. Serial.println("G");
复制代码

ADXL335自检功能

ADXL335加速度计具有自测功能,可让您在最终应用中测试传感器的功能。 模块上的ST(自检)引脚控制此功能。

ADXL335-Module-SelfTest-Pin.jpg


当ST引脚连接到3.3V时,内部会在加速度计施加静电力。 由此产生的光束移动允许用户确定加速度计是否正常工作。


输出的期望变化值是

●    X 轴上 −1.08 g (−325 mV)

●    Y 轴上 +1.08 g (+325 mV)

●    Z 轴上 +1.83 g (+550 mV)

在正常操作期间,ST引脚可以保持开路或连接到GND。

回复

使用道具 举报

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

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-21 23:47 , Processed in 0.072642 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

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