【英飞凌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将为我们自动生成代码。 const cy_stc_tcpwm_pwm_config_t PWM_CH0_config =
{
.pwmMode = CY_TCPWM_PWM_MODE_PWM,
.clockPrescaler = CY_TCPWM_PWM_PRESCALER_DIVBY_1,
.pwmAlignment = CY_TCPWM_PWM_LEFT_ALIGN,
.deadTimeClocks = 0,
.runMode = CY_TCPWM_PWM_CONTINUOUS,
.period0 = 4799,
.period1 = 32768,
.enablePeriodSwap = false,
.compare0 = 2400,
.compare1 = 16384,
.enableCompareSwap = false,
.interruptSources = CY_TCPWM_INT_NONE,
.invertPWMOut = CY_TCPWM_PWM_INVERT_DISABLE,
.invertPWMOutN = CY_TCPWM_PWM_INVERT_DISABLE,
.killMode = CY_TCPWM_PWM_STOP_ON_KILL,
.swapInputMode = PWM_CH0_INPUT_DISABLED & 0x3U,
.swapInput = CY_TCPWM_INPUT_0,
.reloadInputMode = PWM_CH0_INPUT_DISABLED & 0x3U,
.reloadInput = CY_TCPWM_INPUT_0,
.startInputMode = PWM_CH0_INPUT_DISABLED & 0x3U,
.startInput = CY_TCPWM_INPUT_0,
.killInputMode = PWM_CH0_INPUT_DISABLED & 0x3U,
.killInput = CY_TCPWM_INPUT_0,
.countInputMode = PWM_CH0_INPUT_DISABLED & 0x3U,
.countInput = CY_TCPWM_INPUT_1,
};
const cy_stc_tcpwm_pwm_config_t PWM_CH1_config =
{
.pwmMode = CY_TCPWM_PWM_MODE_PWM,
.clockPrescaler = CY_TCPWM_PWM_PRESCALER_DIVBY_1,
.pwmAlignment = CY_TCPWM_PWM_LEFT_ALIGN,
.deadTimeClocks = 0,
.runMode = CY_TCPWM_PWM_CONTINUOUS,
.period0 = 4799,
.period1 = 32768,
.enablePeriodSwap = false,
.compare0 = 1200,
.compare1 = 16384,
.enableCompareSwap = false,
.interruptSources = CY_TCPWM_INT_NONE,
.invertPWMOut = CY_TCPWM_PWM_INVERT_DISABLE,
.invertPWMOutN = CY_TCPWM_PWM_INVERT_DISABLE,
.killMode = CY_TCPWM_PWM_STOP_ON_KILL,
.swapInputMode = PWM_CH1_INPUT_DISABLED & 0x3U,
.swapInput = CY_TCPWM_INPUT_0,
.reloadInputMode = PWM_CH1_INPUT_DISABLED & 0x3U,
.reloadInput = CY_TCPWM_INPUT_0,
.startInputMode = PWM_CH1_INPUT_DISABLED & 0x3U,
.startInput = CY_TCPWM_INPUT_0,
.killInputMode = PWM_CH1_INPUT_DISABLED & 0x3U,
.killInput = CY_TCPWM_INPUT_0,
.countInputMode = PWM_CH1_INPUT_DISABLED & 0x3U,
.countInput = CY_TCPWM_INPUT_1,
};
int main(void) {
cy_rslt_t result;
/* Initialize the device and board peripherals */
result = cybsp_init();
if (result != CY_RSLT_SUCCESS) {
CY_ASSERT(0);
}
/* Enable global interrupts */
__enable_irq();
/* Initialize, enable, and start the PWM component.
* To see all pre-defined parameters such as <Instance_Name>_Mask/Num
* or PWM_config see cycfg_peripherals.h under generated sources.
*/
(void) Cy_TCPWM_PWM_Init(PWM_CH0_HW, PWM_CH0_NUM, &PWM_CH0_config);
Cy_TCPWM_Enable_Multiple(PWM_CH0_HW, PWM_CH0_MASK);
Cy_TCPWM_TriggerReloadOrIndex(PWM_CH0_HW, PWM_CH0_MASK);
(void) Cy_TCPWM_PWM_Init(PWM_CH1_HW, PWM_CH1_NUM,
&PWM_CH1_config);
Cy_TCPWM_Enable_Multiple(PWM_CH1_HW, PWM_CH1_MASK);
Cy_TCPWM_TriggerReloadOrIndex(PWM_CH1_HW, PWM_CH1_MASK);
/* Infinite loop */
for (;;) {
/* Put the CPU into sleep mode to save power */
Cy_SysPm_CpuEnterSleep();
}
}
在主函数中完成调用、编译、下载、观察LED灯。毫无意外,啥也看不出来了。只能上示波器了。通过示波器可以观察到PSOC 4000T轻松输出两路PWM波。两路PWM的占空比分别为50%和25%,这里特别提示一下,PWM两路均支持互补输出,可以支持更高级的电机控制,我们通过示波器来观察一下PWM波输出特性:
对于抽油烟机的两大主要功能:触摸按键和两路PWM输出的实验,我们现在分别完成了原型设计验证,接下来我们全新开发一套抽油烟机触控面板的工程原型吧!
|