cancel
Showing results for 
Search instead for 
Did you mean: 

PSoC 4

user_4363331
New Contributor

capsense在deepsleep时定时300ms唤醒扫描,发现并没有在每次唤醒都能检测到触摸,一般都要接近1S左右才有反应,是我哪里没处理好吗?希望有做过类似的capsense低功耗处理朋友能帮忙看下哪里出现了问题,非常感谢!

0 Likes
1 Solution
LinglingG_46
Moderator
Moderator

看了一下你的代码,在处理低功耗一块的逻辑需要重新设计一下, 你代码设计逻辑为:

开始扫描,扫描完成,如果不active直接deepsleep。

active的话,等待500ms,,如果我在等待的500ms以及MCWDT睡眠的周期里面,手指去触摸的话,是检测不到的。这应该就是你说的有的1s才有反应的原理。低功耗的代码可以参考我们的触摸例程。

可以参考creator中的PSoC4的capsense low power 示例进行设计。https://www.cypress.com/documentation/code-examples/ce210291-psoc-4-capsense-one-button

View solution in original post

0 Likes
7 Replies
LinglingG_46
Moderator
Moderator

看了一下你的代码,在处理低功耗一块的逻辑需要重新设计一下, 你代码设计逻辑为:

开始扫描,扫描完成,如果不active直接deepsleep。

active的话,等待500ms,,如果我在等待的500ms以及MCWDT睡眠的周期里面,手指去触摸的话,是检测不到的。这应该就是你说的有的1s才有反应的原理。低功耗的代码可以参考我们的触摸例程。

可以参考creator中的PSoC4的capsense low power 示例进行设计。https://www.cypress.com/documentation/code-examples/ce210291-psoc-4-capsense-one-button

View solution in original post

0 Likes
user_4363331
New Contributor

我的延时500ms是通过电流表看是否有较大的功耗变化(因为单独做功耗测试,不添加其他外围电路,只能简单看现象),如果有,则说明检测到了触摸,但是实际情况是我触摸按键后1S左右功耗才开始变大,我在我实际的项目中有增加LED闪烁观察,也是这样的效果(当active时LED灭)。我想做到的是300ms内响应,但是实际效果做不到。我有看过这个示例,但是我没法验证这个示例能达到的效果是怎么样的,而且唤醒周期是30ms,这样会消耗很大的功耗。

0 Likes
user_4363331
New Contributor

忘记说明了,是手一直触摸1S钟后才有反应,唤醒频率越快,反应越快,但是都不能做到第一次唤醒如果有触摸就能进入active

0 Likes
LinglingG_46
Moderator
Moderator

你可以按照下面代码的逻辑测300ms扫描间隔。

int main(void)

{

    __enable_irq(); /* Enable global interrupts. */

    /* Enable CM4.  CY_CORTEX_M4_APPL_ADDR must be updated if CM4 memory layout is changed. */

 

    

    CapSense_Start(); 

   // CapSense_Initialize();

    CapSense_ScanAllWidgets();

    //myRTC_Init();

    //PowerADCInit();

    MCWDT_Init1();

    /* Place your initialization/startup code here (e.g. MyInst_Start()) */

    CyDelay(5000);

    Cy_SysEnableCM4(CY_CORTEX_M4_APPL_ADDR);

    MCWDT_SetMatch(CY_MCWDT_COUNTER0,9599,93);//300ms

    for(;;)

    {

       

       

       

        if(CapSense_NOT_BUSY == CapSense_IsBusy())

        {   

           

            /* Process data on all the enabled widgets */

            CapSense_ProcessAllWidgets();

           

            if(CapSense_dsRam.snsStatus[CapSense_BUTTON0_WDGT_ID]>0)

            {

                //CyDelay(500);//当检测到触摸时,电流表显示功耗变大

             // Cy_GPIO_Inv( Pin_1_0_PORT , Pin_1_0_NUM );

                Cy_GPIO_Write(Pin_1_0_PORT , Pin_1_0_NUM,0);

            }

           

            else

            {

                 Cy_GPIO_Write(Pin_1_0_PORT , Pin_1_0_NUM,1);

              Cy_SysPm_DeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT);

            }

    

           CapSense_ScanAllWidgets(); 

        }

      

      

      

    }

}

0 Likes
user_4363331
New Contributor

效果是一样的,还有一个问题,就是在唤醒后,在不操作的情况下,功耗每隔一段时间会自动增加,然后回落,好像是if(CapSense_NOT_BUSY == CapSense_IsBusy())这个条件不一定满足。而且周期也是固定的

0 Likes
LinglingG_46
Moderator
Moderator

1:你的代码在 CapSense_Start(); 之后,用了 CapSense_Initialize(); start之后不需要再初始化了。

2:在for循环里面的逻辑:

进入for循环之后,第一个判断语句下面,你调用了 CapSense_ScanAllWidgets();   但是你没有调用是否扫描完成,你就调用了 CapSense_ProcessAllWidgets(); 我觉得这个地方的逻辑是有问题的。

3:接着你直接进入下面的while语句,如果扫描完成之后,你直接就让芯片进入deepsleep,等待300ms唤醒。这里我有个疑问,如果你的手指一直是按压的状态,那么你也是300ms deepsleep唤醒周期,唤醒以后再等800ms(500ms+300ms)进行下一次扫描。 按照我这样的理解,按照我的理解,如果你一直按压的话,就不是300ms的扫描周期了,而是800ms的扫描周期,我不知道这是不是你想要的设计?

4:你用的是我们的kit板进行测试的吗?

5:你怎么判断你按压上去过1s中采用反应的,建议如果有sensor触发的时候,芯片不要进入deepsleep,如果没有按键触发,建议以300ms的周期唤醒。

6:我给你的代码是我在测试板上面测试验证过的,按键用的是P8.3,这个代码不是我随便写的,建议你仔细的看一下。

7:如果还是有问题的话,建议你联系你购买芯片的代理商的FAE负责支持。

0 Likes
user_4363331
New Contributor

非常感谢你的耐心解答,我用的不是kit,我不能确认是跟硬件有关或者设置某些参数有关,我用了你的测试代码,效果是一样的,附件是我的逻辑,我把唤醒周期加大到2s,观察到都是手按下后不放,LED1闪烁三次后LED0才会有改变。LinglingG_46

0 Likes