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

yxyvkwin  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(135)

我需要检测用户将设备放在table/地板上时的加速度计事件。
器件具有8 MHz的STM32低功耗微控制器和LIS 3DH加速度计。
加速度计在+- 2G范围内工作。样本数是有符号的16位整数。
我已经收集了加速度计数据,为这样的事件,从50赫兹的加速度计阅读。我已经附上了x,y和z样本的图表。“命中”事件在图中清晰可见,时间轴上的红点显示事件发生时的点。但是我不知道如何在代码中检测这样的事件。
3个轴的DC偏移根据器械方向而变化。
x1c 0d1x的数据
再次,以100 Hz采样,该图仅针对X轴并且示出了2个命中事件。这样的尖峰将在所有3个轴上同时发生,但是幅度和方向可以变化。与其他图形相比,时间尺度被放大。在实际应用程序代码中,不可能以100 Hz采样。


设备方向变化和用户手中的移动导致大量信号变化。下面是具有手移动、方向改变和命中事件的Y轴的图。这种变化将发生在所有轴上。


3hvapo4f

3hvapo4f1#

正如Martin James所建议的那样,您应该测量当前和最后一次滴答之间的加速度差异。您需要在每个轴上执行此操作,因为从您的数据来看,某些命中不会影响每个轴。有人可能会认为,你可以通过平方和来计算总加速度,但我认为这行不通。
要测量差异,您需要将最后一次阅读保存在变量中。您可能需要前两个读数,这取决于采样速率有多快;如果速率太高,则差异可能总是很小。您还应该记录自上次命中以来的滴答计数。
然后,在获取当前阅读时,将当前读数与先前读数进行比较。如果差异在任何轴上高于阈值,则将其标记为命中并重置time_since_hit_count --除非最近发生了命中。您希望避免多次计算同一次撞击,因为在单次撞击期间加速度会发生变化。你的数据显示阈值在5000左右。
如果任何轴上的差值均未超过阈值,则递增time_since_hit_count并将存储的读数替换为当前读数。
(If您正在存储前两个命中,与每个命中进行比较,并适当地移动存储的值。)
从你的数据来看,一些点击需要3个滴答发生,所以如果time_since_hit_count小于5,你可以打折点击。也就是每次点击100毫秒。根据应用程序,这可能是好的。鼓槌弹起来可能比这还快,但手指可能不会。
在收集数据时,您可能必须对访问阈值和点击计数阈值进行试验。

58wvjzkj

58wvjzkj2#

您还可以评估嵌入式传感器的功能:

示例来自STMicroelectronics sensors github repository,嵌入式功能在器件数据手册和应用笔记AN3308中进行了描述。

相关问题