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

[复制链接]
 楼主| 南来之风 发表于 2025-4-24 09:44 | 显示全部楼层 |阅读模式
<
本帖最后由 南来之风 于 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 进行保存,如果有错误,会在底部的输出窗口列出,根据提示修改即可。


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

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

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


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

  6.                 Cy_CapSense_ScanAllSlots(&cy_capsense_context);

  7.                 interruptStatus = Cy_SysLib_EnterCriticalSection();

  8.                 while (Cy_CapSense_IsBusy(&cy_capsense_context))
  9.                 {
  10. #if ENABLE_PWM_LED
  11.                     Cy_SysPm_CpuEnterSleep();
  12. #else
  13.                     Cy_SysPm_CpuEnterDeepSleep();
  14. #endif

  15.                     Cy_SysLib_ExitCriticalSection(interruptStatus);

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

  19.                 Cy_SysLib_ExitCriticalSection(interruptStatus);

  20. #if ENABLE_RUN_TIME_MEASUREMENT
  21.                 active_processing_time=0;
  22.                 start_runtime_measurement();
  23. #endif

  24.                 Cy_CapSense_ProcessAllWidgets(&cy_capsense_context);

  25.                 /* Scan, process and check the status of the all Active mode sensors */
  26.                 if(Cy_CapSense_IsAnyWidgetActive(&cy_capsense_context))
  27.                 {
  28.                     capsense_state_timeout = ACTIVE_MODE_TIMEOUT;
  29.                 }
  30.                 else
  31.                 {
  32.                     capsense_state_timeout--;

  33.                     if(TIMEOUT_RESET == capsense_state_timeout)
  34.                     {
  35.                         capsense_state = ALR_MODE;
  36.                         capsense_state_timeout = ALR_MODE_TIMEOUT;

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

  41. #if ENABLE_RUN_TIME_MEASUREMENT
  42.                 active_processing_time=stop_runtime_measurement();
  43. #endif

  44.                 break;
  45.                 /* End of ACTIVE_MODE */

  46.                 /* Active Low Refresh-rate Mode */
  47.             case ALR_MODE :

  48.                 Cy_CapSense_ScanAllSlots(&cy_capsense_context);

  49.                 interruptStatus = Cy_SysLib_EnterCriticalSection();

  50.                 while (Cy_CapSense_IsBusy(&cy_capsense_context))
  51.                 {
  52. #if ENABLE_PWM_LED
  53.                     Cy_SysPm_CpuEnterSleep();
  54. #else
  55.                     Cy_SysPm_CpuEnterDeepSleep();
  56. #endif

  57.                     Cy_SysLib_ExitCriticalSection(interruptStatus);

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

  61.                 Cy_SysLib_ExitCriticalSection(interruptStatus);

  62. #if ENABLE_RUN_TIME_MEASUREMENT
  63.                 alr_processing_time=0;
  64.                 start_runtime_measurement();
  65. #endif

  66.                 Cy_CapSense_ProcessAllWidgets(&cy_capsense_context);

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

  72.                     /* Configure the MSCLP wake up timer as per the ACTIVE mode refresh rate */
  73.                     Cy_CapSense_ConfigureMsclpTimer(ACTIVE_MODE_TIMER, &cy_capsense_context);
  74.                 }
  75.                 else
  76.                 {
  77.                     capsense_state_timeout--;

  78.                     if(TIMEOUT_RESET == capsense_state_timeout)
  79.                     {
  80.                         capsense_state = WOT_MODE;

  81.                     }
  82.                 }

  83. #if ENABLE_RUN_TIME_MEASUREMENT
  84.                 alr_processing_time=stop_runtime_measurement();
  85. #endif

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

  88.                 /* Wake On Touch Mode */
  89.             case WOT_MODE :

  90.                 Cy_CapSense_ScanAllLpSlots(&cy_capsense_context);

  91.                 interruptStatus = Cy_SysLib_EnterCriticalSection();

  92.                 while (Cy_CapSense_IsBusy(&cy_capsense_context))
  93.                 {
  94. #if ENABLE_PWM_LED
  95.                     Cy_SysPm_CpuEnterSleep();
  96. #else
  97.                     Cy_SysPm_CpuEnterDeepSleep();
  98. #endif

  99.                     Cy_SysLib_ExitCriticalSection(interruptStatus);

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

  103.                 Cy_SysLib_ExitCriticalSection(interruptStatus);

  104.                 if (Cy_CapSense_IsAnyLpWidgetActive(&cy_capsense_context))
  105.                 {
  106.                     capsense_state = ACTIVE_MODE;
  107.                     capsense_state_timeout = ACTIVE_MODE_TIMEOUT;

  108.                     /* Configure the MSCLP wake up timer as per the ACTIVE mode refresh rate */
  109.                     Cy_CapSense_ConfigureMsclpTimer(ACTIVE_MODE_TIMER, &cy_capsense_context);
  110.                 }
  111.                 else
  112.                 {
  113.                     capsense_state = ALR_MODE;
  114.                     capsense_state_timeout = ALR_MODE_TIMEOUT;

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

  118.                 break;
  119.                 /* End of "WAKE_ON_TOUCH_MODE" */

  120.             default:
  121.                 /**  Unknown power mode state. Unexpected situation.  **/
  122.                 CY_ASSERT(CY_ASSERT_FAILED);
  123.                 break;
  124.         }
  125. #if ENABLE_PWM_LED
  126.         led_control();
  127. #endif

  128. #if ENABLE_TUNER
  129.         /* Establishes synchronized communication with the CAPSENSE™ Tuner tool */
  130.         Cy_CapSense_RunTuner(&cy_capsense_context);
  131. #endif
  132.     }

烧录后,点击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 | 显示全部楼层
学习一下学习一下
慢动作 发表于 2025-4-29 11:34 | 显示全部楼层
配置好感应系统后,可以编写代码来监测触摸事件。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

290

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部