本帖最后由 南来之风 于 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_MODE、ALR_MODE (Active Low Refresh-rate Mode)和WOT_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
|