打印
[其他ST产品]

STM32定时器-输入捕获

[复制链接]
189|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
略略u|  楼主 | 2023-10-28 17:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
定时器-输入捕获
输入捕获工作过程
一句话总结工作过程:通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器(TIMxCCRx)里面,完成一次捕获。

步骤1:设置输入捕获滤波器(通道1为例)



使用特权

评论回复
沙发
略略u|  楼主 | 2023-10-28 17:19 | 只看该作者
输入捕获1滤波器ICIF[3:0],这个用来设置输入采样频率和数字滤波器长度。其中, fck_INT是定时器的输入频率(TIMxCLK),一般为72Mhz,而 fDTS 则是根据TIMx_CR1的CKD[1:0]的设置来确定的,如果CKD[1:0]设置为00,那么fDTS=fck_INT。N值就是滤波长度,举个简单的例子:假设ICIF[3:0]=0011,并设置IC1映射到通道1上,且为上升沿触发,那么在捕获到上升沿的时候,再以fck_INT的频率,连续采样到8次通道1的电平,如果都是高电平,则说明这是一个有效的触发,就会触发输入捕获中断(如果开启了的话)。这样可以滤除那些高电平脉宽低于8个采样周期的脉冲信号,从而达到滤波的效果。这里,我们不做滤波处理,所以设置ICIF[3:0]=0000,只要采集到上升沿,就触发捕获。

使用特权

评论回复
板凳
略略u|  楼主 | 2023-10-28 17:20 | 只看该作者
连续采集8次通道1的电平,起滤波的作用

步骤2:设置输入捕获极性(通道1为例)


使用特权

评论回复
地板
略略u|  楼主 | 2023-10-28 17:21 | 只看该作者

使用特权

评论回复
5
略略u|  楼主 | 2023-10-28 17:21 | 只看该作者
步骤3:设置输入捕获映射通道(通道1为例)
一般情况下通道1映射到IC1,通道2映射到IC2

使用特权

评论回复
6
略略u|  楼主 | 2023-10-28 17:22 | 只看该作者

使用特权

评论回复
7
略略u|  楼主 | 2023-10-28 17:25 | 只看该作者
步骤四:设置输入捕获分频器(通道1为例)

使用特权

评论回复
8
略略u|  楼主 | 2023-10-28 17:25 | 只看该作者
步骤五:捕获到有效信号可以开启中断

使用特权

评论回复
9
略略u|  楼主 | 2023-10-28 17:26 | 只看该作者
输入捕获通道初始化函数:
void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);

使用特权

评论回复
10
略略u|  楼主 | 2023-10-28 17:26 | 只看该作者
结构体类型

typedef struct
{
    uint16_t TIM_Channel;                        //捕获通道1-4
    uint16_t TIM_ICPolarity;                //捕获极性
    uint16_t TIM_ICSelection;                //映射关系
    uint16_t TIM_ICPrescaler;                //分频系数
    uint16_t TIM_ICFilter;                        //滤波器
} TIM_ICInitTypeDef;

使用特权

评论回复
11
略略u|  楼主 | 2023-10-28 17:26 | 只看该作者
初始化例子

TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTl;
TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM5_ICInitStructure.TIM_ICFilter = Ox00;
TIM_ICInit(TIM5,&TIM5_ICInitStructure);

使用特权

评论回复
12
略略u|  楼主 | 2023-10-28 17:29 | 只看该作者
通道极性设置独立函数:
void TIM_OCxPolarityConfig(TIM_TypeDef* TIMx,uint16_t TIM_OCPolarity

使用特权

评论回复
13
略略u|  楼主 | 2023-10-28 17:29 | 只看该作者
获取通道捕获值
uint32_t TIM_GetCapture1(TIM_TypeDef* TIMx);

使用特权

评论回复
14
略略u|  楼主 | 2023-10-28 17:29 | 只看该作者
输入捕获的一般配置步骤:
1、初始化定时器和通道对应IO的时钟。

2、初始化IO口,模式为输入: GPIO Init();

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;         //PAO输入

使用特权

评论回复
15
略略u|  楼主 | 2023-10-28 17:29 | 只看该作者
3、初始化定时器ARR, PSC

TIM_TimeBaselnit();

使用特权

评论回复
16
略略u|  楼主 | 2023-10-28 17:29 | 只看该作者
4、初始化输入捕获通道

TIM_ICInit();

使用特权

评论回复
17
略略u|  楼主 | 2023-10-28 17:29 | 只看该作者
5、如果要开启捕获中断

TIM_ITConfig();
NVIC_Init();

使用特权

评论回复
18
略略u|  楼主 | 2023-10-28 17:29 | 只看该作者
6、使能定时器

TIM_Cmd();

使用特权

评论回复
19
略略u|  楼主 | 2023-10-28 17:30 | 只看该作者
7、编写中断服务函数:

TIMx_IRQHandler();

使用特权

评论回复
20
略略u|  楼主 | 2023-10-28 17:30 | 只看该作者
实验目的:测量信号的脉冲宽度

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

58

主题

502

帖子

0

粉丝