0
收藏
微博
微信
复制链接

STM32自带的触摸控制原理与触摸按键应用

2026-08-10 17:15
29

一,STM32CubeMX配置

1,GPIO配置成触摸功能

7b2203adb67b1264d5e1046a585f5e.jpg

硬件链接

c662824d84ebec3744fbf9dae4b5ef.jpg

TSC_G1_IO1连接触摸电容,其他三个作为触摸按键。

2,TSC配置

bf01bbb65ef8fdc2f771b0421d88b5.jpg软件配置三个触摸通道6837e7e09f3847d19a63f0805e3e31.jpg

控制参数配置,我们保持默认


3,TOUCHSENSING中间件配置

c91825dde9f54296c650dc184587d7.jpg


中间件帮我们进一步封装了基础操作,使我们只需要调用一两个函数就可以实现相应的功能。

我们保持默认配置

二,生成代码0adcc24748f1913b57e29422eb01f3.jpg

STM32CubeMX配置后导出的触摸相关中间件代码如上图所示

我们主要用到的是下面这两个文件

tsl_user.c 

tsl_user.h    

配置   数据是下面这两个文件

 tsl_conf.h 

 tsl.c 

TSC 硬件采集层是这两个文件

tsl_acq_tsc.c

tsl_acq_tsc.h


tsl_user.c 中一个是初始化函数,在生成代码时已经自动调用了,

我们需要在我们编写的代码中不断的调用下面这个函数

tsl_user_Exec();

他主要是判断是否需要扫描、切换 Bank以及更新触摸检测的状态机。

调用代码如下:

void Key_Task(void)

{

if(tsl_user_Exec() == TSL_STATUS_OK)

{

if(MyTKeys[0].p_Data->StateId == TSL_STATEID_DETECT)

{

printf("Key1 pressed\r ");

}

else if(MyTKeys[1].p_Data->StateId == TSL_STATEID_DETECT)

{

printf("Key2 pressed\r ");

}

else if(MyTKeys[2].p_Data->StateId == TSL_STATEID_DETECT)

{

printf("Key3 pressed\r ");

}

}

}


while(1)

{


    void Key_Task(void);


}

到此,可以检测到每个按键按下,是不是很简单。


三,原理

首先说了如何实现我们想要的触摸检测功能,再来说说一些原理和细节。

后台回复:“STM32触摸

获取《基于STM32 微控制器的触摸感应控制入门》

该文档是中文官方文档,有入门内容的详细介绍。如下主要是对官方文档的一些总结。

什么是TSC、组、通道、组合、单通道TKEY、Delta、测量值、参考值、DTO、DXS、ECS,这些概念要熟悉一下。

747e91f5bfbdf51b619271470b75de.jpg6d09a09ab7f22a13f758a1d00ca74f.jpg
STM32触摸感应特性以电荷转移为基础。表面电荷转移采集原理包括将传感器电容(Cx)充电和将累积电荷转移至采样电容(Cs)。此过程不断重复,直至Cs两侧电压达到VIH。达到阈值所需的电荷转移次数直接表示电极电容的大小。当传感器被触摸时,传感器对地电容增大。这意味着C电压达到VIH所需的电荷转移次数减少,测量值变小。当此测量值低于阈值时,TSL报告检测。下图为没有考虑寄生电容的原理图。98168615e69a487833a4654ef34063.jpg四,STM32CubeMX中的配置解释:6837e7e09f3847d19a63f0805e3e31.jpg

Charge Transfer High Pulse Length: 充电脉冲高电平时间

Charge Transfer Low Pulse Length充电脉冲低电平时间

触摸传感器工作时,先通过内部基准源对按键电容 Cx 充电,然后再对采样电容 Cs 放电。

这是一个充放电的电荷传输过程。为了保证更精确的测量 Cx 的值,需要保证每次给 Cx

时,Cx 的电压要达到基准源的电压值。所以需要保证充电的开启时间要满足充电的条

件。充电充分时按键电极上的波形应该如下图所示:

6ea06378fbfad5c5c661c6eca48d16.jpg5c6069624ae5654183f5ad4771bb14.jpg

Spread Spectrum:展频

如果想要增强触摸传感器的抗干扰能力,可以通过使能扫描时钟扩频功能。使能扩频后,

通过设置时钟抖动范围来设置扩频的范围。打开扩频功能后,由于随机性的增加或者减

少扫描时钟的高低电平宽度,扫描时钟基频也不再固定,将在基频附近上下随机变化,

这样就达到了扩频的效果。

Pulse Generator Prescaler 时钟分频

建议时钟频率:32-48 MHz, 通过Pulse Generator Prescaler分频。

频率也会影响电容充放电是否充分。

IO Default Mode

定义了触摸感应控制器在非激活状态(未进行电容测量时)下I/O引脚的工作模式。

Acquisition Mode:   采集模式


触摸中间件的相关配置解释如下:

c91825dde9f54296c650dc184587d7.jpg

①Summary(汇总信息)

  • 总共有 3 个触摸对象

  • 从下面配置看,这 3 个对象全部是 TouchKey


TSLPRM_TOTAL_OBJECTS = 3

含义:

  • 系统中定义的 触摸对象(Touch Object)总数

  • 一个 Object 可以是:

    • 一个 TouchKey(按键)

    • 一个 Linear Slider(滑条)

    • 一个 Rotary Wheel(旋钮)


TSC_ACTIVE_CHANNELS = max(TSLPRM_TOTAL_CHANNELS) = 3

含义:

  • TSC 外设实际参与扫描的通道数量

  • 这个值是自动计算的,等于你用到的最多通道数


TSLPRM_TOTAL_CHANNELS = 3

含义:

  • 触摸电极(Channel)的总数量

  • 一个 Channel 对应一个采样电极(一个触摸 IO)


②Linear / Rotary sensors used(线性 / 旋转传感器)

这一整块用于 滑条(Linear)和旋钮(Rotary) 的配置。

  • TSLPRM_USE_3CH_LIN_M1

  • TSLPRM_USE_4CH_ROT_M

  • TSLPRM_USE_5CH_LIN_H

这些是什么意思?

这是中间件内部算法模板选择开关,表示:

是否启用某种 “通道数量   对象类型   算法模式” 的预定义实现

拆开理解(以 TSLPRM_USE_3CH_LIN_M1 为例):

  • 3CH:3 个通道

  • LIN:线性滑条

  • M1:算法模式 1(中等精度)

常见后缀含义:

  • LIN:线性滑条

  • ROT:旋转

  • M1 / M2 / M / H / D:

    • 不同的插值算法和滤波复杂度

    • 精度、抗干扰能力、CPU 占用不同


③TouchKey sensors(触摸按键)

1. TSLPRM_TOTAL_TOUCHKEYS = 32. TSLPRM_TOTAL_TOUCHKEYS_B = 0

STM32 触摸中间件支持:

  • Single Bank

  • Dual Bank(A / B)

这里的TSLPRM_TOTAL_TOUCHKEYS_B 就是双Bank

Bank 的意义:

  • 用于:

    • 分时扫描

    • 降低串扰

    • 优化扫描时序

  • 对简单应用来说:

    • 用一个 Bank 完全没问题


单BANK

时间轴 →

[ CH1 ][ CH2 ][ CH3 ][ CH4 ]   ← 全部在 Bank A

  • 所有电极共用一个扫描周期

  • 结构简单

  • 扫描周期 = 所有通道扫描时间之和


双 BANK(Dual Bank)

时间轴 →
[ CH1 ][ CH2 ]    ← Bank A
[ CH3 ][ CH4 ] ← Bank B

特点:

  • Bank A 和 Bank B 分时轮流扫描

  • 同一 Bank 内的通道仍是顺序扫描

  • 不同 Bank 之间 电气上、时间上隔离


所以:

  • 少量按键 → 单 Bank 即可

  • 多电极 / EMC 严苛 → 合理拆分 A/B

Bank 的本质:把“不能同时扫描的电极”分成不同时间片扫描。

bf44c076fdf96ff4cf7eb363ac9f38.jpg

Optional features(可选功能)

TSLPRM_USE_PROX = 1

含义:

  • 使能 接近检测(Proximity)

  • 在“真正触摸”之前,先进入 PROX 状态


Acquisition limits(采样范围)

Calibration(校准参数)

TouchKey 阈值

DETECT(触摸)阈值TSLPRM_TKEY_DETECT_IN_TH = 120TSLPRM_TKEY_DETECT_OUT_TH = 110

含义:

  • Δ ≥ 120 → 确认触摸

  • Δ ≤ 110 → 释放


Linear / Rotary 阈值

Linear / Rotary 位置参数

1.TSLPRM_LINROT_RESOLUTION = 4

含义:

  • 输出位置分辨率

  • 实际输出点数 = 2⁴ = 16

2. TSLPRM_LINROT_DIR_CHG_POS = 1

  • 是否检测方向变化

  • 1 = 开启

3. TSLPRM_LINROT_DIR_CHG_DEB = 1

含义:

  • 方向变化的去抖计数

  • 范围:0~63

越大:

  • 方向判断越稳

  • 响应越慢


Debounce counters(去抖计数器)

ECS(Environment Change System)抗环境变化

DTO(Detection Time Out)

Miscellaneous(杂项)


五,架构

a528f434e4c160bb94bbe40396fb1e.jpg

应用层对应的就是tsl_user.c ,tsl_user.h  这两个文件

STM32CubeMX配置项主要是写入到 tsl_conf.h 对中间件的参数进行配置

六,测试

  程序运转起来后,可以检测到按键触摸了,但是如何知道当前触摸的硬件和软件参数是否合适,也就是说检测是检测到了,但是检测质量如何?

1,硬件测量

在实际的应用中,我们需要在所有硬件组装完成后的环境下测试按键充电的情况。可以

通过一枚小的金属硬币,覆盖在按键区域,通过示波器探针点在硬币上来观察波形

ae1858381f903ee32fce45710b7703.jpg但是我实测,这样效果并不好,我还是直接戳破按键表层油漆直接测量,不知道你的测量效果怎么样。如前所述,充电充分的波形是下面这样的6ea06378fbfad5c5c661c6eca48d16.jpg

2,软件监测

8d0853acfbf1e60e5bb8d1b903e5bc.jpg

命名规则:

7c46feeb766381c1f7be78002cfded.jpg

  所有模块使用的类型都在tsl_types.h文件中定义。其他变量类型在其对应的模块头文件中定义。

  需要观察的STMTouch触摸传感库变量的部分列表:

   TSL_ChannelData_T :通道测量值、参考值和增量,这些变量有助于调整阈值参数。

  TSL_TouchKeyData_T  和  TSL_LinRotData_T :传感器状态结构,有助于调整防抖动、ECS  和  DTO  参数。

  TSL_LinRotData_T  :线性和旋转触摸传感器位置。

  可以通过STMStudio上位机软件监测这些变量的数值

939de17953e68048f92ceeddd1f388.jpg

不过该软件官方已经不更新了,推荐的替换软件是STM32CubeMonitor。但是这个软件似乎有点复杂,还有待研究。



登录后查看更多
0
评论 0
收藏
侵权举报
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表凡亿课堂立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。

热门评论0

相关文章

大国物联网

专注于电子产品的硬件和单片机软件及嵌入式软件的开发研究。

开班信息