7 Replies Latest reply on Aug 26, 2019 9:03 PM by user_4363331

    CapSense在deepsleep低功耗唤醒问题

    user_4363331

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

        • 1. Re: CapSense在deepsleep低功耗唤醒问题
          LinglingG_46

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

          开始扫描,扫描完成,如果不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

          • 2. Re: CapSense在deepsleep低功耗唤醒问题
            user_4363331

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

            • 3. Re: CapSense在deepsleep低功耗唤醒问题
              user_4363331

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

              • 4. Re: CapSense在deepsleep低功耗唤醒问题
                LinglingG_46

                你可以按照下面代码的逻辑测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(); 

                        }

                      

                      

                      

                    }

                }

                • 5. Re: CapSense在deepsleep低功耗唤醒问题
                  user_4363331

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

                  • 6. Re: CapSense在deepsleep低功耗唤醒问题
                    LinglingG_46

                    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负责支持。

                    • 7. Re: CapSense在deepsleep低功耗唤醒问题
                      user_4363331

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