capsense在deepsleep时定时300ms唤醒扫描,发现并没有在每次唤醒都能检测到触摸,一般都要接近1S左右才有反应,是我哪里没处理好吗?希望有做过类似的capsense低功耗处理朋友能帮忙看下哪里出现了问题,非常感谢!
已解决! 转到解答。
看了一下你的代码,在处理低功耗一块的逻辑需要重新设计一下, 你代码设计逻辑为:
开始扫描,扫描完成,如果不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
看了一下你的代码,在处理低功耗一块的逻辑需要重新设计一下, 你代码设计逻辑为:
开始扫描,扫描完成,如果不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
我的延时500ms是通过电流表看是否有较大的功耗变化(因为单独做功耗测试,不添加其他外围电路,只能简单看现象),如果有,则说明检测到了触摸,但是实际情况是我触摸按键后1S左右功耗才开始变大,我在我实际的项目中有增加LED闪烁观察,也是这样的效果(当active时LED灭)。我想做到的是300ms内响应,但是实际效果做不到。我有看过这个示例,但是我没法验证这个示例能达到的效果是怎么样的,而且唤醒周期是30ms,这样会消耗很大的功耗。
忘记说明了,是手一直触摸1S钟后才有反应,唤醒频率越快,反应越快,但是都不能做到第一次唤醒如果有触摸就能进入active
你可以按照下面代码的逻辑测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();
}
}
}
效果是一样的,还有一个问题,就是在唤醒后,在不操作的情况下,功耗每隔一段时间会自动增加,然后回落,好像是if(CapSense_NOT_BUSY == CapSense_IsBusy())这个条件不一定满足。而且周期也是固定的
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负责支持。
非常感谢你的耐心解答,我用的不是kit,我不能确认是跟硬件有关或者设置某些参数有关,我用了你的测试代码,效果是一样的,附件是我的逻辑,我把唤醒周期加大到2s,观察到都是手按下后不放,LED1闪烁三次后LED0才会有改变。LinglingG_46