STM8S触摸按键固件库详解

2020-03-05来源: eefocus关键字:STM8S  触摸按键  固件库

由于刚好有小项目需要用到触摸按键,stm8s可以节约一块触摸按键的片子,并且成本比较低。在某些对成本比较敏感的应用还是有价值的。现将自己网上找到的资料与自己学习的心得记下与大家分析。ST的底层库对滚动条也支持,效果还是不错的


一、原理分析

ST的电容式触摸按键方案通过一个电阻和感应电极的电容CX构成的阻容(RC)网络的充电/放电时间来检测人体触摸所带来的电容变化。

如上图所示,当人手按下时相当于感应电极上并联了一个电容Cx,增加了感应电极上的电容,感应电极进行充放电的时间会增加,从而检测到按键的状态。


先用开关将 Cs(或 Cs+Cx)上的电放尽,然后断开开关,让 R 给 Cs(或 Cs+Cx)充电,当没有手指触摸的时候, Cs 的充电曲线如图中的 A 曲线。而当有手指触摸的时候, 手指和 TPAD之间引入了新的电容 Cx,此时 Cs+Cx 的充电曲线如图中的 B 曲线。 从上图可以看出, A、 B两种情况下, Vc 达到 Vth 的时间分别为 Tcs 和 Tcs+Tcx。

其中, 除了 Cs 和 Cx 我们需要计算,其他都是已知的,


根据电容充放电公式:Vc=V0*(1-e^(-t/RC))

其中 Vc 为电容电压, V0 为充电电压, R 为充电电阻, C 为电容容值, e 为自然底数, t 为充电时间。根据这个公式,我们就可以计算出 Cs 和 Cx。 利用这个公式,我们还可以作一个简单的电容计,直接可以测电容容量了,有兴趣的朋友可以捣鼓下。


其实我们只要能够区分 Tcs 和 Tcs+Tcx,就已经可以实现触摸检测了,当充电时间在 Tcs 附近,就可以认为没有触摸,而当充电时间大于 Tcs+Tx 时,就认为有触摸按下( Tx为检测阀值)。

实际应用中感应电极可以直接在PCB板上绘制成按键、滚轮或滑动条的应用样式,也可以做成弹簧件插在PCB板上,即使隔着绝缘层(玻璃、树脂)也不会对其检测性能有所影响。


二、硬件设计

网络标号描述

REF_LOAD:对按键进行充放电的引脚,所有按键必须共用一个LOAD(保证一致性)。也可以用VCC代替。


SH_MCKEY:屏蔽引脚,这个根据实际情况来觉得是否接,一般调试的时候预留着


PD2-PD6 PC6 PC7为用户按键部分


注意:不要将按键检测脚安排在True open drain引脚和OSC1/PA1,OSC2/PA2引脚上(前者无法输出高电平,后者的内部结构与一般IO口不同,不适宜作为按键检测脚使用)



三、软件分析

MCU需要资源


1个16位定时器 (用于采集按键信号: 测量RC充放电时间)

1个8位定时器 (主要作为后处理的时基信号)


资料与固件代码下载地址


主函数(main)

void main(void)

{

    volatile u16 temp;

 

    CLK_HSICmd(ENABLE);//使能HSI

    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//

    CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);//主频16M

    Delay(10000);  

 

    TSL_Init(); //按键库初始化

    Extra_Init();

 

 

    while(1) 

    { 

        temp = uMainCounting;

        TSL_Action();//获取按键状态

        Runing_Session[0] = uMainCounting - temp;

 

 

        temp = uMainCounting;

        Key_State_Machine();

        Runing_Session[1] = uMainCounting - temp;

    }

}


初始化触摸固件库

void TSL_Init(void)

{

 

  disableInterrupts();

 

  DetectionIntegrator = DETECTION_INTEGRATOR_DEFAULT;

  EndDetectionIntegrator = END_DETECTION_INTEGRATOR_DEFAULT;

  ECSTimeStep = ECS_TIME_STEP_DEFAULT;

  ECSTemporization = ECS_TEMPO_DEFAULT;

  RecalibrationIntegrator = RECALIBRATION_INTEGRATOR_DEFAULT;

  DetectionTimeout = DTO_DEFAULT;

 

  ECS_K_Fast = ECS_IIR_KFAST_DEFAULT;

  ECS_K_Slow = ECS_IIR_KSLOW_DEFAULT;

  ECSTimeStepCounter = ECSTimeStep;

  ECSTempoCounter = 0;

  ECSTempoPrescaler = 0;

 

  TSL_IO_Init();

 

#if (RTOS_MANAGEMENT == 0)

  TSL_Timer_Init();

#endif

 

#if NUMBER_OF_SINGLE_CHANNEL_KEYS > 0

  TSL_SCKey_Init();

#endif

#if NUMBER_OF_MULTI_CHANNEL_KEYS > 0

  TSL_MCKey_Init();

#endif

 

  enableInterrupts();

 

  TSLState = TSL_IDLE_STATE;

 

}

关键字:STM8S  触摸按键  固件库 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic490563.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM8S触摸按键固件库详解
下一篇:MCU实战经验:多种的按键处理

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8S配置位 OptionByte
 1.什么是STM8S 的配置字 OptionByte2.Option Byt Byte 里面的位都表示什么3.如何编程Option Byte一 选项字节(OptionByte )STM8S 的配置字类似于AVR 的Fuse 熔丝位。用于配置端口的复用功能和读保护等操作。不同于AVR 的熔丝位,STM8S 的时钟配置并不在Option Byte 中,不会出现写完STM8S 后芯片直接锁死的尴尬。选项字节用于配置硬件特性和存储器保护状态,这些字节位于同一页的特定存储器阵列中。选项字节可以在ICP/SWIM模式中或IAP模式中修改, 也就是可以通过STlink 写配置字,或者是通过程序写选项字。举例:STM8S 的有一个
发表于 2020-04-27
STM8S配置位 OptionByte
STM8S——8位基本定时器(TIM4)
简介:该定时器由一个带可编程预分频器的8位自动重载的向上计数器所组成,它可以用来作为时基发生器,具有溢出中断功能。主要功能:(1)8位向上计数的自动重载计数器;(2)3位可编程的预分配器(可在运行中修改),提供1、2、4、8、16、32、64、128这8种分频比例;(3)中断产生:更新中断(溢出,计数器初始化)。代码实现: 1 /* Includes ------------------------------------------------------------------*/ 2 #include "stm8s.h" 3  4 /* Private
发表于 2020-04-25
stm8S毫秒定时器
#include "tim4.h"#include "stm8s_tim4.h"#define TIM4_PERIOD 124void Dely1ms(void){TIM4_DeInit();/* Time base configuration */// 8M/64=125000HZ// (x + 1)/125000=0.001s = 1ms// x = 124TIM4_TimeBaseInit(TIM4_PRESCALER_64, TIM4_PERIOD);/* Clear TIM4 update flag */TIM4_ClearFlag(TIM4_FLAG_UPDATE
发表于 2020-04-25
STM8S 115200bps 串口中断连续接收出错问题
内部16M晶振误差太大,导致波特率不准,9600bps可以。要想使用115200,就用外部晶振吧。还有数据寄存器DR中的数据如果没有及时取走(也可能因为波特率不准)导致数据溢出,出现反复中断现像,如在调试时如果暂停时串口上还有数据,再次运行时DR中的数据将一直是某个数据,正常情况下是不会出现的,解决办法就是进中断的时候清OV标志(不能解决根本问题)。
发表于 2020-04-18
STM8S主时钟切换(使用HSE时钟源)
的时钟源:HSE;启动切换中断;保持原时钟源开启  if (es == SUCCESS)  //切换是否成功,SUCCESS or ERROR  {      CLK_CCOConfig(CLK_OUTPUT_MASTER);//配置时钟输出脚的时钟源:f(master)      CLK_CCOCmd(ENABLE);//启动时钟输出功能  };  /* Infinite loop */  while (1)  {  }  }stm8s_it.c文件
发表于 2020-04-18
STM8S主时钟切换(使用HSE时钟源)
STVP烧录出错
用STVP烧录程序到STM8S003F时出现错误提示:Cannot communicate with the tool.其实是下载工具没选择好,确定返回到软件界面后,点Configure->Configure ST Visual Programmer,弹出如下窗口我们一般会选择右边两个栏内的选项,而把左边的Hardware一栏忘记选择,软件安装好之后默认是RLINK,而我们购买的工具大部分是ST-LINK,点选这个之后再返回软件,就可以正常烧录了。
发表于 2020-04-15
STVP烧录出错
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved