STM32 定时器TIM外设 输入捕获技术全解析:原理、电路与应用实战(铁头山羊 江协 双解析)

发布于:2025-05-28 ⋅ 阅读:(39) ⋅ 点赞:(0)

输入捕获(铁头山羊)

输入捕获基本原理

  • 捕获对象:输入捕获可测量外部输入信号时间参数,信号由上升沿和下降沿组成。

在这里插入图片描述

  • 工作方式:输入捕获电路捕捉信号变化,触发 CCX 事件,将计数器 CNT 值拍照保存到 CCR 寄存器,据此计算信号时间参数。

  • 实例讲解:以测量脉冲信号脉宽为例,配置定时器,接入信号到通道一和通道二,分别捕捉上升沿和下降沿,计算脉宽。

在这里插入图片描述

输入捕获内部电路

  • 总体结构:定时器有四个通道,通道一和通道 2、通道 3 和通道 4 内部结构一样,选取部分通道分析内部结构。

  • 输入滤波:位于电路特定位置,用于滤除输入信号上的细小毛刺,得到相对纯净信号。

  • 边沿检测:由边沿检测电路和复用器组成,可检测输入信号变化边沿,输出上升沿和下降沿信号。
    在这里插入图片描述

  • 信号选择:是一个复用器,有 TRC(从模式控制器信号)、直接和间接三路输入,常用直接和间接,可实现通道间信号交叉引用,节省引脚。

在这里插入图片描述

  • 分频器:位于电路特定部分,分频系数可设为一分频、二分频、四分频或八分频,设置不同分频系数影响触发事件和拍照动作频率,一般选一分频 。比如下图,一分频就是出现一个上升沿信号,触发事件,进行拍照。

在这里插入图片描述

输入捕获(江协)

IC(Input Capture)输入捕获

输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数

每个高级定时器和通用定时器都拥有4个输入捕获通道可配置为PWMI模式,同时测量频率和占空比

可配合主从触发模式,实现硬件全自动测量

  • 输入捕获基本概念
    • 定义与电路位置:输入捕获英文缩写 IC,全称 input capture,在定时器整体结构图中位于左边,右边是输出比较部分。
    • 资源共用情况:四个输入捕获和输出比较通道共用四个 CCR 寄存器,CH1 到 CH4 四个通道引脚也共用,同一个定时器中输入捕获和输出比较只能用其一。
    • 功能描述:输入捕获模式下,通道输入引脚出现指定电平跳变(上升沿或下降沿)时,当前 CNT 的值会锁存到 CCR 中。
    • 作用:可测量 PWM 波形的频率、占空比、脉冲间隔、电平持续时间等参数。

在这里插入图片描述

频率测量

  • 频率测量方法
    • 测频法:在闸门时间 t(通常为1s,因为频率的定义就是1s内周期的个数就是频率) 内对上升沿(或下降沿)计数得到 n,待测信号频率 FX = n /t ,适合测量高频信号,测量结果更新慢、数值相对稳定,自带均值滤波。
    • 测周法:在两个上升沿内,以标准频率 FC 计数得到 n,则频率 FX = FC /n ,适合测量低频信号,更新快、数据跳变快,结果受噪声影响波动大。
    • 中介频率:测频法与测周法误差相等的频率点,公式为 FM = √(FC /t) ,当待测信号频率小于中介频率时,测周法误差更小;大于中介频率时,测频法误差更小。(测频法和测周法都有 ±1的误差,因为结束或者开始的时候,不一定就是一个完整周期的开始或者结束) 公式是通过测频法公式中的N等于测周法公式中的N,求解除频率点。

在这里插入图片描述

输入捕获通道

  • 输入捕获电路结构

    1. 引脚与异或门设计
    • 引脚功能:CH1~CH4 为输入引脚,可通过数据选择器配置为 “独立输入” 或 “异或输入”。
    • 异或门作用
      • 用于三相无刷电机驱动,检测三个霍尔传感器的电平组合,控制换向逻辑。
      • 三个引脚任意一个电平翻转,异或门输出翻转,可简化电机位置检测电路。
    2. 输入滤波器与边沿检测器
    • 滤波器
      • 功能:滤除高频毛刺信号,通过配置 CCMR1 寄存器的 ICF 位设置采样频率与滤波长度(连续 n 个相同电平才触发输出跳变)。
      • 参数逻辑:采样频率越低、滤波长度 n 越大,抗噪能力越强。
    • 边沿检测器
      • 支持上升沿 / 下降沿触发,通过 CCER 寄存器配置触发极性。
      • 双路设计:每个通道支持两路独立滤波与极性选择(如 TI1FP1 和 TI1FP2),可交叉连接至不同捕获单元,灵活适配 PWM1 模式。
    3. 预分频器与捕获事件
    • 预分频器:通过 CCMR1 寄存器的 PSC 位配置分频系数(1/2/4/8 分频),降低触发信号频率,避免高频信号导致捕获溢出。
    • 捕获事件
      • 触发时 CNT 值锁存至 CCR,并在状态寄存器(SR)置位标志位(CCxIF),可配置为产生中断(软件干预)或直接硬件操作。
        在这里插入图片描述

在这里插入图片描述

主从触发模式

模式组成与功能

  • 主模式:定时器作为 “主设备”,通过 TRGO 引脚输出内部信号(如更新事件、比较事件),触发其他外设(如另一个定时器)。
  • 从模式:定时器作为 “从设备”,接收外部信号(如 TRGI 引脚输入)或内部信号,控制自身运行(如复位 CNT、启动计数)。
  • 触发源选择:指定从模式的触发信号(如输入捕获触发信号 TI1FP1)。

2. 硬件自动化应用:CNT 自动清零

  • 场景:测周法中,每次捕获上升沿后需清零 CNT,以测量下一个周期。
  • 配置步骤
    1. 触发源选择:选中输入捕获触发信号(如 TI1FP1)。
    2. 从模式操作:配置为 “复位模式”,触发时自动清零 CNT。
  • 优势:无需软件中断干预,完全由硬件完成捕获与清零,减轻 CPU 负担。
    在这里插入图片描述

输入捕获结构

单通道测频法(测周法实现)

在这里插入图片描述

在这里插入图片描述

// IC 模块主要代码
#include "stm32f10x.h"                  // Device header

void Ic_Init(void)
{
	//配置GPIo口 查看引脚 对应GPIo PA6
	//配置GPIO口 定时器3的通道一 的gpio引脚映射是gpioA6
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct;
	//查看Io配置 需要将io口配置为 
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	//配置时基单元 使用定时器3的通道一进行配置输入捕获 定时器2用于产生PWM信号了
	//定时器3在总线1上
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	
	
	//配置时钟选择模式为 内部时钟模式
	TIM_InternalClockConfig(TIM3);
	
	//配置时基单元结构体
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	
	//滤波的原理是固定f的频率下进行猜样,如果连续N个采样点都相同就说明输入稳定,
	//如果不相同就说明不稳定就会进行处理,f的来源有两个 内部时钟直接而来,一个就是经过分频器分频来
	//所以和时基单元关系不大
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	//这里要配置 1KHZ 占空比为50% 频率为1%的PWM波形
	TIM_TimeBaseInitStruct.TIM_Period = 65535-1;	// ARR
	TIM_TimeBaseInitStruct.TIM_Prescaler = 720-1;  // PSC
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
	
	//配置 输入捕获单元
	TIM_ICInitTypeDef TIM_ICInitStruct;
	TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;
	TIM_ICInitStruct.TIM_ICFilter = 0xF;
	TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;
	TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
	TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
	TIM_ICInit(TIM3, &TIM_ICInitStruct);
	
	//配置触发源选择
	TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
	TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);
	TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
	
	//开始时钟使能
	TIM_Cmd(TIM3, ENABLE);
}
uint32_t IC_GetFreq(void)
{
	return 100000 / TIM_GetCapture1(TIM3);
}
PWMI基本结构

在这里插入图片描述

在这里插入图片描述