今天我们来看国赛是怎么考输入捕获频率的:
当然看过我写的省赛的小伙伴们,这个东西还是算比较简单的。
先补充几个知识点吧:
看到我标上了红色的箭头这样连上之后才能进行输入捕获哟,记得连山哈。
先介绍一下变量(我命名感觉不太规范,各位伙伴别学我)
//PA1捕获所用到变量:
uint count_2 = 0; //次数
uint cnt_2_1 = 0; //第一次捕获的计数值
uint cnt_2_2 = 0; //第二次捕获的计数值
uint freq_2 = 0; //频率
//PA2捕获所用到变量:
uint count_3 = 0; //次数
uint cnt_3_1 = 0; //第一次捕获的计数值
uint cnt_3_2 = 0; //第二次捕获的计数值
uint freq_3 = 0; //频率
在看看捕获计算频率代码部分:
先解释一下,蓝桥杯的板子它的输出的最多也就溢出一次,所以我考虑溢出情况的时候也就是只考虑了一次的情况:
//输入捕获的回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if( htim ->Instance == TIM2 )
{
if( htim ->Channel == HAL_TIM_ACTIVE_CHANNEL_2 ) //PA1捕获
{
if( count_2 == 0) //第一次捕获到
{
count_2 = 1; //第二次捕获的标志
cnt_2_1 = TIM2->CCR2; //读一下此时计数值
}
else if( count_2 == 1) //第二次捕获到
{
count_2 = 0; //将标志位置零
cnt_2_2 = TIM2->CCR2; //读出第二次计数值
if( cnt_2_2 > cnt_2_1 )//此时没有溢出
{
freq_2 = 1000000/(cnt_2_2 - cnt_2_1); //直接计算
}
else if( cnt_2_2 < cnt_2_1 ) //溢出后
{
freq_2 = 1000000/( 0xffff - cnt_2_1 + cnt_2_2 + 1 ); //计算
}
}
}
if( htim ->Instance == TIM2 )
{
if( htim ->Channel == HAL_TIM_ACTIVE_CHANNEL_3 )
{
if( count_3 == 0)
{
count_3 = 1;
cnt_3_1 = TIM2->CCR3;
}
else if( count_3 == 1)
{
count_3 = 0;
cnt_3_2 = TIM2->CCR3;
if( cnt_3_2 > cnt_3_1 )
{
freq_3 = 1000000/(cnt_3_2 - cnt_3_1);
}
else if( cnt_3_2 < cnt_3_1 )
{
freq_3 = 1000000/( 0xffff - cnt_3_1 + cnt_3_2 + 1 );
}
}
}
}
}
}
最后当然是要在主函数开启输入捕获的中断:
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_3);
看看结果是可以的