PSoC4 capsense button 用作开关按键,一次触摸,执行多次开关动作的疑问

公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Abel_W
Level 3
Level 3
Distributor - Intron(GC)
10 likes given 100 sign-ins 25 replies posted

Hi,friends

  关于 capsense 用作开关按键时,我有一个疑问,如下截图

wangjiazheng_0-1677118677467.png

在 capsense 扫面完成之后判断是否被触发。如果不将 capsense stop ,那么  if(CapSense_IsWidgetActive(CapSense_BUTTON0_WDGT_ID)),这个 if 判断会执行多次(在手指已经离开 button 的情况下,按照 delay 时间反转多次程序中 led_status 的值。原本想用做控制 led 开关的,实际现象是 led 按照 delay 的时间闪烁),只有先将 capsense 停止了才能正常的只执行一次 if 判断后的动作。

  请指正一下正确的写法,或者有没有相关的示例程序? 如果可以的话,还请解释一下这个 if 判断为什么会执行多次,如果 将 delay 时间改长一点,比如说 1000 ms,这个闪烁的现象会更加直观(在手指触摸离开之后,间隔1000ms 闪烁 三、四次左右)。如果是因为 capsense 外设扫描是独立于 CPU 之外的工作的,那么为什么 button 的触发已经停止了,程序执行这个 if 判断还是成立的呢?我是在 kit-149 上面尝试的。很多疑惑,请帮我解释一下,感谢。

 

0 点赞
1 解答
LinglingG_46
Moderator
Moderator
Moderator
500 solutions authored 1000 replies posted 10 questions asked

这个可能跟你tunning的参数有关系。你可以打开tuning看一下,或者测一下,我给你的代码现在有没有问题。

在原帖中查看解决方案

5 回复数
LinglingG_46
Moderator
Moderator
Moderator
500 solutions authored 1000 replies posted 10 questions asked

1:你代码设计的逻辑是,只要active,就会一直调用led_status=~led_status;一般情况下,你可以按照下面的代码逻辑测试,active的时候led 亮,inactive的时候led灭。
if(CapSense_NOT_BUSY == CapSense_IsBusy())
{
CapSense_ProcessAllWidgets(); /* Process all widgets */
if(CapSense_IsWidgetActive(CapSense_BUTTON0_WDGT_ID))
{
LED12_Write(0);
}
else
{
LED12_Write(1);
}
CapSense_RunTuner();
/* To sync with Tuner application */

#if (0u != CapSense_SELF_TEST_EN)
measure_cp(); /* Measure the sensor capacitance using BIST */
#endif
CapSense_ScanAllWidgets(); /* Start next scan */
}
}

2: 你的代码因为只是截取的一部分,我也不好分析。你可以用附件的代码在cy8ckit-149上面测试。

0 点赞
Abel_W
Level 3
Level 3
Distributor - Intron(GC)
10 likes given 100 sign-ins 25 replies posted

hello lingling,

代码很简单,就是示例的修改,如附件,我想实现的就是触摸一次 capsense 开关就改变一次 I/O 的状态,不是感知 capsense 的状态。你的这句话(你代码设计的逻辑是,只要active,就会一直调用led_status=~led_status;),你可以在 kit 上尝试一下,led 在触摸一次开关并且手指离开后,led 会闪几下(此时 capsense 应该是 inactive的呀),这是什么原因导致的,不能理解

0 点赞
LinglingG_46
Moderator
Moderator
Moderator
500 solutions authored 1000 replies posted 10 questions asked

1:我知道你想设计是你触摸一下亮,再触摸一次灭。但是你手按住的很短暂的时间,系统已经扫描了很多次了,你这些次当中就会一直在反转。所以示波器会看到pin脚一直在反转,这个是很正常的现象。

2:我在149的kit上面按照你的需求写了一段代码,手指按住一次亮,第二次就灭掉。

3:我接住两个变量来记录现在和之前的状态,你可以参考一下。

 

0 点赞
Abel_W
Level 3
Level 3
Distributor - Intron(GC)
10 likes given 100 sign-ins 25 replies posted

  非常感谢你的耐心回答,你的这个方法可以很好的实现这个功能,但还是有点疑问。当手触控的一瞬间会被扫描到很多次这个我可以理解,但是有delay的时候手离开了还是会反转 pin几次,不符合程序执行的顺序,难道是 capsense 的状态被记录了下来,按照先后顺序逐个给与 if(CapSense_IsWidgetActive(CapSense_BUTTON0_WDGT_ID))这句话做判断,而不是根据这个 if 判断之前的一次扫描的 capsense 状态

0 点赞
LinglingG_46
Moderator
Moderator
Moderator
500 solutions authored 1000 replies posted 10 questions asked

这个可能跟你tunning的参数有关系。你可以打开tuning看一下,或者测一下,我给你的代码现在有没有问题。