打印
[PSOC™]

【英飞凌PSOC 4000T DIY】搭配自制电容触摸按键体验CSD感应技术

[复制链接]
156|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 南来之风 于 2025-4-24 12:41 编辑

#申请原创# 英飞凌具有非常完善的电容感应技术,对于常用的自容感应有CAPSENSE™ Sigma Delta即CSD技术;

对于互容有CAPSENSE™ Crosspoint即CSX技术。这两种技术都提供了业内优秀的SNR。


开发套件包含了很多英飞凌官方的感应配件,本次实验使用自制的电容触摸按键搭配PSOC™ 4000T主控板,体验在Modus开发环境下的CSD技术的应用。



实物照片:


其中,扩展板的触摸按键与GND分别连接到主控开发板的P4.0引脚与GND引脚。






接下来介绍一下在Modus里面的配置,首先进入Device Configurator,在左侧Perpherals里面找打System,勾选CapSense与MSCLP0。


在Basic一栏中,可以根据项目需要,添加多种触摸小组件。


在Advanced中-> General总配置基础参数:


在CSD Setting里面配置是否屏蔽等:



在Widget Details里面

Ctrl + s 进行保存,然后回到Device Configurator界面。配置触摸引脚:




配置EZI2C触摸调试引脚:



Ctrl + s 进行保存,如果有错误,会在底部的输出窗口列出,根据提示修改即可。


主要的初始化代码有:
    /* Initialize MSC CAPSENSE™ */
    initialize_capsense();

    /* Measures the actual ILO frequency and compensate MSCLP wake up timers */
    Cy_CapSense_IloCompensate(&cy_capsense_context);

    /* Configure the MSCLP wake up timer as per the ACTIVE mode refresh rate */
    Cy_CapSense_ConfigureMsclpTimer(ACTIVE_MODE_TIMER, &cy_capsense_context);


在循环体中,根据ACTIVE_MODEALR_MODE (Active Low Refresh-rate ModeWOT_MODE (Wake On Touch Mode三种模式,控制LED闪烁频率。
 for (;;)
    {
        switch(capsense_state)
        {
            case ACTIVE_MODE:

                Cy_CapSense_ScanAllSlots(&cy_capsense_context);

                interruptStatus = Cy_SysLib_EnterCriticalSection();

                while (Cy_CapSense_IsBusy(&cy_capsense_context))
                {
#if ENABLE_PWM_LED
                    Cy_SysPm_CpuEnterSleep();
#else
                    Cy_SysPm_CpuEnterDeepSleep();
#endif

                    Cy_SysLib_ExitCriticalSection(interruptStatus);

                    /* This is a place where all interrupt handlers will be executed */
                    interruptStatus = Cy_SysLib_EnterCriticalSection();
                }

                Cy_SysLib_ExitCriticalSection(interruptStatus);

#if ENABLE_RUN_TIME_MEASUREMENT
                active_processing_time=0;
                start_runtime_measurement();
#endif

                Cy_CapSense_ProcessAllWidgets(&cy_capsense_context);

                /* Scan, process and check the status of the all Active mode sensors */
                if(Cy_CapSense_IsAnyWidgetActive(&cy_capsense_context))
                {
                    capsense_state_timeout = ACTIVE_MODE_TIMEOUT;
                }
                else
                {
                    capsense_state_timeout--;

                    if(TIMEOUT_RESET == capsense_state_timeout)
                    {
                        capsense_state = ALR_MODE;
                        capsense_state_timeout = ALR_MODE_TIMEOUT;

                        /* Configure the MSCLP wake up timer as per the ALR mode refresh rate */
                        Cy_CapSense_ConfigureMsclpTimer(ALR_MODE_TIMER, &cy_capsense_context);
                    }
                }

#if ENABLE_RUN_TIME_MEASUREMENT
                active_processing_time=stop_runtime_measurement();
#endif

                break;
                /* End of ACTIVE_MODE */

                /* Active Low Refresh-rate Mode */
            case ALR_MODE :

                Cy_CapSense_ScanAllSlots(&cy_capsense_context);

                interruptStatus = Cy_SysLib_EnterCriticalSection();

                while (Cy_CapSense_IsBusy(&cy_capsense_context))
                {
#if ENABLE_PWM_LED
                    Cy_SysPm_CpuEnterSleep();
#else
                    Cy_SysPm_CpuEnterDeepSleep();
#endif

                    Cy_SysLib_ExitCriticalSection(interruptStatus);

                    /* This is a place where all interrupt handlers will be executed */
                    interruptStatus = Cy_SysLib_EnterCriticalSection();
                }

                Cy_SysLib_ExitCriticalSection(interruptStatus);

#if ENABLE_RUN_TIME_MEASUREMENT
                alr_processing_time=0;
                start_runtime_measurement();
#endif

                Cy_CapSense_ProcessAllWidgets(&cy_capsense_context);

                /* Scan, process and check the status of the all Active mode sensors */
                if(Cy_CapSense_IsAnyWidgetActive(&cy_capsense_context))
                {
                    capsense_state = ACTIVE_MODE;
                    capsense_state_timeout = ACTIVE_MODE_TIMEOUT;

                    /* Configure the MSCLP wake up timer as per the ACTIVE mode refresh rate */
                    Cy_CapSense_ConfigureMsclpTimer(ACTIVE_MODE_TIMER, &cy_capsense_context);
                }
                else
                {
                    capsense_state_timeout--;

                    if(TIMEOUT_RESET == capsense_state_timeout)
                    {
                        capsense_state = WOT_MODE;

                    }
                }

#if ENABLE_RUN_TIME_MEASUREMENT
                alr_processing_time=stop_runtime_measurement();
#endif

                break;
                /* End of Active-Low Refresh Rate(ALR) mode */

                /* Wake On Touch Mode */
            case WOT_MODE :

                Cy_CapSense_ScanAllLpSlots(&cy_capsense_context);

                interruptStatus = Cy_SysLib_EnterCriticalSection();

                while (Cy_CapSense_IsBusy(&cy_capsense_context))
                {
#if ENABLE_PWM_LED
                    Cy_SysPm_CpuEnterSleep();
#else
                    Cy_SysPm_CpuEnterDeepSleep();
#endif

                    Cy_SysLib_ExitCriticalSection(interruptStatus);

                    /* This is a place where all interrupt handlers will be executed */
                    interruptStatus = Cy_SysLib_EnterCriticalSection();
                }

                Cy_SysLib_ExitCriticalSection(interruptStatus);

                if (Cy_CapSense_IsAnyLpWidgetActive(&cy_capsense_context))
                {
                    capsense_state = ACTIVE_MODE;
                    capsense_state_timeout = ACTIVE_MODE_TIMEOUT;

                    /* Configure the MSCLP wake up timer as per the ACTIVE mode refresh rate */
                    Cy_CapSense_ConfigureMsclpTimer(ACTIVE_MODE_TIMER, &cy_capsense_context);
                }
                else
                {
                    capsense_state = ALR_MODE;
                    capsense_state_timeout = ALR_MODE_TIMEOUT;

                    /* Configure the MSCLP wake up timer as per the ALR mode refresh rate */
                    Cy_CapSense_ConfigureMsclpTimer(ALR_MODE_TIMER, &cy_capsense_context);
                }

                break;
                /* End of "WAKE_ON_TOUCH_MODE" */

            default:
                /**  Unknown power mode state. Unexpected situation.  **/
                CY_ASSERT(CY_ASSERT_FAILED);
                break;
        }
#if ENABLE_PWM_LED
        led_control();
#endif

#if ENABLE_TUNER
        /* Establishes synchronized communication with the CAPSENSE™ Tuner tool */
        Cy_CapSense_RunTuner(&cy_capsense_context);
#endif
    }

烧录后,点击CAPSENSE™ Tuner 7.10进入电容触摸调试界面:


在没有触摸的情况下,波形图如下:


单次触摸,识别阈值设置为666.




慢速多次触摸,识别准确!


快速单击5次,识别非常准确!


快速多次触摸,识别非常准确!



信噪比测试:

测试视频已经发布在B站:英飞凌PSOC 4000T DIY  https://www.bilibili.com/video/BV1kVLvzsEiR/?vd_source=06b417808f9325071f39e5fd55985221





使用特权

评论回复
沙发
Amazingxixixi| | 2025-4-24 16:17 | 只看该作者
学习一下学习一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

63

主题

279

帖子

2

粉丝