文章目录
由于一些特殊原因:
系列文章链接:(其他系列文章,请点击链接,可以跳转到其他系列文章)或者参考我的专栏“ 瑞萨MCU ”,里面是 瑞萨RA2E1 系列文章。
24.RA2E1的 DMAC——数据传输
25.RA2E1的 DTC传输模式
26.瑞萨RA Cortex-M 内核RA2E1 & RT-Thread BSP 启蒙知识
文章目录
文章目录
一、电容触摸按键是什么?原理?
二、开发步骤
1.硬件图
2.新建工程
3.FSP配置
以上,就可以那e2-stdio控制触摸按键了。
四、keil的触摸按键设置
复制文件
五、代码编写
雨后终现彩虹
前言
电容式感应触摸按键可以穿透绝缘材料外壳 8mm (玻璃、塑料等等)以上,准确无误地侦测到手指的有效触摸。 并保证了产品的灵敏度、稳定性、可靠性等不会因环境条件的改变或长期使用而发生变化,并具有防水和强抗干扰能力。
一、电容触摸按键是什么?原理?
瑞萨的芯片内部集成高分辨率触摸检测模块CTSU和专用信号处理电路,以保证芯片对环境变化具有灵敏的自动识别和跟踪功能。 芯片还必须满足用户在复杂应用中对稳定性、灵敏度、功耗、响应速度、防水等方面的高体验要求。 电容式触摸按键控制芯片通常广泛适用于遥控器、灯具调光、各类开关以及车载、小家电和家用电器控制界面等应用中。 在芯片应用的开发过程非常简单,可以最大限度的降低方案成本。
原理:
在开发板未上电时,可以认为电容Cx是没有电荷的,在上电时,在电阻作用下,电容Cx就会有一个充电过程,直到电容充满,即Vc电压值为3.3V,这个充电过程的时间长短受到电阻R阻值和电容Cx容值的直接影响。但是在我们选择合适电阻R并焊接固定到电路板上后,这个充电时间就基本上不会变了,因为此时电阻R已经是固定的,电容Cx在无外界明显干扰情况下基本上也是保持不变的。
此时整个电容按键可以容纳的电荷数量就比没有手指触摸时要多了,可以看成是Cx和Cs叠加的效果。在相同的电阻R情况下,因为电容容值增大了,导致需要更长的充电时间。也就是这个充电时间变长使得我们区分有无手指触摸,也就是电容按键是否被按下。
现在最主要的任务就是测量充电时间。充电过程可以看出是一个信号从低电平变成高电平的过程,现在就是要求出这个变化过程的时间。我们可以利用定时器输入捕获功能计算充电时间,即设置TIMx_CH为定时器输入捕获模式通道。这样先测量得到无触摸时的充电时间作为比较基准,然后再定时循环测量充电时间与无触摸时的充电时间作比较,如果超过一定的阈值就认为是有手指触摸。
二、开发步骤
1.硬件图
电容按键不需要任何外部机械部件,使用方便,成本低,很容易制成与周围环境相密封的键盘,以起到防潮防湿的作用。
2.新建工程
对于 Keil 开发环境:
拷贝一份我们之前的 Keil 工程模板 “RA_UART”, 然后将工程文件夹重命名为 “RA_BTN”,并进入该文件夹里面双击 Keil 工程文件,打开该工程。
3.FSP配置
依次点击 Stacks -> New Stack -> CapTouch -> TOUCH
点击模块 CTSU 模块
配置CTSU模块引脚
打开e2-stdio,配置QE for Capacitive Touch:
如图所示(我们并没有找到 QE for Capacitive Touch )
点击 e2 studio 上方的 Renesas Views 之后依次点击 Renesas QE -> CapTouch Main (QE)。
解决以上没有 CapTouch Main (QE)。 这个问题如下:
选择如图所示的 “瑞萨软件安装程序” 进去之后 安装QE for Capacitive Touch:
正常安装之后,重启软件,会发现多了很多选项:
Renesas QE -> CapTouch Workflow(QE)。即可打开如下图所示:
注意:
有些版本打开之后 不是CapTouch Workflow(QE) 而是 CapTouch Main(QE) 这是等同效果
如果安装之后啥也没有,建议重新换e2-stdio版本重新安装,反复重试,一定会有。
在Select a Prodect 中选择自己的工程:
在 Prepare a Configuration 中设置按键:
双击可以选中,修改按键的属性:如下图所示
下一步:点击Start Turning:
点击完之后,就会出现如上图所示,现在提示将您的小爪子,按在你初始化过的触摸按键上,按上不要放开哦,然后在电脑键盘上随便按个键,就会得到如下图所示:
点击 “ Continue the Tuning Process ” 即 这个时候我们的配置文件就配置好了
可以发现前三个已经初始化好了,现在可以点击第四个“Output Parameter Files”:
会生成如图文件:
注意:在我们没有点击 start Tuning 进行调谐此时 Output Parameter Files 按钮显示灰色, 这个时候我们是点击不了 Output Parameter Files 输出参数文件,我们可以先点击 start Tuning 进行调谐后进行参数文件的输出。
下一步:“Output to a file”:
此时就会发现:
到达此步,说明你已经配置好了,触摸按键。再进行调试。
将函数调入此处。
void hal_entry(void)
{
/* TODO: add your own code here */
qe_touch_main(); //跳转到电容按键函数
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
继续打开,CapTouch Status 窗口如下,可以通过Touch I/F 选择触摸通道。
通过 Renesas View -> Renesas QE -> CapTouch Multi Status Chart,打开多路触摸检测窗口。同理可以打开CapTouch Pad Monitor检测窗口。
点击按键,即可看到按键的阈值,和测量值。
以上,就可以那e2-stdio控制触摸按键了。
四、keil的触摸按键设置
总结来说就是将电容按键e2-stdio生成的文件复制到keil工程文件夹里面。
双击 configuration.xml 打开配置界面: 然后点开依次点击 Stacks -> New Stack -> CapTouch -> TOUCH 来配置CTSU模块。
之后选择对应的引脚
配置LED引脚
配置完成之后可以按下快捷键“Ctrl + S”保存, 最后点右上角的 “Generate Project Content” 按钮,让软件自动生成配置代码即可。
复制文件
我们在keil里面创建一个 qe_gen 文件夹,将之前在 e2 studio 项目里生成的 qe_gen 文件夹里的文件复制到keil的文件夹里面, 之后我们将文件目录导入到项目里。
第一步我们点击 Options for Target ‘Target 1’ ,将添加的文件夹目录导入到工程里。
五、代码编写
主函数
void hal_entry(void)
{
qe_touch_main(); //跳转到电容按键函数
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
qe_sample_main
/***********************************************************************
*
* FILE : qe_sample_main.c
* DATE : 2022-02-14
* DESCRIPTION : Main Program for RA
*
* NOTE:THIS IS A TYPICAL EXAMPLE.
*
***********************************************************************/
#include "qe_touch_config.h"
#define TOUCH_SCAN_INTERVAL_EXAMPLE (20) /* milliseconds */
void qe_touch_main(void);
uint64_t button_status;
#if (TOUCH_CFG_NUM_SLIDERS != 0)
uint16_t slider_position[TOUCH_CFG_NUM_SLIDERS];
#endif
#if (TOUCH_CFG_NUM_WHEELS != 0)
uint16_t wheel_position[TOUCH_CFG_NUM_WHEELS];
#endif
void qe_touch_main(void)
{
fsp_err_t err;
/* Open Touch middleware */
err = RM_TOUCH_Open(g_qe_touch_instance_config01.p_ctrl, g_qe_touch_instance_config01.p_cfg);
if (FSP_SUCCESS != err)
{
while (true) {}
}
/* Main loop */
while (true)
{
/* for [CONFIG01] configuration */
err = RM_TOUCH_ScanStart(g_qe_touch_instance_config01.p_ctrl);
if (FSP_SUCCESS != err)
{
while (true) {}
}
while (0 == g_qe_touch_flag) {}
g_qe_touch_flag = 0;
err = RM_TOUCH_DataGet(g_qe_touch_instance_config01.p_ctrl, &button_status, NULL, NULL);
if (FSP_SUCCESS == err)
{
/* TODO: Add your own code here. */
if ( button_status & CONFIG01_MASK_BTN1)
{
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_HIGH);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_LOW);
}
else if ( button_status & CONFIG01_MASK_BTN2)
{
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_LOW);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_HIGH);
}
else if ( button_status & CONFIG01_MASK_BTN3)
{
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_HIGH);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_HIGH);
}
else
{
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_LOW);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_LOW);
}
}
/* FIXME: Since this is a temporary process, so re-create a waiting process yourself. */
R_BSP_SoftwareDelay(TOUCH_SCAN_INTERVAL_EXAMPLE, BSP_DELAY_UNITS_MILLISECONDS);
}
}
终于解决,很多关于一些配置的问题,确实感觉很麻烦,且找不到一些资源学习,希望这篇文章能够帮助到大家。