结合前述分享,本篇提交作品:基于PSOC™ 4100S Max的电机触控及屏显系统。
基本架构如图:
其中:
触摸按钮用到了板载的 BTN0和BTN1触摸按钮
TFT-LCD使用基于SPI协议驱动的屏幕
电机驱动板使用基于L9110S芯片的直流电机驱动板,如下图:
电路如下图,MCU通过两个IO口(本例P8.0、P8.1)控制电机正反转。
控制逻辑如下图:
IA=H;IB=0 正转
IA=0;IB=H 反转
配置好硬件,我们着手软件的编写:
main函数,主要进行初始化设置、IO设置,屏幕初始化、显示“Infineon”LOGO,然后进入循环。
int main(void)
{
cy_rslt_t result = CY_RSLT_SUCCESS;
/* Initialize the device and board peripherals */
result = cybsp_init();
/* Board init failed. Stop program execution */
if (result != CY_RSLT_SUCCESS)
{
CY_ASSERT(CY_ASSERT_FAILED);
}
/* Enable global interrupts */
__enable_irq();
/* Initialize EZI2C */
initialize_capsense_tuner();
/* Initialize MSC CapSense */
initialize_capsense();
#if CY_CAPSENSE_BIST_EN
/* Measure the self capacitance of sensor electrode using BIST */
measure_sensor_cp();
#endif /* CY_CAPSENSE_BIST_EN */
/* Start the first scan */
Cy_CapSense_ScanAllSlots(&cy_capsense_context);
Cy_GPIO_Pin_FastInit(GPIO_PRT1,2u,CY_GPIO_DM_PULLDOWN,0,0);
Cy_GPIO_Pin_FastInit(GPIO_PRT1,3u,CY_GPIO_DM_PULLDOWN,0,0);
Cy_GPIO_Pin_FastInit(GPIO_PRT1,4u,CY_GPIO_DM_PULLDOWN,0,0);
Cy_GPIO_Pin_FastInit(GPIO_PRT1,5u,CY_GPIO_DM_PULLDOWN,0,0);
Cy_GPIO_Pin_FastInit(GPIO_PRT1,6u,CY_GPIO_DM_PULLDOWN,0,0);
Lcd_Init(); //初始化LCD
delayms(10); //延时一段时间
Lcd_Clear(black );
Show_RGB(0,0,176,44,blue);
Show_RGB(0,44,176,88,green);
Show_RGB(0,88,176,132,magenta);
Show_RGB(0,132,176,176,red);
Show_RGB(0,176,176,220,yellow);
Show_RGB(0,0,176,44,yellow);
Show_RGB(0,44,176,88,red);
Show_RGB(0,88,176,132,blue2);
Show_RGB(0,132,176,176,green);
Show_RGB(0,176,176,220,blue);
delayms(10); //延时一段时间
showimage(gImage_infineon);
Cy_GPIO_Pin_FastInit(GPIO_PRT8,0u,CY_GPIO_DM_PULLUP,0,0);
Cy_GPIO_Pin_FastInit(GPIO_PRT8,1u,CY_GPIO_DM_PULLUP,0,0);
for (;;)
{
if(CY_CAPSENSE_NOT_BUSY == Cy_CapSense_IsBusy(&cy_capsense_context))
{
/* Process all widgets */
Cy_CapSense_ProcessAllWidgets(&cy_capsense_context);
/* Turns LED ON/OFF based on button status */
led_control();
/* Establishes synchronized communication with the CapSense Tuner tool */
Cy_CapSense_RunTuner(&cy_capsense_context);
/* Start the next scan */
Cy_CapSense_ScanAllSlots(&cy_capsense_context);
/* Toggles GPIO for refresh rate measurement. Probe at P10.4. */
Cy_GPIO_Inv(CYBSP_SENSE_SCAN_RATE_PORT, CYBSP_SENSE_SCAN_RATE_NUM);
}
}
}
在led_control函数中,添加电机控制的代码以及屏幕显示代码。
按下BTN0,IA拉高(默认IA、IB都是0),电机顺时针旋转,并显示顺时针文字(实际是图片)。
松开时,IA=0,电机不转。
按下BTN1,IB拉高(默认IA、IB都是0),电机逆时针旋转,并显示逆时针文字(实际是图片)。
松开时,IB=0,电机不转。
static void led_control(void)
{
if(MSC_CAPSENSE_WIDGET_INACTIVE != Cy_CapSense_IsWidgetActive(CY_CAPSENSE_BUTTON0_WDGT_ID, &cy_capsense_context))
{
Cy_GPIO_Write(CYBSP_LED_BTN0_PORT, CYBSP_LED_BTN0_NUM, CYBSP_LED_STATE_ON);
Cy_GPIO_Set(GPIO_PRT8,0u);
showimage1(gImage_shun);
}
else
{
Cy_GPIO_Write(CYBSP_LED_BTN0_PORT, CYBSP_LED_BTN0_NUM, CYBSP_LED_STATE_OFF);
Cy_GPIO_Clr(GPIO_PRT8,0u);
}
if(MSC_CAPSENSE_WIDGET_INACTIVE != Cy_CapSense_IsWidgetActive(CY_CAPSENSE_BUTTON1_WDGT_ID, &cy_capsense_context))
{
Cy_GPIO_Write(CYBSP_LED_BTN1_PORT, CYBSP_LED_BTN1_NUM, CYBSP_LED_STATE_ON);
Cy_GPIO_Set(GPIO_PRT8,1u);
showimage1(gImage_ni);
}
else
{
Cy_GPIO_Write(CYBSP_LED_BTN1_PORT, CYBSP_LED_BTN1_NUM, CYBSP_LED_STATE_OFF);
Cy_GPIO_Clr(GPIO_PRT8,1u);
}
}
顺时针:
逆时针:
演示视频1
电机触控1
演示视频2
电机触控2
本次分享就到这里,谢谢!