TIM16CH1_CAPTURE_STA是什么寄存器???
u8变量吗?那么主程序里有清零它吧,不然只能测一次。
有TIM16的话是STM32f05x吧,我没用过。
TIM16CH1_CAPTURE_VAL2 = CapCount_H*65536 + 65536-Cap1+Cap2;
是不是多了一个65535?
增计数模式,CapCount_H是上溢中断的次数。
Cap1是第一次的捕获值,Cap2是第二次的捕获值。
举个例子:
假如中间只有一次上溢中断,即CapCount_H=1,
那么cap1到上溢的时间是 65535-cap1,
随后新的计数周期到cap2的时间就是cap2,
那么就是65535*1-cap1+cap2.
200k有点高了,你要不要试试
捕获预分频,TIM_SetIC1Prescaler,最多8分频。
另外,只测一次频率感觉你是测不准的,你频率有点高,特别你这个单片机主频只有48M吧。低频捕脉宽,高频点人头。
你可以去搜一下
等精度频率测量。就是在一定时间内测量整数个频率时间,然后取平均值,比较准和稳。
最后,你这个测脉宽的感觉有点长,给你参考一个430的程序。
手好痒,控制不住自己。改了就像下面那样,不过没有验证,有很大可能性会有bug,仅供参考。
void TIM16_IRQHandler(void)
{
if((TIM_GetITStatus(TIM16, TIM_IT_CC1) != RESET)) //上升沿捕获中断
{
TIM_ClearITPendingBit(TIM16, TIM_IT_CC1); //清除中断标志
Cap2 = TIM_GetCapture1(TIM16);
TIM16CH1_CAPTURE_VAL2 =CapCount_H*65536 - Cap1 + Cap2 ;
Cap1 = Cap2;
CapCount_H=0;
}
if (TIM_GetITStatus(TIM16, TIM_IT_Update) != RESET) //更新溢出中断
{
TIM_ClearITPendingBit(TIM16, TIM_IT_Update);//清除中断标志
CapCount_H++;
}
}
/*Keep it simple,stupid.*/