基于STM8的触摸按键方案
STM8的按键程序学习笔记

key_delay_count++; //延时计数器开始计数
if(key_delay_count>=65530)
{key_delay_count=0;key_down_IF=0;} //按键按下时间过长,则是故障,不执行按键反馈
if(key_delay_count>=key_delay_long)
//#define key_1_in() {(GPIO_ReadInputPin(GPIOC, GPIO_PIN_5)==SET)? 1:0}
/*设置端口按键中断的触发方式下降沿和低电平触发*/
#define key_int_way EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);
//#define key_short 0x01; //定义短按键值,按键按下后根据按键1号按键短按最终键值为0x11,长按为0x12.类推
//#define key_long 0x02; //定义长按键值,
//#define key_short 0x01;
//#define key_short 0x01;
注意:系统中断函数中有按键扫描的部分程序INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 4)等。
调用方法:
void key_port_init();//按键端口的定义
void scan_key();//按键的扫描程序,放在定时器中断中,定时器1ms中断。
extern unsigned char key_down_IF=0x00; //在中断函数中加入变量声明
void key_interrupt_do()
stm8s触摸按键

目录
目录
用于触摸感应应用的RC感应原理
1 RC 感应原理 .............................................................................................................3 2 硬件实现 ...................................................................................................................5 3 软件实现 ...................................................................................................................6
图8 触摸效果实例
3.4
多次测量以及高频噪声的去除
为了提高测量的精确度,并去除高频噪声,有必要对VIH和VIL进行多次的测量,然后再决定是否 有按键被有效“触摸”。多次测量的次数有两种办法决定:第一和MCU核有关,但是一个固定 值;另外一个就是可配置的数值(从TS固件库的配置文件可以修改)。 对STM8芯片来说,固定的多次测量的次数为8(即进行8次VIH测量和8次VIL测量)。 图9 测量的种类
C = εRε 0 A d
图1 RC网络上的压降
固定电压施加在VIN,VOUT的电压随着电容值的变化而相应增加或者降低, 如图2所示。 图2 测量充电时间
通过计算VOUT的电压达到阀值VTH所需要的充电时间(tC),来得到电容值(C)。 在触摸感应应用中,电容值(C)由两部分组成:固定电容(电极电容,CX)和当人手接触或者靠近 电极时,由人手带来的电容(感应电容,CT)。电极电容应该尽可能的小,以保证检测到人手触 摸。因为通常人手触摸与否,带来的电容变化一般就是几个pF(通常5pF)。 利用该原理,就可以检测到手指是否触摸了电极。
基于STM8的触摸按键方案

基于STM8的触摸按键方案引言:触摸按键已经成为现代电子产品中的一种常用的用户输入方式。
相比传统的机械按键,触摸按键不需要机械结构,大大降低了产品的故障率,并且能够提供更加灵敏的触摸交互体验。
本文将介绍基于STM8的触摸按键方案,涵盖了原理、设计要点以及实现方法等内容。
1.原理:触摸按键的原理是利用人体电容来实现电压变化的检测。
当人体接近触摸板时,人体的电容会改变触摸板上的电场分布,从而引起电压的变化。
通过测量这种电压变化,可以检测到用户的触摸行为。
2.设计要点:(1)电源管理:触摸按键需要为触摸芯片提供稳定的电源。
在设计电源管理时,需要考虑到触摸板的功耗、电源稳定性以及电池寿命等因素;(2)电容检测:电容检测是触摸按键的核心技术,需要选取合适的电容检测方案,并且能够准确地检测到用户的触摸行为;(3)噪声过滤:触摸按键会受到环境噪声的干扰,需要采取一定的噪声过滤措施,提高触摸的可靠性;(4)通信接口:触摸按键会通过通信接口与主控芯片进行数据传输,需要选择合适的通信接口,并且确保通信的可靠性和稳定性。
3.实现方法:(1)硬件设计:首先,需要设计触摸板电路,包括电容检测电路、滤波电路和通信接口电路等;其次,需要设计电源管理电路,确保为触摸芯片提供稳定的电源。
(2)软件设计:基于STM8的触摸按键方案可以采用定时器+IO口中断的方式来实现。
具体流程如下:i.初始化定时器和IO口中断;ii. 定时器中断发生时,通过IO口中断判断电容的充放电状态,将结果保存;iii. 主循环中检测保存的触摸状态,通过通信接口将其传输给主控芯片。
4.结论:。
基于单片机的电容感应式触摸按键原理与程序——C程序

基于单片机的电容感应式触摸按键原理与程序——C程序经过上篇文章的介绍,基于单片机的电容感应式触摸按键的实现方法也就没什么神秘的了,而且其控制程序也就呼之欲出了,核心就是用STC单片机的片内ADC实时的进行数据转换与比对判断,但虽然原理简单,但编程思路还是要啰嗦几句,想法是先设置一个空数组作为键值数据暂存器,每次上电运行时,经过短暂的等待,待电源和系统稳定后,扫描一次键盘,将无操作时的键值加以记录,而后循环扫描键盘与之对比,当差值符合条件是,判断为有键按下,同时返回键号及键控指令。
程序如下:/************************************************************** **************** STC单片机电容感应按键C程序---------原创作者wannenggong*************************************************************** ***************//*======================================== =========================应用电路见原理篇的图1,图中:PWM-IN端输入频率为380KHz、占空比75%的矩形脉冲,定义按键K1为ADC0接P1.0,K2为ADC1接P1.1;K1有指触摸时LED1亮LED2灭,K2有指触摸时LED2亮LED1灭;按键面板玻璃厚度为5mm。
程序应用时需检查STC12C2052AD.H文本文档中有无如下设置,如没有时需要加入并保存,否则ADC相关函数将报错#define ADC_POWER 0x80 //ADC模块电源控制位#define ADC_SPEEDLL 0x00 //每次转换需要1080个时钟周期#define ADC_SPEEDL 0x20 //每次转换需要810个时钟周期#define ADC_SPEEDH 0x40 //每次转换需要540个时钟周期#define ADC_SPEEDHH 0x60 //每次转换需要270个时钟周期#define ADC_FLAG 0x10 //ADC转换完成标志#define ADC_START 0x08 //ADC开始转换控制位#define ADC_CHS1 0x02 //ADC通道选择位1#define ADC_CHS0 0x01 //ADC通道选择位0ADC转换程序参照宏晶官网程序改编====================================== ============================*/#include#include#define uint unsigned int#define uchar unsigned char/***********I/O口位功能定义*****************************************/sbit LED1=P3^4;sbit LED2=P3^5;/************应用变量设置*******************************************/bit f1,f2;uint FLG[2]; //初始键值寄存uint zz,RV,R,RR;uchar ee=1,n=0,y;/************************************************************** *****/void Delay(uint x)//用于ADC转换及其它{uint y;while (x--)y = 5000;while (y--);}}/******初始模数转换寄存器函数****************************************/ void InitADC() {ADC_DA TA = 0; //ADC数据寄存器清零ADC_CONTR = ADC_POWER | ADC_SPEEDLL;Delay(2);}/****8位ADC转换执行函数***********************************************/ uint GetADCResult(uchar ch){ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;_nop_(); //必要的查询等待_nop_();_nop_();_nop_();while (!(ADC_CONTR & ADC_FLAG));//等待标志位ADC_CONTR &=~ADC_FLAG; //关闭ADCreturn ADC_DA TA; //返回AD转换完成的8位数据(16进制)}/*************按键初值保存函数*****************************************/ //系统上电时更新一次void InitDA T(){uchar e;Delay(50);//延时等待系统稳定很有必要for(e=0;e<2;e++){FLG[e]=GetADCResult(e);Delay(5);}}/*****************开关控制函数****************************************/ void key_control(void) {R=0;RV=GetADCResult(ee-1);R=(FLG[ee-1]-RV);if(R>=0x17 && R<=0x1d)R=ee;{R=0;ee++;}if(ee>2)ee=1;switch(R){case 1://K1{f1=1;f2=0;}break;case 2://K2{f2=1;f1=0;}break;default : R=0;}}/******开关控制执行与显示选择函数************************************/void Auto(void){key_control();if(f1==0 && f2==0){LED1=LED2=1;}if(f1==1){LED1=0;LED2=1;}if(f2==1){LED1=1;LED2=0;}}/*********主函数*****************************************************/main(){P1M0 = 0x03; //设置P1.0/P1.1为高阻状态P1M1 = 0x00;InitADC();InitDA T();while(1){key_control();Auto();}}到此,关于电容感应按键的实验就完成了,制作是实验性质的,结果可供参考,经验仅供交流,如用于商业用途而产生的问题本人盖不负责,若欲转载(贴)请注明出处并望告知,若有用于广告引贴,本人保留追究的权力。
基于单片机STM8S103和ST05A的触摸按键设计

消 费 电子开 发 的一款 8位 微控 制器 , 拥 有 良好 的性价 比 。三 级流 水线 的 哈佛 结构 ,8 k B字节 的系 统 内可编 程F l a s h ,擦 写寿命 1 0 , 0 0 0次 ,5 1 2 B的 E E P RO M 擦 写 寿命 1 0 0 , 0 0 0次 ,l k B 字节 的片 内 R AM , 可 以对锁 定位 进 行编 程 以实现 用户 程序 的加 密 。 灵 活 的时钟控
c h i p we r e f o c u s e d o n . T h r o u g h t h e c i r c u i t d i a g r a m, o s c i l l o g r a m a n d l f o w c h a r t , t h e h a r d wa r e c i r c u i t a n d s o f t wa r e d e s i g n i d e a s we r e r e a l i z e d . A l o w- c o s t s o l u t i o n f o r t h e t o u c h — k e y wa s p r o v i d e d .
Ya n Ai - j u n , F a n H a i — Mi n g , Z h o u J u n
( T h e 7 1 8 t h Re s e a r c h I n s t i t u t e o f CS I C , Ha n d a n 0 5 6 0 2 7 , C h i n a )
机 芯片 , 通 过 C语 言编 程 技术 实现 软件 编程 设 计[ , 。
1 S T M 8 S 1 0 3单片机及触摸感应器简 介
使用普通IO口实现电容触摸感应的解决方案

技术背景现在电子产品中,触摸感应技术日益受到更多关注和应用,不仅美观耐用,而且较传统机械按键具有更大的灵敏度、稳定性、可靠性,同时可以大幅提高产品的品质。
触摸感应解决方案受到越来越多的IC设计厂家的关注,不断有新的技术和IC面世,国内的公司也纷纷上马类似方案。
Cpress公司的CapSense™技术可以说是感应技术的先驱,走在了这一领域的前列,在高端产品中有广泛应用,MCP推出了mTouch™,AT也推出了QTouch™技术,FSL推出的电场感应技术与MCP 的电感触摸也别具特色,甚至ST也有QST产品。
但是目前所有的触摸解决方案都使用专用IC,因而开发成本高,难度大,而本文介绍的基于RC充电检测(RC Acquisition)的方案可以在任何MCU上实现,是触摸感应技术领域革命性的突破。
首先介绍了RC充电基础原理,以及充电时间的测试及改进方法,然后详细讨论了基于STM8S单片机实现的硬件、软件设计步骤,注意要点等。
一、RC充电检测基本原理RC充电检测基本原理是对使用如PCB的电极式电容的充电放电时间进行测量,通过比较在人体接触时产生的微小变化来检测是否有‘按下’动作产生,可选用于任何单独或多按键、滚轮、滑条。
如图1(a)所示,在RC网络施加周期性充电电压Vin,测量Vout会得到如(b)的时序,通过检测充电开始到Vout到达某一门限值的时间tc的变化,就可以判断出是否有人体接触。
图2显示出有人体接触时充电时间会变长。
实现电路如图3,使用一个I/O口对PCB构成的电容充电,另一个I/O口测量电压,对于多个按键时使用同一个I/O口充电。
R1通常为几百K到几M,人体与PCB构成的电极电容一般只有几个pF,R2用于降低噪声干扰,通常为10K。
二、充电时间测量方法对充电时间的测量可以使用MCU中定时器的捕捉功能,对于多个按键一般MCU没有足够的定时器为每个按键分配一个,也可以使用软件计时的方法,这要求能对MCU的时钟精确计数,并且保证每个周期的时钟个数保持一定。
燕山大学仪表stm8实习之三个按键控制3个频率

/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
#define BUTTON_PORT (GPIOC)
#define BUTTON1_PIN (GPIO_PIN_1)
#define BUTTON2_PIN (GPIO_PIN_2)
#define BUTTON3_PIN (GPIO_PIN_3)
#define LEDS_PORT (GPIOD)
//设置外部中断为C端口, 该函数为中断响应函数
@far @interrupt void EXTI_PORTC_IRQHandler (void)
{
unsigned char i,j,k;
i=GPIO_ReadInputPin (GPIOC,BUTTON1_PIN);
j=GPIO_ReadInputPin (GPIOC,BUTTON2_PIN);
while (1)
{
int i=0;
GPIO_WriteReverse(GPIOD, LED1_PIN | LED2_PIN | LED3_PIN);
for ( i = 0; i < 2; i++)
{
Delay((u16)60000);
/**
根据按键中断《GPIOC,(GPIO_PIN_1)被设为外部中断设置。
按键改变时钟周期
注意要将按键TLI和C1相连
stm8引脚能否做成触摸输入

stm8 引脚能否做成触摸输入
我曾开发带有触摸按键功能的消费类电子产品,在起初也是不知道STM8 引脚可以实现触摸这个功能,所以这里写给大家。
1
写在前面
我们开发带有触摸功能的产品时,可能首先考虑的就是购买一个触摸芯片。
但是对于消费类电子,如果你的产量较大,可能就会考虑这1,2 块的触摸芯片的成本。
此时,使用STM8,或者STM32 作为主控的IC 可以实现触摸功能就显得比较重要了。
由于很多人不知道这个功能,这里先让大家了解并熟悉这一项触摸按键功能。
2。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于STM8的电容感应式触摸按键方案在
电磁炉中的应用
1、引言
相较于机械式按键和电阻式触摸按键,电容式触摸按键不仅耐用,造价低廉,结构简单易于安装,防水防污,而且还能提供如滚轮、滑动条的功能。
但是电容式触摸按键也存在很多的问题,因为没有机械构造,所有的检测都是电量的微小变化,所以对各种干扰敏感得多。
ST 针对家电应用特别是电磁炉应用,推出了一个基于 STM8系列8位通用微控制器平台的电容式触摸感应方案,无需增加专用触摸芯片,仅用简单的外围电路即可实现电容式触摸感应功能,方便客户二次开发。
2、方案介绍
ST的电容式触摸按键方案通过一个电阻和感应电极的电容CX构成的阻容网络的充电/放电时间来检测人体触摸所带来的电容变化。
如图1所示,当人手按下时相当于感应电极上并联了一个电容CT,增加了感应电极上的电容,感应电极进行充放电的时间会增加,从而检测到按键的状态。
而感应电极可以直接在PCB板上绘制成按键、滚轮或滑动条的应用样式,也可以做成弹簧件插在PCB板上,即使隔着绝缘层(玻璃、树脂)也不会对其检测性能有所影响。
图1 STM8S电容式触摸按键的工作原理电磁炉是采用磁场感应电流的加热原理对食物进行加热。
加热时,通过面板下方的线圈产生强磁场,磁力线穿过导磁体做的锅的底部时,锅具切割交变磁力线而在锅具底部产生涡流使锅底迅速发热,达到加热食物的目的。
在本解决方案中采用44pin的STM8S105S4做按键显示板的主控芯片,控制13个按键的扫描、24个LED及一个4位数码管的显示、I2C与主板的通讯,并留有一个SWIM接口方便工程师调试之用(如图2)。
图2 电磁炉按键板原理
STM8S105S4采用的是ST高级STM8内核,具备3级流水线的哈佛结构,3.0~5.5V工作电压,内部16MHz RC可提供MCU 16MHz工作频率,提供低功耗模式和外设时钟关闭功能,共有34个I/O可用。
STM8S105S4 具有2KB的RAM和16KB的FLASH,还有可达30万次擦写次数的1KB EEPROM数据存储器。
3、电磁炉工作环境中的干扰
①电磁干扰
电磁炉在加热锅的同时,也会在电路板上感应电极正向或反向的电流,从而会缩短或增长按键充放电时间,会对按键的检测造成很大影响,甚至产生误动作,常见的方法采用硬件屏蔽和过零点检测来消除电磁辐射对按键的影响。
硬件屏蔽
在STM8S的解决方案中,ST提供了感应电极和走线的设计规范和如图3所示的Driven Shield功能(在Shield线上提供与按键管脚相同的驱动信号,电极与Shield之间的寄生电容就不会被充放电),能有效地减少感应电极走线的寄生电容对按键灵敏度的影响。
图3 Driven Shield
过零点检测
硬件过零点检测
过零点检测可采用硬件实现,在硬件设计中,可以增加如图4 或图5过零点的硬件检测电路,通过在B端输出为高电平时进行按键状态的判断,以期在电磁辐射最小的时候对触摸按键进行检测。
图4 硬件过零点检测电路1
图5 硬件过零点检测电路2
软件过零点检测
硬件过零点检测增加硬件电路设计的复杂性,增加方案成本,在我们的解决方案中,针对电磁炉的工作环境,我们采用软件进行过零点检测,从而降低成本,有效解决电磁炉主功率电路对触摸按键的干扰
②电网干扰
因为国内电网质量不一,在一些质量差的地区,容易影响电磁炉触摸按键的正常工作。
如果不能做电源隔离,就会看到如下图6的差别(蓝色表示无按键,红色表示键被按下),而这些图还只是在电磁炉没有开功率的情况下的,当电磁炉工作时产生的电磁辐射将会使看到的信号更加杂乱无章。
在实验中发现,采用与外界电网隔离或使用软件滤波,按键效果都能得到明显改善。
③溅水,溅油的影响
在电磁炉的使用当中,常常会出现水或油溅到触摸面板上,它可能导致按键误触发,本解决方案采用特殊软件算法可靠地将覆水溅油与手指按下的状态区分开。
④环境自适应能力
电磁炉在工作的时候,会产生大量的热量与湿气,面板温度/湿度,电路板温度/湿度都是会在一个很宽的范围浮动,而随着使用时间的推移,包括玻璃面板、 PCB板都会出现不同程序的老化,从而影响按键检测的准确度。
在ST的解决方案中,实现了自动校准功能,实时地提供环境检测,实现环境自适应的机制。
4 总结
ST提供的解决方案包含了触摸面板自校准、软件滤波、软件过零点检测及环境自适应等功能,尽可能地使用软件算法去屏蔽各种复杂环境的干扰,具有低成本及工作可靠等特点。
当然在其他产品的应用中,也会有一些与电磁炉环境不同的要求,这里只是介绍了其中一些有代表性的干扰,但只要掌握了电容式触摸的工作原理,还是有很多种方法来处理各种应用情况。
参考文献
1. ST, Guidelines for designing touch sensing applications, April 2010
2. ST, RC acquisition principle for touch sensing applications, March 2009。