历史上的今天
返回首页

历史上的今天

今天是:2024年10月05日(星期六)

正在发生

2018年10月05日 | STM32f4电容触摸按键实验代码(02)

2018-10-05 来源:eefocus

STM32f4————电容触摸按键实验代码(02)

 

//定时器 2通道2 输入捕获配置    

//arr:自动重装值

//psc:时钟预分频数

void TIM2_CH1_Cap_Init(u32 arr,u16 psc)

{

  GPIO_InitTypeDef  GPIO_InitStructure;  

      TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  TIM_ICInitTypeDef  TIM2_ICInitStructure;

  

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);   //TIM2时钟使能     

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能PORTA时钟

  

  GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_TIM2); //PA5复用位定时器2

 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //GPIOA5

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//速度 100MHz

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不带上下拉  

  GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA5

 

    //初始化 TIM2   

  TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值    

  TIM_TimeBaseStructure.TIM_Prescaler =psc;    //预分频器        

  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //  初始化定时器2

  //初始化通道 1

     TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端  IC1映射到TIM2

     TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;  //上升沿捕获

      TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;  

     TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;    //配置输入分频,不分频  

     TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC2F=0000 配置输入滤波器 不滤波

     TIM_ICInit(TIM2, &TIM2_ICInitStructure);//初始化 TIM2 IC1

                              

  TIM_Cmd(TIM2,ENABLE );    //使能定时器 2

}

此部分代码包含 6 个函数,我们将介绍其中 4 个比较重要的函数:TIM2_CH1_Cap_Init、TPAD_Get_Val、TPAD_Init和 TPAD_Scan。

首先介绍TIM2_CH1_Cap_Init函数,该函数和上一章的输入捕获函数基本一样,不同的是,这里我们设置的是 TIM2 上一章是 TIM5。通过该函数的设置,我们将可以捕获 PA5 上的上升沿,同样TIM2也是 32 位定时器。

我们再来看看 TPAD_Get_Val 函数,该函数用于得到定时器的一次捕获值。该函数先调用TPAD_Reset,将电容放电,同时设置通过调用函数TIM_SetCounter(TIM2,0)将计数值TIM2_CNT设置为 0,然后死循环等待发生上升沿捕获(或计数溢出),将捕获到的值(或溢出值)作为返回值返回。

接着我们介绍 TPAD_Init 函数,该函数用于初始化输入捕获,并获取默认的 TPAD 值。该函数有一个参数,用来传递系统时钟,其实是为了配置 TIM2_CH1_Cap_Init 为 1us 计数周期。在该函数中连续 10 次读取TPAD 值,将这些值升序排列后取中间 6 个值再做平均(这样做的目的是尽量减少误差),并赋值给tpad_default_val,用于后续触摸判断的标准。  

最后,我们来看看 TPAD_Scan 函数,该函数用于扫描 TPAD 是否有触摸,该函数的参数mode,用于设置是否支持连续触发。返回值如果是 0,说明没有触摸,如果是 1,则说明有触摸。该函数同样包含了一个静态变量,用于检测控制,类似第八章的KEY_Scan 函数。所以该函数同样是不可重入的。在函数中,我们通过连续读取 3 次(不支持连续按的时候)TPAD 的值,取这他们的最大值,和tpad_default_val+TPAD_GATE_VAL 比较,如果大于则说明有触摸,如果小于,则说明无触摸。其中tpad_default_val 是我们在调用 TPAD_Init 函数的时候得到的值,而TPAD_GATE_VAL则是我们设定的一个门限值(这个大家可以通过实验数据得出,根据实际情况选择适合的值就好了),这里我们设置为 100。该函数,我们还做了一些其他的条件限制,

让触摸按键有更好的效果,这个就请大家看代码自行参悟了。

tpad.h 头文件部分代码比较简单,这里不做介绍。

接下来我们看看主函数代码如下:

int main(void)

{     

u8 t=0;  

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2

  delay_init(168);     //初始化延时函数

  uart_init(115200);    //初始化串口波特率为115200

  LED_Init();            //初始化 LED

  TPAD_Init(8);        //初始化触摸按键,以 84/4=21Mhz频率计数

     while(1)

  {                                  

      if(TPAD_Scan(0))  //成功捕获到了一次上升沿(此函数执行时间至少15ms)

    {

      LED1=!LED1;    //LED1取反

    }

    t++;

    if(t==15)      

    {

      t=0;   LED0=!LED0;    //LED0取反,提示程序正在运行

    }

    delay_ms(10);

  }

}

该 main函数比较简单,TPAD_Init(8)函数执行之后,就开始触摸按键的扫描,当有触摸的时候,对DS1 取反,而DS0 则有规律的间隔取反,提示程序正在运行。注意在修改main函数之后,还需要在main.c里面添加tpad.h头文件,否则会报错哦。

这里还要提醒一下大家,不要把uart_init(115200);去掉,因为在TPAD_Init函数里面,我们有用到 printf,如果你去掉了uart_init,就会导致printf无法执行,从而死机。  

至此,我们的软件设计就完成了。


推荐阅读

史海拾趣

Abilis Systems公司的发展小趣事

Abilis Systems公司是一家专注于数字视频和数字广播领域的半导体公司,以下是该公司发展的五个相关故事:

  1. 公司成立和初期发展: Abilis Systems公司成立于2004年,总部位于法国索恩-卢瓦尔省的克勒拉克。公司成立之初,致力于研发数字视频和数字广播领域的创新技术,旨在提供先进的芯片解决方案。

  2. 技术创新和产品推出: 在成立后的几年里,Abilis Systems公司不断进行技术创新,并推出了一系列创新的数字视频和数字广播芯片产品。这些产品包括数字电视接收器和解调器、数字广播接收器等,为客户提供了高性能和高度集成的解决方案。

  3. 市场拓展和国际合作: 随着产品技术的不断成熟和市场需求的增长,Abilis Systems积极拓展国际市场,并与全球各地的客户建立了合作关系。公司的产品被广泛应用于数字电视、数字广播、卫星电视等领域,赢得了客户的信赖和认可。

  4. 并购和战略合作: 为了进一步加强技术实力和扩大市场份额,Abilis Systems公司进行了一系列并购和战略合作。通过收购具有相关技术和市场资源的企业,公司拓展了产品线,并加强了在数字视频和数字广播领域的领先地位。

  5. 未来展望和发展方向: Abilis Systems将继续致力于技术创新和产品升级,加强在数字视频和数字广播领域的研发投入。公司将不断推出符合市场需求的新产品和解决方案,为客户提供更优质的服务和支持。同时,公司还将积极参与行业标准制定和国际合作,推动数字视频和数字广播技术的发展和应用。

EMLSI公司的发展小趣事

随着环保意识的不断提高,电子行业也开始面临环保压力。EMLSI公司积极响应环保号召,致力于开发绿色环保产品。公司投入大量资源进行环保技术研发,成功推出了一系列低能耗、低排放的电子产品。这些产品不仅满足了客户的需求,也为公司赢得了良好的社会声誉。

Genesis Microchip公司的发展小趣事

在电子行业竞争日益激烈的背景下,GI通过一系列的战略并购和整合,进一步巩固了其市场地位。公司精心挑选并收购了多家具有技术实力和市场潜力的企业,通过资源整合和优势互补,实现了技术、产品和市场的全面升级。这些并购不仅为GI带来了更多的技术专利和市场份额,还为其在未来的竞争中奠定了更加坚实的基础。

Henkel公司的发展小趣事

随着战后的经济复苏和科技的快速发展,GI开始积极寻求业务多元化和国际化的发展道路。公司不仅继续深耕电子技术领域,还逐渐涉足通信、计算机等多个领域,推出了包括通信设备、计算机硬件在内的多款新产品。同时,GI也积极开拓海外市场,通过设立分支机构、与当地企业合作等方式,成功将产品销往全球多个国家和地区。这一阶段的成功,使GI成为了名副其实的跨国电子巨头。

Anvo-Systems公司的发展小趣事

Anvo-Systems深知人才是企业发展的核心动力。因此,公司一直注重与高校和研究机构的合作,共同开展电子技术的研发与创新。通过与高校合作开展科研项目、设立奖学金等方式,Anvo-Systems吸引了大批优秀的人才加入公司。同时,公司还建立了完善的培训体系,为员工的职业发展提供了有力支持。这些举措不仅提升了公司的研发实力,也为公司的未来发展储备了丰富的人才资源。

德艺隆(DEALON)公司的发展小趣事

为了拓展国际市场,德艺隆制定了国际化战略。他们积极参加国际展会,与全球客户建立联系;同时,公司还加大了对海外市场的投入,建立了海外销售网络和售后服务体系。通过多年的努力,德艺隆的产品已经出口到多个国家和地区,赢得了国际市场的认可。

问答坊 | AI 解惑

2004年湖北省电子设计竞赛一等奖简易心电图仪

本帖最后由 paulhyde 于 2014-9-15 03:37 编辑 2004年湖北省电子设计竞赛一等奖简易心电图仪  …

查看全部问答>

DSP系统设计100问

DSP系统设计100问…

查看全部问答>

谁用DSP做过无线识别方面的东西??

本帖最后由 paulhyde 于 2014-9-15 09:12 编辑 谁用DSP做过无线识别方面的东西??进来讨论讨论  …

查看全部问答>

IGBT短路失效机理

IGBT负载短路下的几种后果 (1) 超过热极限:半导体的本征温度极限为250℃,当结温超过本征温度,器件将丧失阻断能力,IGBT负载短路时,由于短路电流时结温升高,一旦超过其热极限时,门级保护也相应失效. (2) 电流擎住效应:正常工作电流下,IGBT由于薄 ...…

查看全部问答>

proteus 的键盘在哪

单个的键(不是开关) 和 矩阵键盘…

查看全部问答>

LM3S使用Keil关于代码和变量定位

LM3S使用Keil关于代码和变量定位,我知道的,大概有2种方法: 其一:在Options for Target \'Target 1\'的Linker选项中,选择Scatter File test.sct,然后点击右边的Edit按钮,在打开的test.sct文件,编辑指定程序的加载域和运行域.其二:使用关键字__attri ...…

查看全部问答>

Verilog教程

13讲,有详细目录!相互参阅,共同进步! …

查看全部问答>

正式入手STM8S103K3

经历了很多推销的宣传,今天买了10片样品,准备把以前ATMEL8的东西都移植过来. 有几个问题,一直没搞明白: 1. STM8S103K3会不会象ATMEL那样,1000元就能把代码都读出来?STM8S103K3的     解密难度有多大? 2. 以前一直用ICC和KEIL开 ...…

查看全部问答>

2812程序烧到片内flash中运行,能否用CCS和仿真器观察内部变量

2812程序烧到片内flash中运行,能否用CCS和仿真器观察内部变量, 调试电机程序,使用仿真器容易跑飞,希望能烧到flash中运行,同时也希望能像在ccs里仿真一样观察几个关键变量,听有的工程师说是能实现的,希望有能得到指点?…

查看全部问答>

eZ430-RF2500试用心得(七)—测温成功心狂喜 显示失败眉紧锁

            经过这几天的通宵鏖战,刻苦钻研,本人的eZ430-RF2500开发板实验终于取得了突破性进展——成功的在例程中加入了DS18b20温度传感模块! 而且还有蜂鸣器,以实现高温或低温报警 ...…

查看全部问答>