【DigiKey“智造万物,快乐不停”创意大赛】3.设置ADXL372加速度传感器参数,升级...
[复制链接]
- 查找ADXL372手册找到相关设置寄存器
主要用到的设置寄存器
(1)寄存器 ADXL372_TIMING 0x3D
主要是设置ADXL372的数据输出频率,这个你设置的带宽越高,相应的频率就需要设置越大。
- 寄存器ADXL372_MEASURE 0x3E
主要用的带宽设置参数
- 寄存器ADXL372_POWER_CTL 0x3F
寄存器主要设置工作模式,连续输出数据。
- 程序测试
先是初始化ADXL372,进行寄存器配置,然后读出确认。
//初始化
uint8_t ADXL372_Init(void)
{
u8 ADXL372ID;
u8 i=0;
u8 ret=0;
int m1=0,m2,m3,m4,m5,m6,m7;
IIC_Init(); //初始化IIC总线
// for(i=0;i<20;i++)
// {
ADXL372ID = ADXL372_RD_Reg(ADXL372_DEVID);
printf("ADXL372ID:%x\r\n",ADXL372ID);
// }
//设置ADXL372的寄存器状态
ADXL372_WR_Reg(ADXL372_MEASURE,0X84); //测量控制寄存器 0 0 00 0 100 不进入睡眠状态,默认模式,不选择低噪声模式,输出3200hz带宽 0X04
ADXL372_WR_Reg(ADXL372_TIMING,0X60); //外部定时控制器 100 000 00 6400hz输出011 000 00
ADXL372_WR_Reg(ADXL372_POWER_CTL,0X0F); //功率控制寄存器 0 0 0 1 0 0 11 全带宽分析模式0X13
ADXL372_WR_Reg(ADXL372_FIFO_CTL,0X00);
ADXL372_WR_Reg(ADXL372_OFFSET_X,0x00);
ADXL372_WR_Reg(ADXL372_OFFSET_Y,0x00);
ADXL372_WR_Reg(ADXL372_OFFSET_Z,0x00);
ADXL372_WR_Reg(0x40, 0x01);//启动自检
do {
ret = ADXL372_RD_Reg(0x40);
}
while((ret&(3<<1)) != 0x06);
m1 = ADXL372_RD_Reg(ADXL372_MEASURE);
m2 = ADXL372_RD_Reg(ADXL372_TIMING);
m3 = ADXL372_RD_Reg(ADXL372_POWER_CTL);
m4 = ADXL372_RD_Reg(ADXL372_FIFO_CTL);
m5 = ADXL372_RD_Reg(ADXL372_OFFSET_X);
m6 = ADXL372_RD_Reg(ADXL372_OFFSET_Y);
m7 = ADXL372_RD_Reg(ADXL372_OFFSET_Z);
printf("%x %x %x %x %x %x %x\r\n",m1,m2,m3,m4,m5,m6,m7);
return 1;
}
检查寄出去读出来的值都是对的。
- X Y Z轴数据测试
这里很奇怪,板子是平放在桌面上,正常情况X轴输出的数据应该为0,Y轴输出的数据也应该为0,Z轴输出的数据应该是重力加速度,为1g,大概9.81m/s2。
从输出看Y轴和Z轴的MSB不应该是0xFF。
然后我试了一下各种寄存器设置,Y轴和Z轴的输出都不太对,去官网提了问题,看能不能解决。
总结
目前ADXL372数据读取有点小问题,解决中。然后又仔细去官网看了一下这个传感器的资料,这个传感器实际应用是在物流运输过程中或者运动员对抗,是针对冲击的检测和记录,不是我开始想的高精度的加速度传感器,±200g是为了检测冲击力的强度。实际传感器的精度125mg每刻度,量程太大导致精度不太OK。
后面就是通过FFT和一些滤波,加速度做积分得到速度值,看精度上能否满足振动状态监控的需求,目前看做冲击检测记录功能是OK的。
|