nomady 发表于 2011-12-16 09:58:09

关于adxl345的校准

刚刚开始接触传感器的使用。请问类似的各种传感器模块,每次上电后都要重新进行校准吗?那校准的流程是怎样的呢?

nomady 发表于 2011-12-16 18:28:42

本帖最后由 nomady 于 2011-12-16 18:32 编辑

adxl345已经研究过了,使用偏移寄存器来修正,发上来跟大家分享下。

首先,这个校准的过程是手动的(类似手机上的传感器校准),把模块水平放置(这个水平也只是个大概,如果要求高的话,还需要其他仪器辅助),那么x轴和y轴的度数应该为0g,获取此时的实际x轴和y轴的度数(假设是20和-17)

要注意此时传感器的量程和分辨率,假设此时adxl345是常规量程+-16g,分辨率13位,那么此时度数的系数应该是1g/256 *1000 = 3.9 mg/LSB,从数据手册上可以查到 偏移寄存器的比例因子是 15.6mg/LSB(固定的,与量程无关),那么需要设定的实际偏移值就是 20/4 = 5和-17/4 = 4(15.6/3.9约为4)

然后取两个值的补码,分别为0x05和0xFB,写入对应的偏移寄存器。

这样,每次从传感器读取的数值就自动加上了这个设置的偏移。z轴的偏移值检测方式一样,把z轴水平放置(处于0g场)

对应的参考代码如下:void setup(){   
    Wire.begin();
    setAccReg(Reg_PWR_CTL,8);
    setAccReg(Reg_OFSX,0x05);    //Reg_OFSX 0x1E
    setAccReg(Reg_OFSY,0xFB);    //Reg_OFSY 0x1F
    setAccReg(Reg_OFSZ,0x07);    //Reg_OFSY 0x20
}

void setAccReg(int reg,byte value){
    setReg(ADXAdress,reg,value);    //ADXAdress = 0xA7>>1
}

void setReg(int device,int reg,byte value){
    Wire.beginTransmission(device);
    Wire.write(reg);
    Wire.write(value);
    Wire.endTransmission();
}需要注意的是:
1、传感器掉电后,设置的偏移值就丢失了,需要在下次上电后重新设置(不过这个偏移值主要跟芯片所处的环境有关,理论上不会经常性的大变化)
2、对于偏移值的测量,可以采用多次测量求平均值的方法

弘毅 发表于 2011-12-16 13:47:59

{:soso_e103:} 只知道电子罗盘可以自己校准(自己还没成功,但是有高手会弄)。。。其他传感器。。。我还不会校准

风的孩子 发表于 2011-12-16 23:10:51

可以把校准的参数放到arduino 的EEPROM里面去。
然后每次上电重新调用就行。
由于我们是爱好者级别。
传感器一般情况下并不需要太多地去考虑校准的问题。
并且,现在有很多的传感器(往往是数字式的)它在出厂的时候已经校准好了。
而且输出的数值已经是被校准过了

ChocolateUni 发表于 2011-12-20 11:44:58

一般会做一个标准的工装,这个工装代表着精度符合你要求的东西,然后通过这个工装去校准传感器。

leicheng 发表于 2014-1-20 11:13:26

我的ADXL345量程设置的是+-2g, 实验测出的X、Y轴读数是负200左右,Z轴是511。这个偏离值也太大了点,不知道问题出在哪里~

沧海笑1122 发表于 2014-6-20 10:32:52

nomady 发表于 2011-12-16 18:28 static/image/common/back.gif
adxl345已经研究过了,使用偏移寄存器来修正,发上来跟大家分享下。

首先,这个校准的过程是手动的(类似 ...

校准是必要的,我的Esplora手柄中的三轴重力加速度,X,Y轴就存在较大的偏移。在控制小车时,只好抬高门槛,造成控制盲区比较大。

前一段时间做电子秤,有一个去皮的功能,就相当于把不同容器皮重的偏移一键去除。如果可以在程序中,可以根据不同环境下的X,Y,Z轴误差直接计算补码设置偏移量。应该是可以实现开机时,把传感器水平静置,然后通过一个按钮切换到校准程序。

v60i 发表于 2017-9-3 19:14:16

本帖最后由 v60i 于 2017-9-3 19:15 编辑

nomady 发表于 2011-12-16 18:28
adxl345已经研究过了,使用偏移寄存器来修正,发上来跟大家分享下。

首先,这个校准的过程是手动的(类 ...

请问大大Reg_PWR_CTL 是怎么宣告的?

a461624201 发表于 2018-1-26 11:11:56

-4补码算错了,取反加1.

a461624201 发表于 2018-1-26 20:34:06

本帖最后由 a461624201 于 2018-1-26 21:44 编辑

这个是树莓派python I2C 13位,全分辨模式,+-16G范围,x,y输入偏置后,xy轴重力大致正常,但Z轴在芯片朝向上,输出始终为6.34g,调整Z轴偏置 数值,不管怎么调整,只能,芯片面上+4g,下+2g为最小,因为偏置是8位,对5.3g的偏置数值339没法配置,后来直接对z轴的重力结果做-3计算,心里估计这样芯片面上+1g,下-1g,结果似乎各轴重力和倾角开始正常了,图片为芯片有点面向上,即y轴向上,y轴重力为1.116, y轴对z的角度x_roll为72.5度左右(没有严格测量,这个方向只是大概),就是不知道这样直接对z轴重力做减3的做法对不对?
页: [1]
查看完整版本: 关于adxl345的校准