跳转到主要内容

MCU之TIMER输入捕获

<strong><font color="#004a85">引言</font> </strong>

华芯微特公司SWM系列单片机提供的TIMER个数和功能有些微差别,为了让您更加简单的使用这一功能,下面小编将以SWM190为例,我们今天详细讲解一下TIMER的输入捕获功能。

<strong><font color="#004a85">TIMER输入捕获</font> </strong>

<strong>一、TIMER定时器之输入捕获功能</strong>

我们今天详细讲解一下TIMER的输入捕获功能。

SWM190提供了一个用于捕捉外部脉宽的模块,可记录外部单个脉冲宽度,可通过读取相应寄存器获得脉冲高低电平的宽度。

每一个TIMER都可以配置中断。使能中断后,脉冲捕获完成会触发中断操作,如果不操作使能位,则持续记录电平宽度,直至使能位关闭。

<strong>二、SWM190 TIMER脉冲捕获功能配置库函数</strong>

下面我们以脉冲捕获为例,使用加强型定时器,使用TIMR0的Input Capture功能测量输入PWM的占空比。在此例程中,我们将使用PWM产生PWM波来产生测试信号供Input Capture功能测量;使用B6作为TIMER0的输入捕获IO口,并将测量的高电平脉冲和低电平脉冲通过串口打印。

我们之前有讲到PORT的配置方法,在这里就不在做赘述,将B6引脚通过PORT_Init设置为TIMER的输入功能引脚(PORTB_PIN6_TIMR0_IN)。

在SWM190固件库中对TIMER的配置进行了说明,下面将根据库函数对SWM190的TIMER配置,首先来看一下TIMR_Init函数的原型void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t prediv, uint32_t period, uint32_t int_en)。这个函数的实现是在SWM190_timr.c文件中,若要使用该函数在相应的应用程序的前面包含SWM190_ timr.h头文件。

函数的第一个参数为TIMR_TypeDe,它是一个结构体类型,该类型在SWM190.h中被定义。具体参数为指定TIMER模块,有效值包括TIMR0,TIMR1,TIMR2,TIMR3,BTIMR0,BTIMR1,BTIMR2,BTIMR3;

第二个参数为uint32_t mode,为TIMER模式配置,有效值包括TIMR_MODE_TIMER(定时器)、TIMR_MODE_COUNTER(计数器上升沿)、TIMR_MODE_OC(输出比较)、TIMR_MODE_IC(输入捕获);其中基础定时器只支持TIMR_MODE_TIMER(定时器);

第三个参数为uint32_t prediv,为TIMER分频配置,其中加强型定时器无分频只能为1;基本定时器可取值1-256;

第四个参数为uint32_t period,为计数周期,其中加强型定时器为32bit,基础定时器为24bit。

第五个参数为uint32_t int_en,为中断使能。

我们的函数配置为:

<pre style="overflow-x:auto; background-color:#e9e9e9;">TIMR_Init(TIMR0, TIMR_MODE_IC, 1, 0xFFFFFFFF, 0);</pre>

在TIMR_Init函数中,使用TIMER0;模式选择输入捕获;不分频;计数周期为0xFFFFFFFF;不使能中断(此中断在TIMR_IC_Init函数中使能)。

我们接下来看TIMR_IC_Init(TIMR_TypeDef * TIMRx, uint32_t captureH_int_en, uint32_t captureL_int_en)函数。

函数的第一个参数为TIMR_TypeDe,它是一个结构体类型,该类型在SWM190.h中被定义。具体参数为指定TIMER模块,有效值包括TIMR0,TIMR1,TIMR2,TIMR3;

第二个参数为captureH_int_en,为测量高电平长度完成中断使能;

第三个参数为captureL_int_en,为测量低电平长度完成中断使能;

我们的函数配置为:

<pre style="overflow-x:auto; background-color:#e9e9e9;">TIMR_IC_Init(TIMR0, 1, 1);</pre>

TIMR_IC_Init函数中配置为使用TIMER0;高电平捕获完成中断使能;低电平捕获完成中断使能;

值得一提的是,在TIMR_IC_Init库函数中,默认如果使能了高/低电平捕获完成中断使能,则就使能对应TIMER的中断。

我们使用加强型定时器0实现timer获取B1引脚上的PWM波形的高低电平,当捕获完成则进入TIMER中断,在中断中读取高电平脉冲和低电平脉冲宽度,并通过串口打印数据。

具体配置函数如下图所示:

<center><img src="http://mcu.eetrend.com/files/2021-08/wen_zhang_/100552306-215121-1.png&…; alt=“MCU之TIMER输入捕获"></center>

接下来我们看下中断服务子函数,在加强型定时器的中断服务函数中,实现每完成一次高/低电平捕获,则通过串口打印脉冲的高/低电平宽度。

<center><img src="http://mcu.eetrend.com/files/2021-08/wen_zhang_/100552306-215122-2.png&…; alt=“MCU之TIMER输入捕获"></center>

<strong>三、实验现象</strong>

下载好程序后,将B1脚和B6脚物理连接,并通过串口线将单片机与电脑连接,可在电脑端通过串口助手得到B1脚的PWM波形的高/低电平宽度。

来源:<a href="https://mp.weixin.qq.com/s/DeXKggimAUavaz_gwUc0gA">华芯微特32位MCU</a&gt;
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。