(续ARM单片机触摸传感器原理和应用(2))
有源屏蔽示例
以下是在触摸系统中使用有源屏蔽的示例
• 第1组屏蔽
- G1_IO1 连接到 Csshield(芯片屏蔽)
- G1_IO2 连接到 Rsshield 和屏蔽铜片
• 第2组传感器
- G2_IO1 连接到 Cskey2(键2的芯片)
- G2_IO2 连接到 Rskey22 和传感器(键22)
- G2_IO3 连接到 Rskey23 和传感器(键23)
- G2_IO4 连接到 Rskey24 和传感器(键24)
• 第3组传感器
- G3_IO1 连接到 Cskey3(键3的芯片)
- G3_IO2 连接到 Rskey32 和传感器(键32)
- G3_IO3 连接到 Rskey33 和传感器(键33)
- G3_IO4 连接到 Rskey34 和传感器(键34)
• 第4组传感器
- G4_IO1 连接到 Cskey4(键4的芯片)
- G4_IO2 连接到 Rskey42 和传感器(键42)
- G4_IO3 连接到 Rskey43 和传感器(键43)
- G4_IO4 连接到 Rskey44 和传感器(键44)
要获取键22至键44的状态,使用以下内存分区:
- 分区1 用于获取键22、键32和键42的状态ID
- 分区2 用于获取键23、键33和键43的状态ID
- 分区3 用于获取键24、键34和键44的状态ID
通过这种存储器映射,Rsxx(电阻引脚)和Csxx(芯片选择引脚)上的波形是下面图表中给出的波形。
图14. 采样电容器上的波形
图15. Csshield上的波形
为了提高传导噪声的免疫力,以下Rs和Cs的值可以提供良好的性能:
• Csshield = 100纳法拉(nF)(根据本节前面的解释进行调整)
• Rsshield = 1千欧姆(kΩ)(根据本节前面的解释进行调整)
• Cskeyx = 47纳法拉(nF)
• Rskeyxx = 10千欧姆(kΩ)
图16. G2_IO2、G3_IO2 和 G4_IO2 上的波形
图17. G2_IO3、G3_IO3 和 G4_IO3 上的波形
图18. G2_IO4、G3_IO4 和 G4_IO4 上的波形
4.2.2展宽频谱
如果不使用展宽频谱,主要的噪声敏感性会在获取频率处发现,其值为 1/TCD(TCD 传输周期时长)。
ARM MCUs(微控制器单元)中的主要频率(HCLK)来自 PLL(锁相环)输出。为了提供最优的响应时间,推荐使用规格书中建议的最高频率。
MCU主频率在TSC单元中通过可编程预分频器(PGCLK)进行分频。分频后的时钟频率决定了CTPH(传输周期高)和CTPL(传输周期低)的基本时间单位,如下所示:
传输周期时长 = (1/(PGCLK)) x ((CTPH + 1) + (CTPL + 1)) + (死区时间 = 2 x 1/(HCLK)) 其中死时间为 2
通过启用展宽频谱特性(通过 SSE, 展宽频谱使能),通过向CTPH添加HCLK时间单位(周期)来实现噪声敏感性被分布在多个频率上。
SSD(展宽频谱偏差)允许设置分布频率的数量,如下所示:
从 0(1 x tSSCLK)到 127(128 x tSSCLK)
将 SSD 设置为 32 通常会得到良好的结果。 这一特性的负面影响是降低了获取速度,从而降低了响应时间。例如,SSD 设置为 127 会在每次计数上平均增加 64 x (1/48 MHz) = 1.33 微秒。对于 2000 次计数的获取持续时间,由于展宽频谱的激活,增加了 2.6 毫秒。 通常,最终用户需要的响应时间少于 60 毫秒。
假设应用程序使用三个分区,单独的获取必须在少于 20 毫秒内报告。如果此外还使用了去抖动滤波器(设置为 2),则这个时间限制必须进一步除以三。这导致一次获取的最大目标时间等于 6.6 毫秒。
一次获取时间 = 计数数量 x 传输周期时长(见上面的传输周期时长公式) 要从软件角度激活展宽频谱功能,必须调用 TSL, HAL_TSC_Init,参数如下:
htsc.Instance = TSC;
… htsc.Init.SpreadSpectrum = ENABLE;
htsc.Init.SpreadSpectrumDeviation = 32;
htsc.Init.SpreadSpectrumPrescaler = TSC_SS_PRESC_DIV1;
… if (HAL_TSC_Init(&htsc) != HAL_OK)
{
Error_Handler();
}
其中:
• 展宽频谱偏差是 SSD(当 SSE = 1 时,范围从 1 到 127);
通常设置为 32
• 展宽频谱预分频器是 SSPSC(展宽频谱预分频器);
可以是除以一或除以二。
使用频率跳变时,出于以下原因,建议禁用展宽频谱:
• 展宽频谱减少了噪声应用时的影响,但这种效果适用于更宽的频率范围。
• 当使用频率跳变时,只需要一个获取频率受到噪声的影响。重要的是只有一个获取频率受到一个噪声频率的影响。
• 当噪声频率位于两个获取频率之间时,它不应同时影响它们两个。启用展宽频谱时可能会出现这种情况。
4.2.3 通道阻塞
可以使用以下代码设置检测排除系统(DXS)的TSL参数,以避免多重检测并提高系统级别的安全性:
/*=======================================================================*/ /* Detection Exclusion System (DXS) */ /*=======================================================================*/ /** @defgroup Common_Parameters_DXS 12 - DXS *
@{ */
/** Detection Exclusion System (0=No, 1=Yes) */
#define TSLPRM_USE_DXS (1)
/** @} Common_Parameters_DXS */
DXS 也可以通过设置 THIS_DXSLOCK 对象在组级别进行设置。获取幽灵或保护环传感器的状态级别可以用来在应用层面上暂停剩余传感器的采集。获取幽灵或保护环传感器的状态级别可以用来在应用层面上暂停下一个传感器的采集。
4.2.4 阈值调整
以下两个阈值可以进行调整:
• DETECT_IN:设置检测的阈值,建议设置为使用标准化手指触摸时信号变化量的 2/3
• DETECT_OUT:重置检测的阈值,设置为信号变化量的 1/3 示例:如果触摸时的信号变化量为 150 计数,将 TSLPRM_TKEY_DETECT_IN_TH 设置为 100,将 TSLPRM_TKEY_DETECT_OUT_TH 设置为 50。
这些值可以在了解它们是以下两个要求之间的折衷的情况下进行调整:
• 避免在未触摸的相邻键传感器上产生误检测。
• 避免检测丢失。
为了处理阈值功能,从软件的角度来看,必须考虑两个层面:
• 默认情况下,将所有传感器的阈值定义在 相应的配置头文件中,具体代码如下:
/** TouchKeys Detect state input threshold (range=0..255)
- Enter Detect state if delta is above
*/
#define TSLPRM_TKEY_DETECT_IN_TH (100)
/** TouchKeys Detect state output threshold (range=0..255)
- Exit Detect state if delta is below
*/ #
define TSLPRM_TKEY_DETECT_OUT_TH (50)
• 用户可以使用 API 函数调用,为每个单独的传感器设置阈值,如下所示:
/** * @brief Set thresholds for each object (optional).
* @param None
* @retval None
*/
void tsl_user_SetThresholds(void)
{
/* USER CODE BEGIN Tsl_user_SetThresholds */
/* Example: Adjust on sensor 0, 1 and 2 Detect thresholds */
MyTKeys_Param[0].DetectInTh -= 10;
MyTKeys_Param[0].DetectOutTh += 10;
MyTKeys_Param[1].DetectInTh -= 8;
MyTKeys_Param[1].DetectOutTh += 22;
MyTKeys_Param[2].DetectInTh += 10;
MyTKeys_Param[2].DetectOutTh += 20;
/* USER CODE END Tsl_user_SetThresholds */
}
由于所有传感器的灵敏度并不相同,这个特性可以用来调整传感器的触发水平。
4.2.5 软件滤波器(去抖动)
软件滤波器允许减少误检测或检测丢失。它通过 TSLPRM_DEBOUNCE_DETECT 和 TSLPRM_DEBOUNCE_RELEASE 参数进行配置。
将 TSLPRM_DEBOUNCE_DETECT 参数设置为四或五,意味着需要连续五次采集到触摸检测才能报告触摸检测。
这里存在一个权衡。增加这个参数会导致用户触摸变化发生的时刻与实际报告给系统的时刻之间的响应时间变长。
为了处理去抖动功能,从软件的角度来看,必须考虑两个层面:
• 传导噪声可能会增加或减少“测量,变化量”的值。在配置头文件中,我们需要定义他们( DETECT 和 RELEASE)的值:
/*=======================================================================*/ /* 去抖动计数器 */ /*=======================================================================*/ /** @defgroup Common_Parameters_Debounce 09 - Debounce counters *
@{ */
/** 采样单元接近状态去抖动 (范围=0..63)
- 设置较低的值将在接近检测期间导致更高的灵敏度,但噪声过滤会减少。
- 设置较高的值将提高系统对噪声的免疫力,但会增加系统的响应时间。
*/
#define TSLPRM_DEBOUNCE_PROX (2)
/** 采样单元检测状态去抖动 (范围=0..63)
- 设置较低的值将在接近检测期间导致更高的灵敏度,但噪声过滤会减少。
- 设置较高的值将提高系统对噪声的免疫力,但会增加系统的响应时间。
*/
#define TSLPRM_DEBOUNCE_DETECT (4)
/** 采样单元释放状态去抖动 (范围=0..63)
- 设置较低的值将在接近检测期间导致更高的灵敏度,但噪声过滤会减少。
- 设置较高的值将提高系统对噪声的免疫力,但会增加系统的响应时间。
*/
#define TSLPRM_DEBOUNCE_RELEASE (6)
/** 采样单元重新校准状态去抖动(范围=0..63)
- 一个较低的值将在重新校准期间导致更高的灵敏度,但噪声过滤会减少。
- 一个较高的值将在重新校准期间导致较低的灵敏度,但会有更多的噪声过滤。
*/
#define TSLPRM_DEBOUNCE_CALIB (4)
/** 采样单元错误状态去抖动 (范围=0..63)
- 一个较低的值将导致更高的敏感度进入错误状态。
- 一个较高的值将导致较低的敏感度进入错误状态。
*/
#define TSLPRM_DEBOUNCE_ERROR (3)
/** @} Common_Parameters_Debounce */
单独的传感器去抖动可以编制API函数,通过调用来设置这些参数:
/**
* @brief Set thresholds for each object (optional).
* @param None * @retval None
*/
void tsl_user_SetThresholds(void) {
/* USER CODE BEGIN Tsl_user_SetThresholds */
/* Example: Increase the debounce detect values for the TKEY 0 */
MyTKeys_Param[0]. CounterDebDetect += 2;
MyTKeys_Param[0]. CounterDebRelease += 2;
/* We can do the same for CounterDebRelease, CounterDebError, CounterDebCalib and CounterDebProx*/
/* USER CODE END Tsl_user_SetThresholds */
}
为了通过国际电工委员会标准IEC61000-4-4中的快速瞬态脉冲群测试(FTB),在对同一个触摸键的每次采集之间必须增加15毫秒的额外延迟。必须考虑去抖动值(见下图)。
图19 去抖参数=1
图20 去抖参数=3
5.7 肖特基二极管提升免疫力
在MCU附近增加一个低电容肖特基二极管,如ST BAS70,可以增加对传导噪声的电压水平免疫力:
• 在屏蔽组Y上,必须增加一个肖特基二极管:单二极管封装BAS70ZFILM(SOD-123)、BAS70JFILM(SOD-323)和BAS70KFILM(SOD-523)是最佳选择。
• 在触摸键组X上,必须增加三个肖特基二极管:三并联二极管封装,如BAS70-08SFILM(SOT-323-6L),或三个单二极管封装,是最佳选择。
有关可用封装的更多详细信息,请参考BAS70数据手册。
注意:所有MCU上都必须使用这些额外的肖特基二极管。任何未使用的GPIO必须设置为复位状态或接地。 下图解释了如何连接这些额外的肖特基二极管。
图21. 传感器和屏蔽上的肖特基BAS70二极管
4.2.5 减少VDD上的纹波
任何测量的绝对值都会受到VIH(输入高电平电压)的影响。VIH电压水平会随着VDD的变化而变化。VDD上的纹波同样也会影响Cx(传感器电容)的充电电压。 下图描述了VDD和纹波效应对测量的影响。
图22. VDD和纹波效应对测量的影响
为了避免测量不稳定,必须消除VDD的纹波和电压水平变化。一个很好的例子是,使用LDO,在Vsense引脚上增加一个10微法拉的电容器,如下图所示(为增加设计的可靠性,请参阅设计使用的LDO数据手册以获取更多详细信息)。
图23 减少纹波的硬件设计示例
4.2.6 VDD电平与VIH范围的影响
如前一节所述,任何测量的绝对值都会受到VDD和VIH的影响。当VDD增加时,这种影响会增加;当VDD减少时,这种影响会减少。 下图描述了这些对测量的影响。
图24. VDD和VIH对测量的影响
4.2.7频率跳变技术
另一种提高噪声免疫力的方法是使用频率跳变算法。通过更新CTPH、CTPL和DIV TSC寄存器字段,可以在所有组采集结束时改变电荷传输频率。这样可以分散电荷传输频率。可以使用两个、三个或更多频率值。 下面给出了这个算法的一个示例。它可以用于在每次完成所有传感器采集后更新CTPH和CTPL。
算法定义:
// TSC 跳频
#define FREQ_VALUES 3
typedef struct
{
int div;
int ctph;
int ctpl;
}
tsc_setup_t; tsc_setup_t FreqHopp[FREQ_VALUES]={0};
TSC_HandleTypeDef htsc;
TSC_HandleTypeDef htsc_freqhopp;
#define CTPH_TO_INT(a) ((uint32_t)( (a) >> 28) + 1) // From 1 to 16
#define INT_TO_CTPH(a) ((uint32_t)( (a-1) > 24) + 1 ) // From 1 to 16
#define INT_TO_CTPL(a) ((uint32_t)( (a-1) > 12) + 1) // 1/2/4/8/16/32/64/128
#define INT_TO_PRESC(a) ((uint32_t)( (a-1)
选择DIV(分频器)、CTPH(电荷传输周期高)、和CTPL(电荷传输周期低)以获得所有传感器上的稳定测量。这些参数与电路板布局、采样电容器和串联电阻有关。
在触摸传感系统中,DIV、CTPH和CTPL是与触摸传感器的时序和频率相关的参数,它们对系统性能有重要影响:
-
DIV(分频器):用于调整系统时钟的分频比,从而影响触摸传感器的采样频率。
-
CTPH(电荷传输周期高):定义了触摸传感器在高电荷状态下的电荷传输周期的一部分。
-
CTPL(电荷传输周期低):定义了触摸传感器在低电荷状态下的电荷传输周期的一部分。
OptimumTscCfgCTPH=x; //With:
OptimumTscCfgCTPL=x; //x = 1 to 16
OptimumTscCfgDIV=y; //y = 1 to 128 (power of 2)
调用TSC初始化函数
... htsc.Init.CTPulseHighLength = INT_TO_CTPH(OptimumTscCfgCTPH);
htsc.Init.CTPulseLowLength = INT_TO_CTPL(OptimumTscCfgCTPL);
htsc.Init.SpreadSpectrum = DISABLE; ...
htsc.Init.PulseGeneratorPrescaler = INT_TO_PRESC(OptimumTscCfgDIV); ...
if (HAL_TSC_Init(&htsc) != HAL_OK)
...
未完待续........