一、本例程实现功能

通过ADXL345三轴加速度传感器模块测量传感器自身在自然界中X、Y、Z三个轴向的加速度,开发者可以利用这三个加速度值计算传感器自身相对于自然界中各个轴向的倾斜角。

二、基本概念

通过调用Core提供的库函数可以获得以传感器自身为坐标中心的XYZ三轴加速度,单位为mg(1g=1000mg,1g= 9.80665 m/s2),测量范围为-16000mg~16000mg。

ADXL345传感器芯片的三轴加速度测量轴向定义如下图:
在这里插入图片描述
下图举例了ADXL345传感器以各种不同方式静置时传感器的理想输出值(实际中由于器件偏差,尤其是Z轴很难保证输出纯正的±1g):
在这里插入图片描述

三、 传感器参数配置描述

通过调用Core提供的库函数会自动将ADXL345传感器的ODR(输出频率)设置为100Hz,即您可以在1秒内从传感器最多读取100组三轴数据。建议每次读取的时间间隔不要小于10毫秒,可以根据您的应用需求适当延长这个间隔。

另外,三轴的每个轴测量范围均固定为-16000mg~16000mg。

四、接线图

在这里插入图片描述

六、完整代码

--配置USB以虚拟串口模式工作,这样调用print()函数就会在电脑串口终端打印输出
LIB_UsbConfig("CDC")
--配置ADXL345开始工作,占用IIc0接口,三轴加速度测量结果输出频率默认100Hz,测量范围默认+-16000mg
LIB_ADXL345Config("IIC0")
--开始大循环
while(GC(1) == true)
do
    --每隔200ms查询一次传感器是否出数。注意:最低可以每隔10ms查询一次
    LIB_DelayMs(200)
    flag, acc_x, acc_y, acc_z = LIB_ADXL345GetAccXYZ()
    if flag == 1 then
        --打印三轴加速度,单位mg
        print(string.format("acc_x:%dmg,acc_y:%dmg,acc_z:%dmg",acc_x,acc_y,acc_z))
    end
end

七、代码运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过上面几种测试情况可以发现ADXL345这颗传感器在Z轴的上的数据表现不是很好,不管以什么方向摆放都会出现100~200mg的固定偏差。事实上网上已有大量的工程师遇到相同问题,但是不管是在各种论坛还是芯片原厂的论坛上都没有相应的解释及解决方案。所以我们也不要完全迷信芯片厂家的产品就%100的OK,再大的半导体厂家研发人员水平也是参差不齐的,开发出的产品也是需要经历一代一代的小白鼠用户的打磨才能逐渐完善的,尤其是传感器类的产品,开发者一定不要指望厂家能够完全保证出厂产品的一致性和准确性。所以需要我们在开发的过程中躲开它的一些不足之处,只要能解决我们的需求即可,比如我们可以用如下方式来解决:

(1)校准:在传感器放在水平面静置时,采集一定数量的值,求平均后作为校准偏移量保存起来,之后可以 在每次的结果中减去这个偏移量。

(2)既然Z轴的偏移太大,我们就只用它的相对变化量,事实上很多运动算法更多关注的只是加速度的相对 变化量,而初始偏移值的大小对算法的结果影响也不是太大(比如振动的判断)。

八、测量倾斜角

方法1:
该方法计算方式比较简单,适合于判断静态情况下(传感器只受重力加速度g)传感器相对于实际空间中的X、Y、Z轴的角度
在这里插入图片描述
方法2:
如果您需要更高精度的倾斜角度计算,可以参考ADXL345官方提供的文档来计算倾斜角,这里面讲的会稍微复杂一些,里面会考虑到除重力之外的其他力对倾角计算的影响。

倾角计算时需要注意的问题
(1)ADXL345的Z轴在不受外力情况下并不是+g或-g,而是有一定的偏移,这个需要通过校准或者您在计算时 进行相应的考虑。其他轴虽然偏移不大,但是如果您对精度要求高的话也需要校准。

(2)尽量不要用Z轴来计算倾角,可以调整传感器的安装位置,通过X轴和Y轴来测量倾斜角会更可行一些。

九、ADXL345传感器的低功耗休眠及唤醒功能

如果您的项目中需要利用三轴传感器根据外部的受力情况来决定系统是休眠还是唤醒工作,可以参看ADXL345三轴传感器的休眠及唤醒功能这篇文章。

更多详情请参看 shineblink.com官网链接

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐