历史上的今天
返回首页

历史上的今天

今天是:2025年03月05日(星期三)

正在发生

2020年03月05日 | STM8S触摸按键固件库详解

2020-03-05 来源:eefocus

由于刚好有小项目需要用到触摸按键,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;

 

}

推荐阅读

史海拾趣

爱特姆(ATOM)公司的发展小趣事

随着电子行业的快速发展,爱特姆不断加大对技术研发的投入,致力于推出更先进、更稳定的连接器产品。公司成功研发出一系列具有自主知识产权的新产品,不仅提升了产品的性能和质量,也进一步巩固了其在行业内的领先地位。

BELLING LEE公司的发展小趣事

随着电子市场的不断发展和消费者需求的多样化,BELLING LEE公司意识到单一的产品线已无法满足市场需求。于是,公司开始积极拓展产品线,推出了包括智能手机、平板电脑、智能家居设备等一系列新产品。这些新产品不仅满足了消费者的多样化需求,也进一步巩固了公司在电子市场的领先地位。

华宇创公司的发展小趣事

华宇创深知品质是企业生存和发展的关键。因此,公司建立了严格的质量管理体系,从原材料采购到生产过程再到成品检测,每一个环节都严格把控。同时,华宇创还积极参与各类国际认证和标准制定工作,不断提升产品的品质和性能。这些努力使华宇创的产品在市场上赢得了良好的口碑和信誉,品牌知名度也逐渐提升。

Aimtec公司的发展小趣事

随着业务规模的扩大,Aimtec公司开始将目光投向国际市场。公司先后在欧洲和亚洲设立了办事处,通过本地化的销售策略和技术支持,逐步打开了国际市场的大门。在国际竞争中,Aimtec凭借其优质的产品和服务,赢得了众多客户的信赖和好评。同时,公司还积极参与国际电子行业的交流与合作,不断提升自身的技术水平和市场竞争力。

全鹏(CHAMPION)公司的发展小趣事

在2003年,全鹏公司成为巴西Coletek集团的一员,开始了其在南美洲市场的征程。起初,全鹏在巴西设立了提供系统组装所需机壳、键盘、鼠标、喇叭等配件的组装工厂,以满足当地市场的初步需求。随着业务的不断扩大,全鹏在2004年与当地市政府合作,规划并建设了一座总厂房面积达8000平方公尺的新工厂,配置了六条组装生产线和两条印刷生产线,以及一个发货仓库。这座新工厂迅速成为全鹏在巴西市场的发货中心,推动了全鹏在当地的业务增长。

EMS GmbH公司的发展小趣事

作为欧洲最领先的生产商之一,EMS GmbH公司与各大国际整车厂建立了长期稳定的合作关系。这些合作不仅为公司带来了稳定的订单和收入来源,还使EMS GmbH能够深入了解市场需求和技术趋势,从而不断优化产品和服务。通过与国际整车厂的紧密合作,EMS GmbH公司在汽车转换器注塑件领域赢得了良好的口碑和声誉。

问答坊 | AI 解惑

三相正弦交流電路

三相正弦交流電路…

查看全部问答>

【FPGA设计问题】连续读取RAM的问题

连续读取RAM中的数据,组成流水线进行计算,但是发现读取RAM时读到的数据有时候不正确,经常是第一个数据有错误,请问一下,有没有什么稳定的设计去连续读取RAM的?我的设计是reg [7:0] ReadNum;if (ReadNum[0])begin     Dout ...…

查看全部问答>

如何在c51中定义一个全局变量

如何在c51中定义一个全局变量…

查看全部问答>

51 控制的步进电机

#include\"reg52.h\" //#include\"intrins.h\" #define uchar unsigned char #define uint unsigned int bit front_move=1, back_move; sbit key1=P3^2; sbit key2=P3^3; sbit key3=P3^4; //uchar jzaj(void); //单4拍正转 zheng[]={0x01 ...…

查看全部问答>

帮忙算一下GPRS的资费啊。。

昨天去移动开GPRS的卡,不知道选什么套餐哦。。具体需要按照流量来区分的。 这个GPRS的流量怎么计算啊?…

查看全部问答>

什么是Re-enumerating Devices

最近我阅读关于USB测试的一个英文资料,不知道Re-enumerating Devices具体什么意思…

查看全部问答>

串口中断进不去,急?

  我是用72324,外部4MHz晶体,用inDART硬件仿真,现在有两个问题:   1,调试通信不成功,但用inDART下的DataBlaze完全正常,读写都正常?没办法我先配置成内部振荡,可以进入硬件仿真,只是速度慢?   2,我的S ...…

查看全部问答>

问题请教

请问各位,我用的是MSP430F149进行试验,在连着仿真器的时候出来的效果不较好,可是当单独使用外接电源的时候感觉差的挺多的,我想问问大家有内有于建国,还有应该怎么样解决啊?谢谢啦!…

查看全部问答>