• STM32通用定时器输入捕获


    通用定时器输入捕获部分框图介绍

    在这里插入图片描述

    通用定时器输入捕获脉宽测量原理

    在这里插入图片描述
    要测量脉宽的高电平的时间:t2-t1=(脉宽下降沿时间点-脉宽上升沿时间点)

    假设:递增计数模式
    ARR:自动重装载寄存器的值
    CCRx1:t1时间点CCRx的值
    CCRx2:t2时间点CCRx的值

    产生捕获事件时,会让CNT的值转移到CCRx寄存器
    t1时要把CNT的值清0,同时把通道的边缘检测改为下降沿检测

    递增计数模式下,溢出条件:CNT==ARR,实际记得个数(ARR+1)

    高电平期间:计数器计数的个数:N*(ARR+1) + CCRx2

    计数频率:Ft/(PSC+1)
    因此,记一个数的时间:(PSC+1)/Ft

    通用定时器输入捕获实验配置步骤

    1. 配置定时器基础工作参数:HAL_TIM_IC_Init()
    2. 定时器输入捕获MSP初始化:HAL_TIM_IC_MspInit(),配置NVIC、CLOCK、GPIO等
    3. 配置输入通道映射、捕获边沿等:HAL_TIM_IC_ConfigChannel
    4. 设置优先级,使能中断:HAL_NVIC_SetPriority()、HAL_NVIC_EnableIRQ()
    5. 使能定时器更新中断:HAL_TIM_ENABLE_IT()
    6. 使能捕获、捕获中断及计数器:HAL_TIM_IC_Start_IT()
    7. 编写中断服务函数:TIMx_IRQHandler() —> HAL_TIM_IRQHandler()
    8. 编写更新中断和捕获回调函数:HAL_TIM_PeriodElapsedCallback()、HAL_TIM_IC_CaptureCallback()

    相关HAL库函数介绍

    HAL_TIM_IC_Init():初始化定时器基础参数
    HAL_TIM_IC_MspInit():存放NVIC、CLOCK、GPIO初始化代码
    HAL_TIM_IC_ConfigChannel():配置通道映射、捕获边沿、分频、滤波等
    __HAL_TIM_ENBALE_IT():使能更新中断
    HAL_TIM_IC_Start_IT():使能输入捕获、捕获中断并启动计数器
    HAL_TIM_IRQHandler():定时器中断处理公用函数,处理各种中断
    HAL_TIM_PeriodElapsedCallback():定时器更新中断回调函数,由用户重定义
    HAL_TIM_IC_CaptureCallback():定时器输入捕获回调函数,由用户重定义

    关键结构体介绍

    typedef struct
    {
    	uint32_t ICPolarity; //输入捕获触发方式选择,比如上升、下降捕获
    	uint32_t ICSelection; //输入捕获选择,用于设置映射关系
    	uint32_t ICPrescaler; //输入捕获分频系数
    	uint32_t ICFilter; //输入捕获滤波器设置
    }HAL_TIM_InitTypeDef;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    实战

    通过定时器5通道1来捕获按键高电平脉宽时间,通过串口打印出来

    1. 确定计数器工作频率:1MHZ计数频率为例,PSC=71,ARR=65535
      在这里插入图片描述
      溢出时间65536
    2. 配置输入捕获方式:上升沿捕获,IC1映射在TI1上、不分频、不滤波
  • 相关阅读:
    零基础入门金融风控之贷款违约预测挑战赛——简单实现
    vue - 登录 API 接口的封装
    Python 操作 Excel
    运维常用概念
    如何解决php脚本运行占用内存过大无法释放或者内存不足的问题
    使用git、git-flow与gitlab工作
    给你安利一款带有AI功能的数据库管理工具
    Jenkins CI/CD 持续集成专题二 Jenkins 相关问题汇总
    webpack笔记(二)
    nginx自动化脚本安装
  • 原文地址:https://blog.csdn.net/Caramel_biscuit/article/details/136292398