一,STM32CubeMX配置
1,GPIO配置成触摸功能

硬件链接

TSC_G1_IO1连接触摸电容,其他三个作为触摸按键。
2,TSC配置
软件配置三个触摸通道
控制参数配置,我们保持默认
3,TOUCHSENSING中间件配置

中间件帮我们进一步封装了基础操作,使我们只需要调用一两个函数就可以实现相应的功能。
我们保持默认配置
二,生成代码
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,这些概念要熟悉一下。


STM32触摸感应特性以电荷转移为基础。表面电荷转移采集原理包括将传感器电容(Cx)充电和将累积电荷转移至采样电容(Cs)。此过程不断重复,直至Cs两侧电压达到VIH。达到阈值所需的电荷转移次数直接表示电极电容的大小。当传感器被触摸时,传感器对地电容增大。这意味着C电压达到VIH所需的电荷转移次数减少,测量值变小。当此测量值低于阈值时,TSL报告检测。下图为没有考虑寄生电容的原理图。
四,STM32CubeMX中的配置解释:
Charge Transfer High Pulse Length: 充电脉冲高电平时间
Charge Transfer Low Pulse Length:充电脉冲低电平时间
触摸传感器工作时,先通过内部基准源对按键电容 Cx 充电,然后再对采样电容 Cs 放电。
这是一个充放电的电荷传输过程。为了保证更精确的测量 Cx 的值,需要保证每次给 Cx
时,Cx 的电压要达到基准源的电压值。所以需要保证充电的开启时间要满足充电的条
件。充电充分时按键电极上的波形应该如下图所示:


Spread Spectrum:展频
如果想要增强触摸传感器的抗干扰能力,可以通过使能扫描时钟扩频功能。使能扩频后,
通过设置时钟抖动范围来设置扩频的范围。打开扩频功能后,由于随机性的增加或者减
少扫描时钟的高低电平宽度,扫描时钟基频也不再固定,将在基频附近上下随机变化,
这样就达到了扩频的效果。
Pulse Generator Prescaler: 时钟分频
建议时钟频率:32-48 MHz, 通过Pulse Generator Prescaler分频。
频率也会影响电容充放电是否充分。
IO Default Mode:
定义了触摸感应控制器在非激活状态(未进行电容测量时)下I/O引脚的工作模式。
Acquisition Mode: 采集模式
触摸中间件的相关配置解释如下:

①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 的本质:把“不能同时扫描的电极”分成不同时间片扫描。

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(杂项)
五,架构

应用层对应的就是tsl_user.c ,tsl_user.h 这两个文件
STM32CubeMX配置项主要是写入到 tsl_conf.h 对中间件的参数进行配置
六,测试
程序运转起来后,可以检测到按键触摸了,但是如何知道当前触摸的硬件和软件参数是否合适,也就是说检测是检测到了,但是检测质量如何?
1,硬件测量
在实际的应用中,我们需要在所有硬件组装完成后的环境下测试按键充电的情况。可以
通过一枚小的金属硬币,覆盖在按键区域,通过示波器探针点在硬币上来观察波形
但是我实测,这样效果并不好,我还是直接戳破按键表层油漆直接测量,不知道你的测量效果怎么样。如前所述,充电充分的波形是下面这样的
2,软件监测

命名规则:

所有模块使用的类型都在tsl_types.h文件中定义。其他变量类型在其对应的模块头文件中定义。
需要观察的STMTouch触摸传感库变量的部分列表:
TSL_ChannelData_T :通道测量值、参考值和增量,这些变量有助于调整阈值参数。
TSL_TouchKeyData_T 和 TSL_LinRotData_T :传感器状态结构,有助于调整防抖动、ECS 和 DTO 参数。
TSL_LinRotData_T :线性和旋转触摸传感器位置。
可以通过STMStudio上位机软件监测这些变量的数值

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

扫码关注










































