【uFun试用】测试Lis3dh陀螺仪 LIS3DH是ST公司生产的MEMS三轴加速度计芯片,实现运动传感的功能。主要特性有: 宽工作电压范围:1.71 ~ 3.6V 功耗:低功耗模式2μA;正常工作模式、ODR = 50Hz时功耗11μA(要求SDO/SA0脚浮空或上拉) 测量范围:+/-2g ~ +/-16g 接口:I2C、三线制/四线制SPI16 bit数据输出 两个可编程中断输出脚,用于自由落体和动作检测 6D/4D方向检测 内置AD支持3路外部信号输入 内置温度传感器内置32-slot的10-bit FIFO存储器
封装:3 x 3 x 1 mm LGA-16 引脚定义: VCC:电源 Vdd_IO:数字接口供电电源 GND:地 RES:连接到地 NC:不连接 CS:I2C接口选择(CS=1);或SPI接口片选脚(CS=0) SCL/SPC:I2C接口或SPI接口的时钟线 SDA/SDI/SDO:I2C接口或SPI接口数据线 SDO/SA0:I2C地址选择脚;或四线制SPI接口输出脚。浮空时为1。 INT1:中断信号输出,触发条件可中断 INT2:中断信号输出,触发调节可中断 ADC1、ADC2、ADC3:数模转换的模拟信号输入脚 简单的介绍之后开始查看数据手册进一步的了解陀螺仪,(帖子最后我会附lis3dh陀螺仪英文资料,无奈没找到中文资料),ST公司给了一份官方的驱动,所以只需要知道配置相关的寄存器,IIC和SPI协议读取数据这需要我们来写。开始配置初始化使能XYZ三轴,进而读取相关寄存器相关数据,读取16位数据以后进行数据是处理这样就可以得到XYZ三轴原始数据如下图1,其他两轴寄存器数据也是一样的。
图1
图1是X轴寄存器的数据格式,前5位是符号位所以在进行数据使用的时候需要判断正负号
- //三轴陀螺仪原始数据
- void LIS3DH_Get_AccRaw(int16_t* pdata)
- {
- uint8_t i = 0;
- uint8_t regValue[6] = {0, 0, 0, 0, 0, 0};//数据位存储
-
int16_t symbol[3] = {0,0,0};//符号位存储
//读取xyz三轴寄存器的数据并存到数组中
for(i=0;i<6;i++)
{
LIS3DH_ReadReg(LIS3DH_OUT_X_L + i, (regValue+i));
}
/* Format the data. */
//判断数据的正负号
for(i=0;i<3;i++)
{
//如果数据前面的符号正(正好用1标识)则数据是正否则则为负号(负号用0标识)
if(regValue[2*i+1] & 0x80)symbol[i] = 0xF000;
else symbol[i] = 0x0000;
}
//数据长度是16位,进行16位数据拼接
pdata[0] =symbol[0] | (( ( ( ( int16_t )regValue[1] ) << 8 ) + ( int16_t )regValue[0] ) >> 4);//X轴
pdata[1] =symbol[1] | (( ( ( ( int16_t )regValue[3] ) << 8 ) + ( int16_t )regValue[2] ) >> 4);//Y轴
pdata[2] =symbol[2] | (( ( ( ( int16_t )regValue[5] ) << 8 ) + ( int16_t )regValue[4] ) >> 4);//Z轴
}
复制代码
读取完XYZ三轴的原始数据(xyz三轴加速度)以后在计算的得出灵敏度,加速度 = 加速度轴原始数据/加速度灵敏度,读取0x23寄存器数据可得,加速度配置寄存器如下图2所示,
FSCALE2:0这三位设置陀螺仪满量程范围,000-2g,001-4g,010-6g,011-8g,100-16g这样就可以得到灵敏度,一般默认是2g传感器是16位数据,得到灵敏度是65536/4=16384LSB/g
- //灵敏度,加速度数据 = 加速度轴原始数据/加速度灵敏度
- void LIS3DH_Get_Sensitivity(uint8_t* sensitivity)
- {
-
uint8_t fullscale = 0;
//读取0x23寄存器数据得到低两位数据,灵敏度和设置的量程有关,但是只会相关的设置
LIS3DH_ReadReg(LIS3DH_CTRL_REG4,&fullscale); //使用IIC读取数据函数
- fullscale = (fullscale & 0x30) >> 4;
- switch (fullscale)
- {
- case 0:*sensitivity = 1;break;
- case 1:*sensitivity = 2;break;
- case 2:*sensitivity = 4;break;
- case 3:*sensitivity = 12;break;
- default : break;
- }
- }
复制代码
这样就可以某一轴加速度了
- AXIS_X = ( int32_t )( pdata[0] * sensitivity );//X轴加速度
复制代码
重力加速度
- acc_g = sqrt(pow(acc_x, 2) + pow(acc_y, 2) + pow(acc_z, 2));
复制代码
|