首先看看配置
首先是在程序的开头写上启动中断
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
定义的变量
uint count = 0; //用于表示第几次上升沿
uint t_count = 0; //存储上升沿的计数值
uint d_count = 0; //存储第一次上升沿和下降沿的时间
uint duty = 0; //占空比
uint freq = 0; //频率
lcd的初始化
LCD_Init();
LCD_SetTextColor(Black);
LCD_SetBackColor(White);
LCD_Clear(White);
输入捕获的代码
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if( htim ->Instance == TIM2)
{
if( htim ->Channel == HAL_TIM_ACTIVE_CHANNEL_1)/*第一次上升沿*/
{
if( count == 0)
{
TIM2 ->CNT = 0; /*先把计数值给清0*/
count = 1;
}
else if( count == 1) /*第二次上升沿*/
{
t_count = TIM2 ->CCR1 + 1; /*第一次上升沿和第二次上升沿的时间间隔*/
freq = 1000000/t_count; /*计算频率*/
duty = (float)d_count/t_count*100; /*计算占空比*/
count = 0;
}
}
else if( htim ->Channel == HAL_TIM_ACTIVE_CHANNEL_2 && count == 1 )/*跟在第一次上升沿之后的下降沿*/
{
d_count = TIM2 ->CCR2 + 1; /*第一次上升沿和第二次下降沿的时间间隔*/
}
}
}
最后写个程序验证
void lcd_display()
{
char temp[30];
sprintf(temp,"%d",freq);
LCD_DisplayStringLine(Line1,(uint8_t *)temp);
sprintf(temp,"%d",duty);
LCD_DisplayStringLine(Line2,(uint8_t *)temp);
}
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
lcd_display();
}
观察现象
验证成功,还是有点准的