思路:
定时器TIM1的CH2捕获通道测量外部输入信号频率(硬件已整形为方波);
我的思路.
?设定时器输入时钟的频率是72MHZ,预分配系数为0,则该定时器能够测量的最低频率是1100HZ,(若想测更低的频率,可以另取通道分频。预分频系数的计算CK_INT/(Prescaler+1)??Prescaler介于0x0000到0xffff之间)
定时器TIM1设为输入捕获模式,外部信号(经整形后)从通道CH2进入,并相应串口设为浮空输入,高电平有效,在捕获中断中计算2次捕获值的差值,从而计算信号频率。
主程序如下:
int main(void)
{
??RCC_Configuration();
??SysTick_Configuration();
???
?
??NVIC_Configuration();
?
??GPIO_Configuration();
?//??TIM_Configuration( );//TIM初始化函数?
?
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; //选择通道2
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //输入上升沿捕获
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; // 通道方向选择(相位)
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //每次检测到捕获输入就触发一次捕获
//(预分频系数)
TIM_ICInitStructure.TIM_ICFilter = 0x0; //滤波系数
TIM_ICInit(TIM1,&TIM_ICInitStructure);
?
?
TIM_ITConfig(TIM1,TIM_IT_CC2,ENABLE); //打开中断
TIM_Cmd(TIM1,ENABLE); //启动TIM1
while(1);
?
}
?void GPIO_Configuration();
{
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
?Tim1_SetupNVIC();
}
中断配置:
void Tim1_SetupNVIC(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
#ifdef VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
#endif
NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
中断里面做的事情:
void TIM1_IRQHandler(void)// 用相应的定时器中断?
if (TIM_GetITStatus(TIM1,TIM_IT_CC2) != RESET)//是TIM1CH2
{
TIM_ClearITPendingBit(TIM1,TIM_IT_CC2);//清空捕获标志
if(capture_number==0 )//第一次捕获
{
?Ic1_readvalue1 = TIM_GetCapture2(TIM1);//保留捕获值
?capture_number=1;//设置标志
}
else if(capture_number==1)//第二次捕获
{
??Ic1_readvalue2 = TIM_GetCapture2(TIM1);//保留捕获值
}
if(Ic1_readvalue1>Ic1_readvalue2)//考虑是否溢出,计算两次的差值
{
?CAPTURE=Ic1_readvalue2-Ic1_readvalue1-1;
}
else
{
?CAPTURE=Ic1_readvalue2-Ic1_readvalue1-1+0xffff;
}
TIM1_FREQ =(u32)72000000/ CAPTURE;计算实际频率值 若是已经分频或者时钟也改变则相应的也对改变
?}
capture_number=0;
}
} }