历史上的今天
返回首页

历史上的今天

今天是:2024年09月29日(星期日)

正在发生

2018年09月29日 | STM32f4---电容触摸按键实验代码(02)

2018-09-29 来源:eefocus

//定时器 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无法执行,从而死机。  

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


推荐阅读

史海拾趣

Ecera Comtek Corp公司的发展小趣事

Ecera Comtek Corp公司成立于XX世纪初,由几位热衷于电子通信技术的工程师共同创立。初创时期,公司面临着资金短缺、技术挑战和市场竞争等多重压力。然而,创始人们凭借对技术的热情和执着,不断研发创新产品,逐渐在行业内树立了口碑。他们经常通宵达旦地工作,试验新的设计方案,努力提升产品的性能和稳定性。经过数年的努力,Ecera Comtek Corp公司终于推出了首款具有竞争力的无线通信设备,为公司的发展奠定了坚实的基础。

ASSMANN WSW components公司的发展小趣事

随着公司规模的扩大和产品质量的提升,ASSMANN WSW components公司开始积极拓展全球市场。通过与全球知名企业的合作,公司成功打入国际市场,产品远销海外。同时,公司还积极参加国际电子展会和交流活动,与全球同行建立了广泛的合作关系。这些举措不仅提升了ASSMANN WSW的品牌知名度和影响力,还为公司带来了更多的商业机会和发展空间。

CCS[Custom Computer Services]公司的发展小趣事

在电子行业中,产品质量和客户服务是企业生存和发展的关键。CCS公司始终坚持质量第一的原则,建立了严格的质量管理体系和客户服务体系。公司从原材料采购到产品生产、销售等各个环节都进行严格的质量控制,确保产品的质量和性能达到客户的期望。同时,CCS公司还提供了全方位的客户服务,包括售前咨询、售后服务和技术支持等,为客户提供了全方位的支持和帮助。

ELEMENT14公司的发展小趣事

ELEMENT14始终将提升服务质量和客户满意度作为首要任务。公司建立了完善的客户服务体系,提供快速响应、专业解答的客户服务。同时,ELEMENT14还定期开展客户满意度调查,针对客户的反馈和建议进行改进。这些努力不仅提升了客户满意度,也增强了公司的品牌形象和市场竞争力。

AW Industries Inc公司的发展小趣事

在国内市场取得成功后,AW Industries Inc开始寻求国际化发展。公司首先选择了几个具有潜力的海外市场进行拓展,并通过与当地企业合作、建立销售网络等方式逐步打开市场。随着国际化战略的深入实施,公司的业务范围不断扩大,国际市场份额也逐步增加。

潮州三环(Three-circle)公司的发展小趣事

潮州三环(集团)股份有限公司,最初成立于1970年,主要从事陶瓷基体及固定电阻器的制造和销售。然而,随着电子行业的快速发展,公司意识到单一产品已无法满足市场需求。因此,在1996年,三环集团开始投资生产片式电阻用的氧化铝陶瓷基片,这一决策标志着公司正式进入片式化元件制造领域。通过引进国外先进设备和技术,三环集团成功实现了电阻及瓷体的自动化生产,为公司后续的发展奠定了坚实基础。

问答坊 | AI 解惑

关于2009年全国竞赛网上发题的预通知

本帖最后由 paulhyde 于 2014-9-15 09:30 编辑 各赛区组委会、各参赛学校: 为进一步规范竞赛组织工作、加强竞赛的公正公平性,全国竞赛组委会决定,2009年全国大学生电子设计竞赛采用网上发题方式,在9月2日开赛时依托数个网站进行竞赛题目下 ...…

查看全部问答>

PCB 两焊盘之间如何设置过一条导线

通过PCB向导可以实现,但如果手工绘制PCB,,如何设置两焊盘之间过一条导线呢…

查看全部问答>

点烟器手机,你敢用吗?

据国外媒体报道,一家超强的山寨厂最近设计出一种令人匪夷所思的手机,它包含一个点烟器,可以通过隐藏在摄像头孔中的点烟器点香烟。 当然,这上去是个点烟器,实际上也是一台手机,它拥有2.5英寸触摸屏,3波段GSM,支持双SIM卡,还有130万像素摄 ...…

查看全部问答>

弱弱问一句:stm32是在什么平台上开发的?

                                 平常用的最多的是ads1.2,刚接触stm32,从零开始的小朋友。…

查看全部问答>

2812发热问题

2812发热问题 求教各位高手: 我的f2812板子加上仿真器仿真程序正常,然后烧写成功后上电运行不成功,再烧写成功了2次后, 上电以后2812发热厉害,几秒钟就烫手。加上仿真器后,能复位,能load program,但是运行程序很快就挂掉了,报告出错,求 ...…

查看全部问答>

学“TI精品讲堂第一课”有感!(感慨多多问题多多,希望各位大神帮忙解答)

刚才学习了TI精品讲堂第一课,感触多多!(帖子没发错位置吧,为节省大家时间下面重点会用加粗加大表示,解答问题的大神可以直接到最后)1课堂设计的界面很不错,河蟹简洁。。。但是为啥不能用chrome浏览器呀!2那位大神(演讲那个叫什么忘了)耐心 ...…

查看全部问答>

为什么回复会出现这样的问题?

这周开始,论坛的回复后经常出现这样的界面: 请问怎么回事呢?重新打开页面就能正常回复了。…

查看全部问答>

msp430单片机和GPRS模块连接中的返回值返回到哪里?

我在用MSP430编程给GPRS模块AT指令的时候,GPRS模块会返回比如“OK\"返回值,那么,我想在编程中检测到”ok\"后再进行下一条命令传输,我从哪个寄存器中去检测“ok\"呢?…

查看全部问答>

ads1115系列问题

请问各位大神,ADS1115的通道选择是怎么控制的啊,用AIN四个引脚怎么学配置呢?ADDR和ALERT/RDY引脚是怎么用的?加参考电压应该怎么加啊?转换之后的数据该怎么算呢?(全都选择默认设置:confige register:0x84和0x83)请求各位大神的帮助! …

查看全部问答>