C STM32上的加速度计事件检测

C STM32上的加速度计事件检测,c,embedded,accelerometer,microcontroller,C,Embedded,Accelerometer,Microcontroller,我需要在用户触碰桌子/地板上的设备时检测加速计事件 该设备有一个8MHz的STM32低功耗微控制器和一个LIS3DH加速计 加速计在+-2G范围内工作。样本数是有符号的16位整数 我通过在50 Hz下读取加速计,收集了此类事件的加速计数据。我附上了x、y和z样本的图表。“命中”事件在图表中清晰可见,时间轴上的红点显示事件发生的时间点。但我不知道如何在代码中检测此类事件 根据设备的方向,3个轴的直流偏移量会发生变化 同样,在100 Hz下采样,该图仅针对X轴,显示2个命中事件。这些尖峰将同时发生

我需要在用户触碰桌子/地板上的设备时检测加速计事件

该设备有一个8MHz的STM32低功耗微控制器和一个LIS3DH加速计

加速计在+-2G范围内工作。样本数是有符号的16位整数

我通过在50 Hz下读取加速计,收集了此类事件的加速计数据。我附上了x、y和z样本的图表。“命中”事件在图表中清晰可见,时间轴上的红点显示事件发生的时间点。但我不知道如何在代码中检测此类事件

根据设备的方向,3个轴的直流偏移量会发生变化

同样,在100 Hz下采样,该图仅针对X轴,显示2个命中事件。这些尖峰将同时发生在所有3个轴上,但振幅和方向可能会有所不同。与其他图形相比,时间刻度被放大。在实际应用代码中,不可能以100 Hz的频率进行采样。

设备方向的变化和用户手中的移动会导致大量信号变化。下面是Y轴的图形,包括手部移动、方向变化和命中事件。这些变化将在所有轴上发生


正如Martin James所建议的,您应该测量当前刻度和最后一个刻度之间的加速度差异。您需要在每个轴上执行此操作,因为从您的数据来看,某些命中不会影响每个轴。有人可能会认为你可以用平方和来计算总加速度,但我认为这行不通

要测量差异,需要将最后一个读数保留在变量中。您可能需要前两个读数,具体取决于采样率的快慢;如果比率太高,那么差异可能总是很小。您还应该记录上次点击后的滴答声

然后,在读取当前读数时,将当前读数与之前的读数进行比较。如果差值高于任何轴上的阈值,则将其标记为命中并重置自命中以来的时间计数,除非最近发生了命中。您希望避免在一次碰撞中加速度发生变化时多次计算相同的碰撞次数。您的数据显示阈值约为5000

如果差值不超过任何轴上的阈值,则增加自_达到_计数后的时间_,并用当前读数替换存储的读数

(如果要存储前两次点击,请对每个点击进行比较,并适当移动存储的值。)

从你的数据来看,有些点击需要3个刻度,所以如果点击次数少于5次,你可以对点击进行折扣。每击100毫秒。根据应用程序的不同,这可能没问题。鼓棍的弹跳速度可能比这快,但手指可能不会


在收集数据时,您可能必须尝试acc阈值和命中计数阈值。

如果您在认为事件发生的地方绘制(不覆盖数据),这将非常有用。对于一个不经意的读者来说,这可能不太明显。请再次尝试区分它-取连续样本和图表之间的差异-当加速度快速变化时,你应该会看到跳动。我已经修改了图表,当“击中”时,这些时间点上有一个红点“事件发生时,在x、y、z采样值中可以看到突然的尖峰,这些尖峰的数量等于我记录的“命中”事件,它们之间的时间间隔也与“命中”事件之间的时间间隔相同。一些LIS加速计实际上内置了“命中”功能,每当检测到命中时都会发出I/O中断。可能值得一看。如果加速度超过所配置轴上的阈值,LIS3DH可以配置为在单击、双击或惯性唤醒检测时生成中断。