ST意法半导体
直播中

李可熠

8年用户 145经验值
私信 关注
[问答]

LIS3DH输出意外数据

我正在尝试将加速度记录在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_DURAtiON: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;

}谢谢你的帮助。


回帖(4)

曾玲娟

2018-10-9 09:25:31
数据表中的灵敏度是正确的。
你是对的,传感器可以超过16克,但它在灵敏度方面不再是线性的。
关于中断,我认为你错过了触发中断的样本,并且你读了一个或多个1 / ODR周期的样本。


举报

李可熠

2018-10-9 09:35:35
谢谢你的回答。你证实了我的想法。它暂时会保持这样状态,如果需要,我将使用Stream to FIFO模式来解决阈值下的测量值问题。
为了知道16g以上传感器的灵敏度,你有任何图表可以分享吗?
举报

曾玲娟

2018-10-9 09:47:39
不幸的是,我没有关于16g以上灵敏度的任何图表,每个设备的行为可能不同。
请注意,ST不保证任何超过16g的性能。


举报

张秀兰

2018-10-9 10:01:32
我想问一下如何准确地获得触发中断的三个轴的加速度样本。有什么解决方案吗?


举报

更多回帖

发帖
×
20
完善资料,
赚取积分