[PSOC™] 【英飞凌PSOC 4000T DIY】抽油烟机的触控面板功能特性体验

[复制链接]
 楼主| lemonboard 发表于 2025-5-25 14:53 | 显示全部楼层 |阅读模式
<
【英飞凌PSOC 4000T DIY】抽油烟机的触控面板功能特性体验
我家里有一台普通的抽油烟机,是当年购房时开发商在装修交房时附带的厨房用家电。抽油烟机的工作原理非常简单,一般有两台大排量的吸风风扇组成,配以风道和开关控制电路。现代的抽油烟机控制就五花八门了,但我家的是使用3颗传统自锁按键和1颗解锁开关按键,功能仅为慢速,快速,打开关闭,辅助灯光——简单又实用。
在使用过程中,它有一个问题,由于用手按按键,肯定会有油污残留在按键缝隙里,堆积之后,按键使用便不再自如“上上下下”了。当然,从隐患的角度讲,长此以往,按键多半会失灵,造成短路或者无效,影响使用。
有网友提出方案,给按键覆盖上保鲜膜即可隔绝污物。但首先,保鲜膜无法保证油污的侵入;另一方面,保鲜膜在按动过程当中容易损坏,使用起来还是挺麻烦的,效果也不佳。但当你遇到英飞凌PSOC 4000T之后,情况就不一样了!
英飞凌PSOC 4000T使用了超级牛X的专利技术,可以让触控在不同材质上的应用效果都稳定准确,提供优秀的人机交互体验,即使在像玻璃、金属等材料上也能够准确识别按键,即使手湿的情况下。
抽油烟机的工作应用场景一般为当我们在操作按键后,PSOC 4000T接收到开机、关机信号,需要控制电机的启动与停止。这时,我们需要PSOC 4000T输出PWM波信号,并根据当前工作的模式,如强力模式、普通模式,来调节PWM波的占空比。
阅读英飞凌的技术手册PSOC  4000T提供两路独立输出PWM波。在做此实验时,我使用官方eclipse IDE的示例TCPWM_square_wave为基础,在此工程下,通过Device  Configurator工具软件对另外一路PWM波输出进行配置,在TCPWM COUNT0模块下的P3[0]引脚和TCPWM的P1[0]引脚上输出PWM波。
在烧录了官方示例后,我发现其PWM主频太低了(500ms的周期),倒是演示了LED灯的亮灭。官方示例使用PWM来实现LED灯的翻转也是真有想法的!但这个频率可无法驱动电机,也就无法控制抽油烟机抽油烟了。
我们的PSOC4000T系列主频为48MHz,本次使用时钟外设为16bit时钟分频模块,命名pwm_clock并将其配置为divider1,这样输入到timer外设的时钟输入频率为48MHz,接下来再配置计数器的值为4800-1。再将匹配值设置为2400。这样占空比仍然是50%。同样道理,配置另一路PWM波的匹配值为1200占空比为25%,保存。ModusToolBox将为我们自动生成代码。
  1. const cy_stc_tcpwm_pwm_config_t PWM_CH0_config =
  2. {
  3.     .pwmMode = CY_TCPWM_PWM_MODE_PWM,
  4.     .clockPrescaler = CY_TCPWM_PWM_PRESCALER_DIVBY_1,
  5.     .pwmAlignment = CY_TCPWM_PWM_LEFT_ALIGN,
  6.     .deadTimeClocks = 0,
  7.     .runMode = CY_TCPWM_PWM_CONTINUOUS,
  8.     .period0 = 4799,
  9.     .period1 = 32768,
  10.     .enablePeriodSwap = false,
  11.     .compare0 = 2400,
  12.     .compare1 = 16384,
  13.     .enableCompareSwap = false,
  14.     .interruptSources = CY_TCPWM_INT_NONE,
  15.     .invertPWMOut = CY_TCPWM_PWM_INVERT_DISABLE,
  16.     .invertPWMOutN = CY_TCPWM_PWM_INVERT_DISABLE,
  17.     .killMode = CY_TCPWM_PWM_STOP_ON_KILL,
  18.     .swapInputMode = PWM_CH0_INPUT_DISABLED & 0x3U,
  19.     .swapInput = CY_TCPWM_INPUT_0,
  20.     .reloadInputMode = PWM_CH0_INPUT_DISABLED & 0x3U,
  21.     .reloadInput = CY_TCPWM_INPUT_0,
  22.     .startInputMode = PWM_CH0_INPUT_DISABLED & 0x3U,
  23.     .startInput = CY_TCPWM_INPUT_0,
  24.     .killInputMode = PWM_CH0_INPUT_DISABLED & 0x3U,
  25.     .killInput = CY_TCPWM_INPUT_0,
  26.     .countInputMode = PWM_CH0_INPUT_DISABLED & 0x3U,
  27.     .countInput = CY_TCPWM_INPUT_1,
  28. };

  29. const cy_stc_tcpwm_pwm_config_t PWM_CH1_config =
  30. {
  31.     .pwmMode = CY_TCPWM_PWM_MODE_PWM,
  32.     .clockPrescaler = CY_TCPWM_PWM_PRESCALER_DIVBY_1,
  33.     .pwmAlignment = CY_TCPWM_PWM_LEFT_ALIGN,
  34.     .deadTimeClocks = 0,
  35.     .runMode = CY_TCPWM_PWM_CONTINUOUS,
  36.     .period0 = 4799,
  37.     .period1 = 32768,
  38.     .enablePeriodSwap = false,
  39.     .compare0 = 1200,
  40.     .compare1 = 16384,
  41.     .enableCompareSwap = false,
  42.     .interruptSources = CY_TCPWM_INT_NONE,
  43.     .invertPWMOut = CY_TCPWM_PWM_INVERT_DISABLE,
  44.     .invertPWMOutN = CY_TCPWM_PWM_INVERT_DISABLE,
  45.     .killMode = CY_TCPWM_PWM_STOP_ON_KILL,
  46.     .swapInputMode = PWM_CH1_INPUT_DISABLED & 0x3U,
  47.     .swapInput = CY_TCPWM_INPUT_0,
  48.     .reloadInputMode = PWM_CH1_INPUT_DISABLED & 0x3U,
  49.     .reloadInput = CY_TCPWM_INPUT_0,
  50.     .startInputMode = PWM_CH1_INPUT_DISABLED & 0x3U,
  51.     .startInput = CY_TCPWM_INPUT_0,
  52.     .killInputMode = PWM_CH1_INPUT_DISABLED & 0x3U,
  53.     .killInput = CY_TCPWM_INPUT_0,
  54.     .countInputMode = PWM_CH1_INPUT_DISABLED & 0x3U,
  55.     .countInput = CY_TCPWM_INPUT_1,
  56. };

  57. int main(void) {
  58.         cy_rslt_t result;

  59.         /* Initialize the device and board peripherals */
  60.         result = cybsp_init();
  61.         if (result != CY_RSLT_SUCCESS) {
  62.                 CY_ASSERT(0);
  63.         }

  64.         /* Enable global interrupts */
  65.         __enable_irq();

  66.         /* Initialize, enable, and start the PWM component.
  67.          * To see all pre-defined parameters such as <Instance_Name>_Mask/Num
  68.          * or PWM_config see cycfg_peripherals.h under generated sources.
  69.          */
  70.         (void) Cy_TCPWM_PWM_Init(PWM_CH0_HW, PWM_CH0_NUM, &PWM_CH0_config);
  71.         Cy_TCPWM_Enable_Multiple(PWM_CH0_HW, PWM_CH0_MASK);
  72.         Cy_TCPWM_TriggerReloadOrIndex(PWM_CH0_HW, PWM_CH0_MASK);

  73.         (void) Cy_TCPWM_PWM_Init(PWM_CH1_HW, PWM_CH1_NUM,
  74.                         &PWM_CH1_config);
  75.         Cy_TCPWM_Enable_Multiple(PWM_CH1_HW, PWM_CH1_MASK);
  76.         Cy_TCPWM_TriggerReloadOrIndex(PWM_CH1_HW, PWM_CH1_MASK);

  77.         /* Infinite loop */
  78.         for (;;) {
  79.                 /* Put the CPU into sleep mode to save power */
  80.                 Cy_SysPm_CpuEnterSleep();
  81.         }
  82. }
在主函数中完成调用、编译、下载、观察LED灯。毫无意外,啥也看不出来了。只能上示波器了。通过示波器可以观察到PSOC 4000T轻松输出两路PWM波。两路PWM的占空比分别为50%和25%,这里特别提示一下,PWM两路均支持互补输出,可以支持更高级的电机控制,我们通过示波器来观察一下PWM波输出特性:




对于抽油烟机的两大主要功能:触摸按键和两路PWM输出的实验,我们现在分别完成了原型设计验证,接下来我们全新开发一套抽油烟机触控面板的工程原型吧!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
星辰大海不退缩 发表于 2025-5-26 16:22 | 显示全部楼层
抽油烟机是PWM控制精准
 楼主| lemonboard 发表于 2025-5-26 22:35 | 显示全部楼层

普通款只是PWM的简单档位制的控制。如快档,慢档。
精准控制还比较远
小夏天的大西瓜 发表于 2025-5-27 09:57 | 显示全部楼层
学习到了
封存into 发表于 2025-5-29 17:20 | 显示全部楼层
方波很漂亮啊,没有过冲和下冲
喂什么玩意 发表于 2025-6-29 00:56 | 显示全部楼层
核心优势在于专利的电容式触控技术
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

206

帖子

0

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

3

主题

206

帖子

0

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