F28335 PCB电容按键调试笔记 外部中断 定时器


工作需要,要自己做一个电机的驱动板,但是公司没有现成的按键了,懒得订购,再加上自己也想学习一些新东西,就想到了直接在PCB上做电容按键的办法。(订购得提采购单,下单PCB不需要)
在这里记录一下调试过程,一来方便自己调试学习,二来也留给大伙一点资料参考。

电容按键原理

电容按键的本质就是测量一个电容的充电时间。用恒定电压给电容充电,由于电容电压不突变,电容上的电压会缓慢上升。在电压固定的情况下,电容容值越大,上升时间也就越长。 当电容按键没有被按下时,有一个充电时间T1。当我们用手指按下电容按键时,有人体接触,这个电容容值就会被改变,我们会测量到一个新的充电时间T2。当T1和T2的差值大到一定程度,我们就认为此时按键被按下了。而这个电容就是我们直接画在PCB上的一块区域。如下图,中间的圆形区域直连到引脚上,就是我们电容的正极。周围和底面的大地就是我们电容的负极。
请添加图片描述

在电路设计上,我们会通过一个很大的电阻(1MΩ)给这个电容充电,以延缓充电时间,毕竟DSP需要时间去响应。此外,还可以在按键处加一个CIN电容,CIN电容可在0PF~50PF选择。电容越小,灵敏度越高,但是抗干扰能力越差。电容越大,灵敏度越低,但是抗干扰能力越强。
在这里插入图片描述
在按键PCB设计上,我们也需要注意一些事项:
1、触摸按键可以是任何形状,但尽量集中在正方形、长方形、圆形等比较规则的形状以确保良好的触摸效果,避免将触摸按键设计成窄长的形状。
2、按键在TOP层,按键周围铺地可以是实地或网格地,离按键要有0.75mm以上的距离。BOTTOM的铺地一般使用网格地,网格线宽0.25mm,大小1mm*1mm。
3、信号线需要走BOTTOM层,不要再信号线附近保留死铜。信号线尽量短且细,避免与其他感应信号线平行。
详细可参考:触摸按键设计指南电容触摸按键实验

电容触摸按键软件设计

理论上,一个触摸按键需要接两个pin,一个IO给按键充放电,一个ADC采样按键电压,计算充电时间。但是我这里板子空间受限,从ADC拉线贼不方便,因此我打算只有一个IO用作放电和时间检测,另加一个3.3V电源用于充电。
按键检测流程如下:
1、IO首先设定为输出口输出低电平,将电容放电到0。同时开启定时器开始计数。
2、IO设定为外部中断模式,上升沿触发。当按键电压上升到一定值时,触发中断。
3、在中断函数中读取定时器数值,并与标准值(提前测出的)相比较,若差值过大,则判定为按键被按下。
理论可行,现在开始配置!

外部中断配置

首先是基本的IO口配置,打开IO的输入时钟,设置成悬空输入模式,再打开外部中断时钟,

    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    //enable GPIO input clock

    GpioCtrlRegs.K2MUX.bit.K2IO = GPIOMUX_GPIO;
    GpioCtrlRegs.K2DIR.bit.K2IO = GPIODIR_INPUT;
    GpioCtrlRegs.K2PUD.bit.K2IO = GPIOPUD_FLOAT;
    GpioCtrlRegs.K2QSEL.bit.K2IO = 0;   //XINT1 clk synic with SYSCLKOUT

然后就是外部中断的配置了,这里需要注意:外部中断一共只有7个接口(XINT1-XINT7)。想使用某个IO口做为外部中断,需要先将IO口连接到外部中断源上。其中XINT1和XINT2供GPIO0~GPIO31使用。XINT3-XINT7供GPIO32-GPIO63使用。也就是说,0-31这32个IO口里面只能同时选2个IO口出来做外部中断,32-63这32个IO口只能同时选5个IO出来做外部中断。请添加图片描述

这里就有了一个错误示范。我的K1接到了GPIO72上,而IO72是不支持外部中断的。因此本文只能使用K2为大家做调试示范。K2连接到了GPIO28上,也就只能再XINT1和XINT2中选一个连接。因为一般教程都用的 XINT1,那这里我们选择XINT2。然后就是写中断服务函数到中断向量表,中断服务函数名是可以自定义的。
在这里插入图片描述

    GpioIntRegs.GPIOXINT2SEL.bit.GPIOSEL = IONUM;  //XINT2 select IONUM=28;
    PieVectTable.XINT2 = &EXTI2_KEY2;		//中断服务函数名可以自定义

然后是打开总中断,在F28335寄存器手册 149页中可以查到XINT2是在INT1.5的位置
在这里插入图片描述

PieCtrlRegs.PIEIER1.bit.INTx5 = 1; //我们要打开INT1.5,因此PIEIER选1,INTx选5。
XIntruptRegs.XINT2CR.bit.POLARITY = POLARITY_RISING;  // 可选上升沿,下降沿,上升下降沿都触发。这里我们选上升沿触发
XIntruptRegs.XINT2CR.bit.ENABLE= 1; // 开始XINT2中断

IER |= M_INT1	//这里是全局中断中INT1.5 的INT1,不是外部中断的XINT1。
EINT;
ERTM;		//开启全局中断。

中断服务函数目前只有清楚中断标志位,具体内容需要联动定时器设置,后续再完善。

interrupt void EXTI2_KEY2(void){
	
    PieCtrlRegs.PIEACK.bit.ACK1=1;	//ACK1即全局中断中的 INT1,只要在INT1中触发的中断都是这样清的
}

定时器设置

电容按键本质上是检测电容电压的上升时间来判断按键是否被按下的,因此我们需要定时器来记录每次电压上升时间。
F28335一共有3个定时器TIMER0/1/2。他们内部结构都是一样的,如下图:
在这里插入图片描述
右边两个timer period寄存器PRD和counter寄存器TIM很好理解。TIM是一个计数器,每个时间周期(预分频时钟周期,并不是系统时钟周期)会自减1,当减0时,会产生一个定时器中断信号。同时PRD中的值会装载进TIM中,进行下一次计数。也就是说,我们要计时的时间是写入PRD中的,而不是直接写入TIM中的(要直接写进TIM也行,但是就得每次计数完重新写)。PRD记录我们设定的时间,而TIM进行实际的计数工作。
左边两个TDDR和PSC寄存器被称为预分频寄存器,但本质上和TIM,PRD寄存器的作用是一样的。在每个系统时钟周期PSC会自动减1,当减到0时,就会触发TIM自动减1。这样就起到了预分频的作用。PSC减到0的同时,TDDR的值也会装载进PSC中,进行下一次计数。
比如:当TDDR写0时,就是0+1=1不进行预分频,此时TIM的周期就是系统时钟周期;当TDDR写1时,就是1+1=2进行2分频,此时TIM周期就是系统时钟周期的一倍。也可以简单的认为,总计数时间就是TDDR*(PRD+1)。
在进行时钟操作时,TIM和PRD都有相应的寄存器,可以直接进行读写。
而左边两个TDDR和PSC寄存器就整不明白了,因为在文档给出的寄存器手册中并不能直接找到这两个寄存器,能找到的是一个叫TPR的寄存器,我们翻到TPR寄存器的描述这里会发现一个奇怪的东西,如下图:
在这里插入图片描述
PSC和TDDR竟然是藏到TPR里面的,而且高8位和低8位还是分开的。实在想不明白为什么要这样操作。。。
初始化代码如下,因为我们只需要定时,不需要定时器去触发中断,因此中断相关的内容都可以屏蔽掉。
其实主要配置的也就TDDR和PRD这两个寄存器,需要注意,配置之前要将TCR中的TSS位置1,让定时器停止工作,不然会出现预期之外的错误。

void TIM0_Init(Uint32 divide, Uint32 count){
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // enable CPU Timer0
    //PieVectTable.TINT0 = &TIM0_Int;   //no interrupt required
    EDIS;

    CpuTimer0.RegsAddr = &CpuTimer0Regs; //
    CpuTimer0.InterruptCount = 0;   // Reset interrupt counter:
    CpuTimer0.CPUFreqInMHz = (float)mainCLK;
    CpuTimer0.PeriodInUSec = (float)count;

    CpuTimer0Regs.TCR.bit.TSS = TSS_STOP; //makr sure timer0 in stop state

    CpuTimer0Regs.TPR.all = divide && 0xFF;      //all TPR 32bit 4.29 billion
    CpuTimer0Regs.TPRH.all = divide >> 8;
    CpuTimer0Regs.PRD.all = count;
    CpuTimer0Regs.TCR.bit.TRB = TRB_RELOAD; //ereload TIM&PSC(in TPR)

    // Initialize timer control register:
    CpuTimer0Regs.TCR.bit.SOFT = 0;
    CpuTimer0Regs.TCR.bit.FREE = 0;     // FREE:SOFT    0,0 :stop timer after timer decrements by 1    0,1 :stop timer when it become 0   1,x:free run
    CpuTimer0Regs.TCR.bit.TIE = 0;      // 0 = Disable/ 1 = Enable Timer Interrupt

    CpuTimer0Regs.TCR.bit.TSS = TSS_START; //enable Timer
    //IER |= M_INT1;
    //PieCtrlRegs.PIEIER1.bit.INTx7 = 1;

    //EINT;
    //ERTM;//enable global interrupt
}

配置完记得TSS位置0,让定时器开始工作,这部分就完成了!

整合

准备工作都完成了,接下来就是整合了。
首先是给电容放电,放电完成后,让GPIO处于外部触发模式,同时TIM开始计时,当外部中断触发时,读取当前TIM时间,比较现在的时间和初始化时的时间,如果时间差异过大,就说明我们的电容按键被按下了。

Uint32 measurekey2(void){
    EALLOW;
    GpioCtrlRegs.K2DIR.bit.K2IO = GPIODIR_OUTPUT;
    GpioCtrlRegs.K2PUD.bit.K2IO = GPIOPUD_PULLUP;
    K2_LOW;	//给电容按键放电
    DELAY_US(2);
    CpuTimer0Regs.TCR.bit.TRB = TRB_RELOAD;	//定时器归零
   // DELAY_US(10);
    GpioCtrlRegs.K2DIR.bit.K2IO = GPIODIR_INPUT;
    GpioCtrlRegs.K2PUD.bit.K2IO = GPIOPUD_FLOAT;	//外部触发模式,等待电容充电
    EDIS;
    //keytime=0;
    while(!keyreadover);	//当触发后,读取TIM的值。
    keyreadover=0;
    return keytime;
}

//完善中断函数
interrupt void EXTI2_KEY2(void){

    keytime = CpuTimer0Regs.TIM.all;	//读取TIM的值
    keyreadover=1;
    EALLOW;
    PieCtrlRegs.PIEACK.bit.ACK1=1;
    EDIS;
}

到此我们的电容按键就完成了!
当然按键防抖也不能少,不过这里就不赘述了,只要我们能读取时间,那电容按键和普通机械按键就没有区别了,防抖操作都是一样的。

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: F28335 PCB库是指专门用于设计和制造F28335或基于F28335微控制器的电路板的元件库。F28335是德州仪器(TI)公司推出的一款高性能数字信号处理器(DSP)微控制器,主要应用于实时控制、通信和数字信号处理等领域。 PCB库中的元件包括与F28335微控制器相关的器件,例如晶体振荡器(Crystal Oscillator)、电压稳压器(Voltage Regulator)等。这些器件能够为F28335微控制器提供稳定的电源和时钟信号,确保其正常运行。 此外,PCB库中还包含连接F28335微控制器与外部电路的接口器件,如封装好的连接器、电容和电阻等。这些器件能够实现F28335与其他外部设备的通讯和数据传输。 使用F28335 PCB库有助于简化F28335微控制器电路板的设计过程。设计者可以直接在设计软件中选择需要的元件,并将其拖拽到相应位置,快速搭建出电路板的原型。这样不仅提高了设计效率,还降低了设计成本和错误的风险。 F28335 PCB库不仅可以为初学者提供零基础的电路板设计参考,还方便了专业工程师的工作。他们可以根据自己的需求,灵活选择合适的元件,进行定制化的设计。 总之,F28335 PCB库是为设计和制造F28335微控制器电路板而提供的元件库,能够简化设计过程,提高效率和降低成本。对于使用F28335微控制器的项目和应用来说,它是一个非常有用的工具。 ### 回答2: F28335是德州仪器(Texas Instruments)公司推出的一款32位数字信号控制器(Digital Signal Controller,DSC),适用于实现高性能实时控制系统。PCB库是指电子元器件的物理布局和连接方式的库,通常包括元器件的二维布局、连线规则等信息。 在设计和制造F28335控制器相关的PCB时,可以使用F28335 PCB库,它包含了与F28335控制器兼容的电子元器件的物理布局和连接方式等信息。这样的库能够提供方便快捷的元器件选择和布局参考,有助于减少设计时间和成本。 F28335 PCB库通常包括以下内容: 1. F28335器件封装信息:F28335器件的尺寸、引脚排列、间距等信息,以便于正确放置和连接。 2. 其他器件:与F28335器件配套使用的其他器件的封装信息,如电源芯片、外围接口芯片等。 3. 连接规则:F28335器件与其他器件之间的连接方式,包括引脚的连接顺序、连接电路等细节。 4. 样例布局:一些典型的电路板布局示例,供设计者参考和借鉴。 使用F28335 PCB库,设计者可以更快速地完成与F28335控制器相关的PCB设计工作。该库提供了与F28335器件兼容的元器件布局和连接方式的信息,使得设计者能够更加高效地设计出符合要求的控制系统电路板。这样可以大大减少设计和制造过程中可能出现的错误和问题,提高设计的准确性和可靠性。 ### 回答3: F28335 PCB库是指用于设计和制造基于F28335芯片的电路板的元件库。F28335是德州仪器(Texas Instruments)公司推出的一款高性能数字信号处理器(DSP),广泛应用于各种工业自动化、电力电子、机器人控制等领域。 PCB库即指包含了F28335芯片周边的电路元件库,其中包括与F28335芯片进行通信和控制所需的电路元件,如电源管理芯片、电容、电感、晶体振荡器、时钟发生器等。这些元件是设计和制造F28335电路板的基本构建单元。 F28335 PCB库的作用是为设计师提供了一个方便、高效的工具,使他们能够快速搭建基于F28335芯片的电路板原型。通过使用PCB库,设计师可以快速选择和布局所需的元件,并在设计过程中进行必要的电路连接和调整。PCB库中的元件通常已经经过验证和测试,可以保证设计的可靠性和稳定性。 使用F28335 PCB库还可以大大提高设计的效率和精度。设计师可以充分利用现有的元件库进行快速原型开发,减少设计时间和成本。此外,通过使用经过优化的元件布局和电路连接,还可以提高电路的性能和可靠性。 总之,F28335 PCB库是一个重要的工具,为设计和制造F28335电路板提供了方便和快捷的方式。它具有简化设计流程、提高设计效率和确保电路可靠性等优势,对于开发基于F28335芯片的各种应用具有重要的意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值