在用PWM捕获测频率,那是绝对精确。
void TIM2_IRQHandler(void)// TIM2_CCR2 测量C相频率,TIM2_CCR3 测量A相频率
{ float f, cyc, fm;
static u8 fa_n=0, fc_n=0, ph_n=0;
/// TIM2_CCR2 测量C相频率 ///////////////////////////////////////////////
if(TIM_GetITStatus(TIM2, TIM_FLAG_CC2) == SET)
{ TIM_ClearFlag(TIM2, TIM_FLAG_CC2);
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
tc_start = tc_end ;
tc_end = TIM_GetCapture2(TIM2);
if(tc_end>tc_start)
{ f=tc_end-tc_start;}
else
{ f=(65536-tc_start)+tc_end;}
fhz_c=1.0/(f/1000000.0);
}
//// TIM2_CCR3 测量A相频 ///////////////////////////////////////////////
if(TIM_GetITStatus(TIM2, TIM_FLAG_CC3) == SET)
{ TIM_ClearFlag(TIM2, TIM_FLAG_CC3);
TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
ta_start= ta_end;
ta_end = TIM_GetCapture3(TIM2);
if(ta_end>ta_start)
{ f=ta_end-ta_start;}
else
{ f=(65536-ta_start)+ta_end;}
cyc=f;
fhz_a=1.0/(f/1000000.0);
}
}
还可以精确计算相位
|