我正在尝试将加速度记录在2g以上。为此,我将LIS3DH参数化如下:
- CTRL_REG0:0x10
- CTRL_REG1:0x57(100Hz + Xen + Yen + Zen) - CTRL_REG2:0x00
- CTRL_REG3:0x40(INT1上的IA1)
- CTRL_REG4:0xB0(BDU + FS +/- 16g)
- CTRL_REG5:0x08(INT1锁存) - CTRL_REG6:0x00
- FIFO_CTRL_REG:0x00
- INT1_THS:0x0A(+/- 16g => 186 mg / LSb,2000/186 = 0x0A)
- INT1_DURA
tiON:0x00(加速度超过阈值时触发INT1)
- INT1_CFG:0x2A(或组合+ Z高事件+ Y高事件+ X高事件)
一切正常,我得到中断信号,读取相应缓冲区内可用的加速度,清除中断。然而,我不明白我得到的一些结果。
第一个问题,我不明白如何获得+/- 16g的灵敏度。对于其他满量程模式,有一个逻辑(正常模式:8g /(2 ^ 9)= 15,625~16 mg / LSb)但我找不到16g的逻辑。
假设数据表中给出的灵敏度是正确的,那么传感器返回的最大值必须是16000/48 = 333。或者传感器可以超过此限制,但测量值在灵敏度方面不再是线性的?因为传感器返回的几个值为-24480毫克。
第二个问题是我从高于我的阈值的信号中获得中断。例如,即使我设定的阈值是1860毫克,我也会得到Z = -1776毫克的中断。我相信我正在正确地从传感器转换数据,但我会描述我做的,只是为了sur:
INT16 LIS3DH_DataConverter(BYTE LSB_Data,BYTE MSB_Data,INT16灵敏度)
{//此函数转换2的补码10位数据左对齐(分为两个8位变量)
//进入16位右对齐的单个带符号变量(类型INT16)
UINT16 u16值;
INT16 ConvValue;
u16Value = LSB_Data +(MSB_Data<< 8);
RETAILMSG(ACC_TRACE,(_ T('u16Value = LSB_Data +(MSB_Data<< 8):%4.4Xh r n'),u16Value));
u16Value>> = 6; //只有10个高位是相关的(警告!仅在设备处于正常模式时才有效)
RETAILMSG(ACC_TRACE,(_ T('u16Value>> = 6:%4.4Xh r n'),u16Value));
//这个值已经定义了
//如果Bit10为1,则a(mg)= - (2的AccData补码)*分辨率
//如果Bit10为0,则a(mg)= AccData *分辨率
if(u16Value& 0x0200)
{
u16Value = ~u16Value; // 1的补充
RETAILMSG(ACC_TRACE,(_ T('u16Value inverted:%d r n'),u16Value));
u16Value& = 0x03FF; //只有10位是相关的
//(或0x 3 3FF)因为位10是0,因为它是负数的反转。
RETAILMSG(ACC_TRACE,(_ T('u16Value troncated:%d r n'),u16Value));
u16Value ++; // 2的补充
RETAILMSG(ACC_TRACE,(_ T('u16Value + 1:%d r n'),u16Value));
ConvValue = - (u16Value * Sensitivity); // TODO:通过分辨率乘以u16Value
u16Value =(UINT16)( - ConvValue); //仅供显示
RETAILMSG(ACC_TRACE,(_ T('负a = - %d mg(%2.2X%2.2Xh)! r n'),u16值,LSB_Data,MSB_Data));
}
其他
{
ConvValue = u16Value *灵敏度; //
u16Value =(UINT16)ConvValue; //仅供显示
RETAILMSG(ACC_TRACE,(_ T('正a =%d mg(%2.2X%2.2Xh)! r n'),u16值,LSB_Data,MSB_Data));
} return ConvValue;
}谢谢你的帮助。