由于输入捕获与输出比较公用同一路定时器通道,所以一路通道上不能同时使用IC和OC。
测频法适用于高频信号,测周法适用于低频信号。
滤波器用来滤除输入信号的噪声。配置了从模式后,一旦接收到要捕捉的边沿,硬件自动触发从模式电路,减少软件资源的使用。一通道与二通道是交叉相连的,即边沿检测器可以生成两个触发信号,同时用于触发另一个通道,因此可以同时用两个通道捕获一个输入信号。
双通道同时捕获一个输入信号:占空比=CCR2/CCR1
#include "stm32f10x.h" // Device header
/**
* 函 数:输入捕获初始化
* 参 数:无
* 返 回 值:无
*/
void IC_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//开启定时器2的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructrue;
GPIO_InitStructrue.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructrue.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructrue.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructrue);//初始化PA0引脚为上拉输入
TIM_InternalClockConfig(TIM3);//选择内部时钟源作为时钟/8MHz
TIM_TimeBaseInitTypeDef TimeBaseInitStructrue;
TimeBaseInitStructrue.TIM_ClockDivision= TIM_CKD_DIV1;//不分频
TimeBaseInitStructrue.TIM_CounterMode= TIM_CounterMode_Up;//向上计数模式
TimeBaseInitStructrue.TIM_Period= 65536-1;//ARR
TimeBaseInitStructrue.TIM_Prescaler= 72-1;//分频值//PSC
TimeBaseInitStructrue.TIM_RepetitionCounter= 0;//重复计数功能,此处不涉及
TIM_TimeBaseInit(TIM3,&TimeBaseInitStructrue);//读取结构体
/*输入捕获配置*/
TIM_ICInitTypeDef TIM_ICInitStructrue;
TIM_ICInit(TIM3,&TIM_ICInitStructrue);
TIM_ICInitStructrue.TIM_Channel=TIM_Channel_1;//选择通道1
TIM_ICInitStructrue.TIM_ICFilter=0xF;//滤波器
TIM_ICInitStructrue.TIM_ICPolarity=TIM_ICPolarity_Rising;//上升沿触发
TIM_ICInitStructrue.TIM_ICPrescaler=TIM_ICPSC_DIV1;//分频参数
TIM_ICInitStructrue.TIM_ICSelection=TIM_ICSelection_DirectTI;//直连通道
/*触发源与从模式*/
TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);//触发源配置
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);//从模式配置
TIM_Cmd(TIM3,ENABLE);//启动定时器
}
/**
* 函 数:获取输入捕获的频率
* 参 数:无
* 返 回 值:捕获到的信号的频率
*/
uint16_t IC_GetFreq(void)
{
return 1000000/(TIM_GetCapture1(TIM3)+1);//测周法得到频率fx = fc / N,这里不执行+1的操作也可
}