用定时器5输入捕获测相邻连续两个上升沿之间的频率。上升沿到来时标记捕获到的第1、2、3个上升沿为一组,接着捕获的三个上升沿为第二组的1、2、3上升沿。用第2个上升沿的值减去第1个上升沿的值,第3个上升沿的值减去第2个上升沿的值,再用第二组的第1个上升沿的值减去第一组第3个上升沿的值,以此类推,求出每相邻两个上升沿的差值,然后经计算求出相邻上升沿的频率。我编的中断程序如下,然后我输出频率为90HZ的方波,结果在串口调试助手显示的不是90HZ!而是30、45、45、45、45、45、45、45、30、45、45等等不知什么原因?捕捉值不对?还是运算不对?
[mw_shl_code=c,true] //定时器5中断服务程序
u32 IC5ReadValue1 = 0; //第一次输入捕获值
u32 IC5ReadValue2 = 0; //第二次输入捕获值
u32 IC5ReadValue3 = 0; //第三次输入捕获值
u8 capture_number_1 = 0;
static float Capture = 0;
static float TIM5Freq1 = 0; //第一个上升沿和第三个上升沿之间的频率值(除第一次是错误数据)
static float TIM5Freq2 = 0; //第二个上升沿和第一个上升沿之间的频率值
static float TIM5Freq3 = 0; //第三个上升沿和第二个上升沿之间的频率值
void TIM5_IRQHandler(void)
{
if(TIM_GetITStatus(TIM5, TIM_IT_CC1) == SET)//第一次上升沿到来发生捕获事件
{
TIM_ClearITPendingBit(TIM5, TIM_IT_CC1);//清除中断标志位
if(capture_number_1== 0)
{
IC5ReadValue1 = TIM_GetCapture1(TIM5);//获取第一个上升沿的捕获值
capture_number_1 = 1;
if(IC5ReadValue1 >IC5ReadValue3 )
{
Capture = (IC5ReadValue1 -IC5ReadValue3 ); //未溢出第一个捕获值减去第三个捕获值得到两次计数差值
}
else
{
Capture = ((0xFFFF - IC5ReadValue3) + IC5ReadValue1); //溢出定时器重装,需要将差值做补偿运算
}
TIM5Freq1=1000000/Capture; //1000000为定时器5的定时频率
printf("Frequency1:%.2f HZ\r\n",TIM5Freq1); //输出频率值
}
else if(capture_number_1 == 1)
{
IC5ReadValue2 = TIM_GetCapture1(TIM5); //获取第二个上升沿的捕获值
capture_number_1=2;
if(IC5ReadValue2 > IC5ReadValue1)
{
Capture = (IC5ReadValue2 - IC5ReadValue1); //未溢出第二个捕获值减去第一个捕获值得到两次计数差值
}
else
{
Capture = ((0xFFFF - IC5ReadValue1 ) + IC5ReadValue2); //溢出定时器重装,需要将差值做补偿运算
}
TIM5Freq2=1000000/Capture;
printf("Frequency2:%.2f HZ\r\n",TIM5Freq2); //输出频率值
}
else if(capture_number_1 == 2)
{
IC5ReadValue3 = TIM_GetCapture1(TIM5); //获取第三个上升沿的捕获值
capture_number_1=0;
if(IC5ReadValue3 > IC5ReadValue2)
{
Capture = (IC5ReadValue3 -IC5ReadValue2); //未溢出第三个捕获值减去第二个捕获值得到两次计数差值
}
else
{
Capture = ((0xFFFF - IC5ReadValue2) + IC5ReadValue3); //溢出定时器重装,需要将差值做补偿运算
}
TIM5Freq3=1000000/Capture;
printf("Frequency3:%.2f HZ\r\n",TIM5Freq3); //输出频率值
}
}
}
[/mw_shl_code]
|