• STM32定时器-输入捕获


    定时器-输入捕获

    输入捕获工作过程

    一句话总结工作过程:通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器(TIMxCCRx)里面,完成一次捕获。

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

    在这里插入图片描述

    输入捕获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,只要采集到上升沿,就触发捕获。

    连续采集8次通道1的电平,起滤波的作用

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

    在这里插入图片描述

    在这里插入图片描述

    步骤3:设置输入捕获映射通道(通道1为例)

    一般情况下通道1映射到IC1,通道2映射到IC2

    在这里插入图片描述

    在这里插入图片描述

    步骤四:设置输入捕获分频器(通道1为例)

    在这里插入图片描述

    步骤五:捕获到有效信号可以开启中断

    在这里插入图片描述

    输入捕获通道初始化函数:

    void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);
    
    • 1

    结构体类型

    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    初始化例子

    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    通道极性设置独立函数:

    void TIM_OCxPolarityConfig(TIM_TypeDef* TIMx,uint16_t TIM_OCPolarity
    
    • 1

    获取通道捕获值

    uint32_t TIM_GetCapture1(TIM_TypeDef* TIMx);
    
    • 1

    输入捕获的一般配置步骤:

    1、初始化定时器和通道对应IO的时钟。

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

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; 	//PAO输入
    
    • 1

    3、初始化定时器ARR, PSC

    TIM_TimeBaselnit();
    
    • 1

    4、初始化输入捕获通道

    TIM_ICInit();
    
    • 1

    5、如果要开启捕获中断

    TIM_ITConfig();
    NVIC_Init();
    
    • 1
    • 2

    6、使能定时器

    TIM_Cmd();
    
    • 1

    7、编写中断服务函数:

    TIMx_IRQHandler();
    
    • 1

    实验目的:测量信号的脉冲宽度

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    微信小程序--数字化会议OA系统之首页搭建
    C++学习资源
    web前端零基础入门1
    K8S配置资源管理
    大一学生《Web编程基础》期末网页制作 HTML+CSS+JavaScript 网页设计实例 企业网站制作
    【日记】gulp之删除文件
    理解循环神经网络(RNN)
    docsify项目部署(华为云+宝塔+centos+docker+nginx)踩坑指南
    【BOOST C++ 18 数字处理】(3)Boost.MinMax
    Linux中如何执行脚本
  • 原文地址:https://blog.csdn.net/weixin_46251230/article/details/126761943