关于PSOC4000 多个gang sensor 的低功耗操作

公告

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

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

cross mob
wagu_1442321
Level 2
Level 2
10 questions asked 5 questions asked First reply posted

hi,手头一触摸低功耗项目,共6个按键,其中5个离得较近,第六个较远,大约10多cm。担心1个gang sensor绑定6个sensor 信号质量不好。在参考CE210290代码基础上,打算慢速扫描的时候,弄成2个gang sensor。第一个级联1-5个,第二个级联单独的第六个pad。由于函数不能同时使用两个gang sensor,现在是每隔100ms的间隔,轮训扫描2个gang sensor,初步测试发现,功能正常可以唤醒。唯一的功耗不太正常。系统第一次进入低功耗唤醒用那个gang senor,那个唤醒和再次睡眠功耗正常,另一个个gang sensor功耗都30多ua了,调试多次也如此,希望大家做过多个gang senor的提供下建议。谢谢!以下是main函数:

   unsigned int i=0;

    for(i=0;i<100;i++) Delay(6000);

    CyGlobalIntEnable;       /* Enable Global Interrupt */

   

    #if TUNING_ENABLE

    {

        EZI2C_Start();  /* Set up communication and initialize data buffer to CapSense datastructure to use Tuner application */

        EZI2C_EzI2CSetBuffer1(sizeof(CapSense_dsRam),sizeof(CapSense_dsRam),(uint8_t *)&CapSense_dsRam);

        CapSense_Start();                       /* Start CapSense Component */

        CapSense_ScanAllWidgets(); /* Scan all widgets */

        for(;;)

        {

            if(CapSense_NOT_BUSY == CapSense_IsBusy())   /* Do this only when a scan is done */

            {

                CapSense_ProcessAllWidgets();   /* Process all widgets */

                CapSense_RunTuner();            /* To sync with Tuner application */

                CapSense_ScanAllWidgets();      /* Start next scan */

            }

        }

    }   

    #else

    {

        CyGlobalIntEnable;  

        EZI2C_EzI2CSetBuffer1(BUFFER_SIZE, READ_ONLY_OFFSET, ezI2cBuffer);    /* Setup buffer and start EZI2C slave (SCB mode) */

        EZI2C_Start();

    CapSense_Start();

        CapSense_SetupWidget(CapSense_BUTTON_WDGT_ID);

        WDT_Start();

        for(;;)

        { 

        /* Switch between sensor-scan -> wait-for-scan -> process -> sleep states */

            switch(currentState)

            {

                case SENSOR_SCAN:                

                    /* Initiate new scan only if the CapSense hardware is idle */

                    if(CapSense_NOT_BUSY == CapSense_IsBusy())

                    {  

                        if(deviceScanMode == FAST_SCAN_MODE)

                        {

                            CapSense_CSDScan();

                        }

                        else

                        {

                            CapSense_CSDScanExt();

                        }

                        currentState = WAIT_FOR_SCAN_COMPLETE;                   

                    }

                    break;

                case WAIT_FOR_SCAN_COMPLETE:

                    interruptState = CyEnterCriticalSection();

                    if(CapSense_NOT_BUSY != CapSense_IsBusy())

                    {

                        CySysPmSleep();

                    }

                    else

                    {

                        currentState = PROCESS_DATA;

                    }

                    CyExitCriticalSection(interruptState);

                    break;

           

                case PROCESS_DATA:

                    currentState = SLEEP;

                    buttonStatus = CLEAR;

                    if(deviceScanMode == FAST_SCAN_MODE)

                    {

                        CapSense_ProcessWidgetExt(CapSense_BUTTON_WDGT_ID, CapSense_PROCESS_CUSTOM);

                        if(CapSense_IsWidgetActive(CapSense_BUTTON_WDGT_ID))

            {

                            buttonStatus = CapSense_dsRam.snsStatus[CapSense_BUTTON_WDGT_ID];                       

               softCounter = RESET;

                            if((EZI2C_EzI2CGetActivity() & EZI2C_EZI2C_STATUS_BUSY)==0)

                            {

                                EZI2C_DisableInt();

                                ezI2cBuffer[0] =  0xA5;

                                ezI2cBuffer[1] =  ((buttonStatus & 0xFF00) >> 8);

                                ezI2cBuffer[2] =  (buttonStatus & 0x00FF);

                                EZI2C_EnableInt();

                            }

                            Touch_Int_Write(1);

            }

            else

            {

                            if((EZI2C_EzI2CGetActivity() & EZI2C_EZI2C_STATUS_BUSY)==0)

                            {

                                EZI2C_DisableInt();

                                ezI2cBuffer[0] =  0x5A;

                                ezI2cBuffer[1] =  0x00;

                                ezI2cBuffer[2] =  0x00;

                                EZI2C_EnableInt();

                            }

                          

                            Touch_Int_Write(0);

               softCounter++; 

                            if(softCounter >= SCANMODE_TIMEOUT_VALUE)

                            {  

                   watchdogMatchValue = WDT_TIMEOUT_SLOW_SCAN;

                                deviceScanMode = SLOW_SCAN_MODE;

                                TurnSlowScanFlg = 1;

                                CapSense_CSDSetupWidgetExt(CapSense_GANGEDBUTTON2_WDGT_ID, CapSense_GANGEDBUTTON2_SNS0_ID);

                            } 

                        }

                    }    

                    else

                    {  

                        if(TurnSlowScanFlg == 0)

                        {

                            TurnSlowScanFlg = 1;

                            CapSense_ProcessWidget(CapSense_GANGEDBUTTON_WDGT_ID);

                           

                            //CapSense_SsCSDDisconnectSnsExt(CapSense_GANGEDBUTTON_WDGT_ID, CapSense_GANGEDBUTTON_SNS0_ID);

                            //CapSense_SsCSDConnectSensorExt(CapSense_GANGEDBUTTON2_WDGT_ID, CapSense_GANGEDBUTTON2_SNS0_ID);

                           

                            CapSense_CSDSetupWidgetExt(CapSense_GANGEDBUTTON2_WDGT_ID, CapSense_GANGEDBUTTON2_SNS0_ID);

                        }

                        else

                        {

                            TurnSlowScanFlg = 0;

                            CapSense_ProcessWidget(CapSense_GANGEDBUTTON2_WDGT_ID);

                            //CapSense_SsCSDDisconnectSnsExt(CapSense_GANGEDBUTTON2_WDGT_ID, CapSense_GANGEDBUTTON2_SNS0_ID);

                            //CapSense_SsCSDConnectSensorExt(CapSense_GANGEDBUTTON_WDGT_ID, CapSense_GANGEDBUTTON_SNS0_ID);

                           

                            CapSense_CSDSetupWidgetExt(CapSense_GANGEDBUTTON_WDGT_ID, CapSense_GANGEDBUTTON_SNS0_ID);

                        }

                        if((CapSense_IsWidgetActive(CapSense_GANGEDBUTTON_WDGT_ID))||(CapSense_IsWidgetActive(CapSense_GANGEDBUTTON2_WDGT_ID)))

                        {

                            currentState = SENSOR_SCAN;

               watchdogMatchValue = WDT_TIMEOUT_FAST_SCAN;     

                            deviceScanMode = FAST_SCAN_MODE;

                            CapSense_SetupWidget(CapSense_BUTTON_WDGT_ID);

                        }

                    }

                    break;

               

                case SLEEP:            

                    if(deviceScanMode == FAST_SCAN_MODE)

                    {  

                        CySysPmSleep();

                    }

                    else

                    {

                        EnterDeepSleepLowPowerMode();

                    }

                    if(wdtInterruptOccured)

                    {

                        currentState = SENSOR_SCAN;

                        wdtInterruptOccured = FALSE; 

                        CalibrateWdtMatchValue();

                    }

                break;

               

                default:

                    CYASSERT(0);

                break;

            }

        }

   

    }

    #endif

}

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

首先: 如果6个按键绑定在一起扫描的话,你是遇到什么问题了吗?

下面我的讨论将你前五个绑定在一起的sensor 称为SENSOR0, 第六个sensor称为SENSOR1

第一,我认为你没有必要分成两个部分来扫,这样会让原来简单的逻辑变得复杂。

第二,如果你要分成两个按键来判断当前系统是否要进入全速扫描的状态,我觉得你可以按照扫描SENSOR0,如果SENSOE0 active,直接让程序进入全速扫描的状态。 如果SENSOR0不是active的,直接再扫SENSOR1,不需要隔100ms扫一个。如果你隔100ms扫一个sensor, 有可能在扫SENSOR0的时候SENSOR1是处于active的状态。

总而言之, 我还是觉得你直接扫描6senor是比较合理的。

在原帖中查看解决方案

0 点赞
2 回复数
LinglingG_46
Moderator
Moderator
Moderator
500 solutions authored 1000 replies posted 10 questions asked

首先: 如果6个按键绑定在一起扫描的话,你是遇到什么问题了吗?

下面我的讨论将你前五个绑定在一起的sensor 称为SENSOR0, 第六个sensor称为SENSOR1

第一,我认为你没有必要分成两个部分来扫,这样会让原来简单的逻辑变得复杂。

第二,如果你要分成两个按键来判断当前系统是否要进入全速扫描的状态,我觉得你可以按照扫描SENSOR0,如果SENSOE0 active,直接让程序进入全速扫描的状态。 如果SENSOR0不是active的,直接再扫SENSOR1,不需要隔100ms扫一个。如果你隔100ms扫一个sensor, 有可能在扫SENSOR0的时候SENSOR1是处于active的状态。

总而言之, 我还是觉得你直接扫描6senor是比较合理的。

0 点赞

谢谢。这个问题已经解决了。

0 点赞