只有上升沿触发。计数值为0到0xfffffff,即429467295.
tim2挂载的apb1的频率为100 000 000
tim.c中添加
uint32_t DIff=0;//差值
uint8_t CaptureIndex=0;//捕获标志位
uint8_t MeasureFlag=0;//测量计算标志位
uint32_t CapVal1=0;//捕获值1
uint32_t CapVal2=0;//捕获值2
/* USER CODE END PV */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2)
{
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)//两次判断
{
if(CaptureIndex==0)//捕获标志位判断
{
CapVal1= HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//读捕获值1
CaptureIndex=1;//捕获标志位=1
}
else if(CaptureIndex==1)//连续读值
{
CapVal2= HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);
CaptureIndex=0;//捕获标志位置位
MeasureFlag=1;//测量标志位置1
HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_1);//关闭中断
}
else
{
Error_Handler();//错误处理
}
}
}
}
main.c中添加
//tim输入捕获
extern uint32_t DIff;//差值
extern uint8_t CaptureIndex;//捕获标志位
extern uint8_t MeasureFlag;//测量计算标志位
extern uint32_t CapVal1;//捕获值1
extern uint32_t CapVal2;//捕获值2
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);//输入捕获中断开启
while(1)中添加:
if(MeasureFlag==1)//测量位判断
{
if(CapVal2>=CapVal1)//注意这里分两种情况
{
DIff=CapVal2-CapVal1;
}
else
{
DIff=((4294967295+1-CapVal1)+CapVal2);//这种情况在捕获值1在一个计数周期的结束,而捕获值2是下个计数周期的开始
}
Uart_printf(&huart1,"DIFF=%.8f\r\n",DIff/1.0);
Uart_printf(&huart1,"Period=%.8fs\r\n",DIff/10000000.0);//这里的100 000 000是tim2经分频后的频率。
Uart_printf(&huart1,"Fred=%dHz\r\n",100000000/DIff);
Uart_printf(&huart1,"\r\n");
MeasureFlag=0;//置位测量标志位
HAL_Delay(1000);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);//再次开启下次捕获
}
但是由于内部时钟源的精度有限,采的频率会比实际小5%。建议软件处理。