基于炬芯ATS3089X的ST LIS2DW12 三轴 MEMS 加速度传感器(G-Sensor)敲击按键功能实现

实现敲击功能,单击,双击,三击,分别打印相应Log

app gsensor status

app gsensor on

app gsensor off

跳线帽记得接上。

LIS2DW12 三轴 G-Sensor 敲击检测

已实现功能

板载 ST LIS2DW12 的单击、双击和三击检测已经接入 `bt_watch`。设备启动后,

传感器服务自动打开加速度采样,不需要额外执行 shell 命令。

串口或 USB CDC 日志示例:

```text

gsensor LIS2DW12 tap detector ready

gsensor TAP_SINGLE

gsensor TAP_DOUBLE

gsensor TAP_TRIPLE

```

日志分别表示单击、双击、三击。默认开启,也可以使用以下命令:

| 命令 | 作用 |

| --- | --- |

| `app gsensor status` | 查看敲击检测是否开启 |

| `app gsensor off` | 关闭敲击检测日志 |

| `app gsensor on` | 重新开启检测,清除未完成的手势 |

开关只控制本次运行的敲击检测,下次启动恢复默认开启。加速度采样仍由原有运动

算法管理;关闭敲击检测不会关闭计步、抬腕等算法使用的传感器。

板级连接和数据流程

当前 ATS3089P 板级配置已经存在,不需要新增设备树节点:

| 信号 | 引脚/配置 |

| --- | --- |

| I2C SCL | GPIO55,I2CMT1 |

| I2C SDA | GPIO56,I2CMT1 |

| INT1 | GPIO54 |

| 7 位 I2C 地址 | `0x19` |

| 加速度寄存器 | `0x28` 起始,6 字节 XYZ |

| 芯片 ID | `WHO_AM_I 0x0F = 0x44` |

工程原有的 `CONFIG_SENSOR_ACC_LIS2DW12=y` 和 `CONFIG_SENSOR_MANAGER=y` 已启用。

启动流程为:`sensor_service` 初始化自定义 LIS2DW12 HAL,Cywee 运动算法请求

加速度后,I2CMT1 以约 20 ms 周期读取三轴数据,`algo_port.c` 在送入运动算法

前把同一份数据交给敲击检测器。

检测规则

检测器先计算三轴加速度幅值平方,不限定在 X/Y/Z 某一个轴上敲击:

```text

amplitude² = ax² + ay² + az²

```

当前参数如下:

| 参数 | 值 | 说明 |

| --- | ---: | --- |

| 冲击阈值 | `20 m/s²` | 超过该值计为一次冲击峰值 |

| 释放阈值 | `13 m/s²` | 低于该值后才允许计下一次冲击 |

| 手势窗口 | `450 ms` | 第一次冲击起算,窗口内累计 1/2/3 次 |

| 最小间隔 | `70 ms` | 过滤同一次敲击产生的重复采样 |

单击和双击在窗口结束后输出;三击在第三次满足间隔要求的冲击样本处理时输出。

第二、第三击必须都位于第一击之后 450 ms 内,且相邻有效冲击至少间隔 70 ms。

恰好到达 450 ms 的冲击属于下一组。三击报告后仍保留去抖时间,过滤第三击的

反弹;连续高加速度在释放之前只计一次;时间戳回退的样本忽略。

当前采样率为 50 Hz,DMA 每 10 点、约 200 ms 提交一次。因此实际看到日志时,

还可能有约 0~200 ms 的批处理延迟,不能把串口日志到达时间当成敲击发生时间。

幅值包含重力,敲击方向、佩戴方式和外壳结构仍会影响触发,需实板调整阈值。

很短或很轻的冲击可能落在两个采样点之间而漏检;强烈摇晃也可能误触发。

当前只在系统唤醒时检测,不支持敲击唤醒深度休眠。休眠和恢复时会丢弃未完成的

手势,避免恢复后打印休眠前的单击或双击。调试时先按键唤醒、保持系统处于唤醒

状态再敲击。`tap detector ready` 表示检测模块完成初始化;仍需查看 HAL 的

LIS2DW12 探测/启用日志,确认 I2C 传感器工作正常。

代码入口

  • `framework/sensor/tap_gsensor.c`:状态机、阈值和日志输出。

  • `framework/sensor/tap_gsensor.h`:初始化和样本输入接口。

  • `framework/sensor/algo_port.c`:接收 `ID_ACC` 样本并调用检测器。

  • `framework/sensor/sensor_service.c`:传感器服务启动时初始化检测器。

  • `application/bt_watch/src/main/system_app_shell.c`:`app gsensor` 命令。

  • `zephyr/framework/sensor/sensor_hal/devices/sensor_acc_lis2dw12.c`:现有

LIS2DW12 HAL、I2CMT1 采样和 GPIO54 数据就绪链路。

调试方法

  1. 烧录本次固件并打开 USB CDC 日志。

  2. 查看 LIS2DW12 HAL 日志并执行 `app gsensor status`,确认传感器工作正常、

敲击检测为 `ON`。保持系统唤醒。

  1. 在板子或外壳的固定位置分别敲击一次、两次、三次。建议两次之间间隔

100~180 ms,三击总时间小于 450 ms,各组动作间隔至少 1 秒。观察

`TAP_SINGLE`、`TAP_DOUBLE`、`TAP_TRIPLE`。

  1. 若单击经常不触发,降低 `TAP_PEAK_SQ_MS2` 对应的 20 m/s²;若走动或

振动误触发,提高该阈值或降低释放阈值。修改后重新编译即可。

当前实现复用原有 20 ms 数据就绪和 DMA 通道,没有把硬件 TAP 中断额外路由到

GPIO54。这样不会干扰已有的加速度采样和运动算法;同时软件累计方式可以支持

LIS2DW12 硬件本身没有的三击动作。

编译和固件包

在仓库 `26A` 目录执行 `ninja -C application/bt_watch/outdir/ats3089p_dev_watch`

编译;随后在 `zephyr` 目录执行:

```powershell

python build.py -n -p -b ats3089p_dev_watch -a bt_watch

```

敲击功能版本的固件包位于:

```text

application/bt_watch/outdir/ats3089p_dev_watch/_firmware/

ats3089p_dev_watch_261013_gsensor_tap.fw

ats3089p_dev_watch_261013_gsensor_tap_debug.fw

```

使用原来的烧录工具烧录 `.fw` 即可。具体实板敲击灵敏度需按上述方法验证。

验证记录

ATS3089P `bt_watch` 完整编译及 `.fw` 打包已通过,19 项状态机测试全部通过。

在 `26A` 目录执行:

```powershell

python application/bt_watch/tests/gsensor_tap/run_tests.py

```

测试在 Cortex-M33 模拟器中运行本次固件 ELF 的真实检测代码,覆盖单/双/三击、

持续高电平、释放阈值、70/450 ms 边界、报告后反弹、时间戳回退、64 位时间戳、

开关和复位。日志输出和 Boot ROM `memset` 使用替身。测试验证软件逻辑,实际

传感器、敲击幅值和采样漏检仍需实板验证。

相关推荐
ccbw161 小时前
CH32L103低功耗RISC-V MCU的集成外设与选型参考
单片机·嵌入式硬件·risc-v·低功耗mcu·潜创微·青稞risc-v4c
吴佳浩 Alben1 小时前
一文讲透推理引擎性能指标:TTFT、TPOT、KV命中率、并发,到底对应 vLLM / SGLang 的哪个参数?
人工智能·python·语言模型·架构·ai编程·vllm·sglang
ting94520001 小时前
Kilo Code for JetBrains 深度技术剖析:原生开源编程智能体内部实现与工程实践
人工智能·架构·开源
武子康1 小时前
PUBACK 已到,灯还没亮:Agent 设备指令何时算完成?
人工智能·后端·agent
逐光者9331 小时前
电子设计——运算放大器(运放)基础
嵌入式硬件
陈嘿萌1 小时前
CVPR 2026 | 全新的五模态信息融合数据集,包括RGB、事件、热成像、4D 雷达与 LiDAR
人工智能·深度学习·计算机视觉·自动驾驶·学术研究与理论基础·点云雷达
guhunyihan1 小时前
开源无代码平台的技术逻辑,恐象 AI 的架构思路解析
大数据·人工智能·开源
HRTOS1 小时前
HRTOS 4.0 硬件实测:os_delay() 延迟测试与系统时间精度分析
单片机·嵌入式硬件·51单片机
Xuantong_901 小时前
从Qwen3.6到Qwen3.8-27B:开源本地模型的一次“工程级蜕变“
人工智能·ai·智能体