文章目录
输入捕获(铁头山羊)
输入捕获基本原理
- 捕获对象:输入捕获可测量外部输入信号时间参数,信号由上升沿和下降沿组成。
工作方式:输入捕获电路捕捉信号变化,触发 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),可配置为产生中断(软件干预)或直接硬件操作。
- 触发时 CNT 值锁存至 CCR,并在状态寄存器(SR)置位标志位(CCxIF),可配置为产生中断(软件干预)或直接硬件操作。
主从触发模式
模式组成与功能
- 主模式:定时器作为 “主设备”,通过 TRGO 引脚输出内部信号(如更新事件、比较事件),触发其他外设(如另一个定时器)。
- 从模式:定时器作为 “从设备”,接收外部信号(如 TRGI 引脚输入)或内部信号,控制自身运行(如复位 CNT、启动计数)。
- 触发源选择:指定从模式的触发信号(如输入捕获触发信号 TI1FP1)。
2. 硬件自动化应用:CNT 自动清零
- 场景:测周法中,每次捕获上升沿后需清零 CNT,以测量下一个周期。
- 配置步骤
- 触发源选择:选中输入捕获触发信号(如 TI1FP1)。
- 从模式操作:配置为 “复位模式”,触发时自动清零 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);
}