- 当通道输入引脚出现指定电平跳变时,当前计数器(CNT)的值将被锁存到捕获比较寄存器(CCR)中。这可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数。
- 每个高级定时器和通用定时器都具有4个输入捕获通道。
- 输入捕获模式可配置为PWMI(PWM输入)模式,同时测量信号的频率和占空比。
- 可配合主从触发模式,实现硬件全自动测量。
输入捕获是接收外部信号,执行CNT锁存到CCR的动作。
频率测量
输入捕获是测周法。
电路部分
异或门:当三个引脚的任何一个有电平翻转时,输出引脚就产生一次电平翻转,3个引脚电平都相同为0,3个引脚中有高有低为1。如果有两个输出引脚,选上面就异或输出,下面就当异或门没用。
经过滤波后信号有两路,可以直接经过TI1FP1引脚输入通道1,也可以通过TI1FP2输入到通道2。
这样交叉连接可以实现两个通道(IC)对一个引脚(CH)进行捕获,就可以同时测量频率和占空比。
CCR每捕获一次CNT的值都需要对CNT进行一次清零操作。
主从触发模式
主模式是将定时器内部的信号映射到TRGO引脚,用于触发其他外设。
从模式是根据触发源的信号去触发自身定时器的一些操作。
而上面的清零操作就可以用从模式的清零。TI1FP1输出上升沿,CCR1就捕获CNT的值,而上升沿也触发从模式使CNT清零。这样CCR1的值就是一个周期的值,也就是N。
预分频器里的就是驱动CNT的标准频率,标准频率 fc= 72M / 预分频系数
所以测量频率 = fc / N
若将TI1FP2输出下降沿,CCR2捕获CNT的值,那么CCR2的值就是一个周期的高电平的值。
所以占空比 = CCR2 / CCR1
代码部分
IC.c
#include "stm32f10x.h" // Device header
void IC_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
TIM_InternalClockConfig(TIM3);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period = 65536-1; //ARR的值
TIM_TimeBaseInitStruct.TIM_Prescaler = 72-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_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset); //从模式
TIM_Cmd(TIM3,ENABLE);
}
uint32_t IC_GetFreq(void)
{
return 1000000 / (TIM_GetCapture1(TIM3) + 1);
}
若测占空比,要配置好另一个通道,而下面这个函数会自动配置相应的通道。1和2,3和4。
TIM_PWMIConfig(TIM3,&TIM_ICInitStruct); //配置通道2,自动配置成相反模式