本帖最后由 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、对于偏移值的测量,可以采用多次测量求平均值的方法 |