用了定时器的输入捕获功能来测得频率,有两个中断,一个是上升沿信号中断,一个是计数器溢出中断,我现在不懂那个500 是咋回事,测着测着突然出来这么一个,每次都是实际值的一半
代码,上升沿中断和溢出中断,SystemCoreClock 24MHZ :
typedef struct StructFreqChVar{
UINT8 _ui8mark; // 上升沿标记 0 或 1
UINT16 _ui16overflow_counter; // 两次上升沿之间的计数器溢出数
UINT16 _ui16overflow_old; // 第一次上升沿时计数器溢出数
UINT32 _ui32capture_wert1; // 上一次捕获值
UINT32 _ui32capture_wert2; // 最新一次捕获值
UINT32 _ui32captuer_diff; // 两次捕获值差
}StFreqCh;
static StFreqCh timer4_Ch3;
{
if(TIM_GetITStatus(TIM4, TIM_IT_CC3) != RESET)
{
/* Clear TIM4 Capture compare interrupt pending bit */
TIM_ClearITPendingBit(TIM4, TIM_IT_CC3);
/* 第一个上升沿*/
if(timer4_Ch3._ui8mark == 0)
{
timer4_Ch3._ui8mark =1;
// 第一次捕获值
timer4_Ch3._ui32capture_wert1 = TIM_GetCapture3(TIM4) + timer4.ui16Counter_Overflow * 0x10000;
// 记录第一次捕获时的计数器的溢出
timer4_Ch3._ui16overflow_old = timer4.ui16Counter_Overflow;
}
/* 第二次捕获,之后变量_ui8mark 一直等于1,每次上升沿只在这里循环,只有当信号无效(小于0,5 Hz)时变量_ui8mark 才重新置0 */
else if ((timer4_Ch3._ui8mark == 1) /*&& (timer4_Ch3._ui16overflow_counter < 733)*/) // 对于小于0.5 Hz的信号,两次上升沿之间的计数器溢出次数大于等于733
{
// 第二次捕获值
timer4_Ch3._ui32capture_wert2 = TIM_GetCapture3(TIM4) + timer4.ui16Counter_Overflow * 0x10000;
// 记录当下次捕获时的计数器的溢出,
timer4_Ch3._ui16overflow_old = timer4.ui16Counter_Overflow;
if (timer4_Ch3._ui32capture_wert2 > timer4_Ch3._ui32capture_wert1)
{
/* 计算两次上升沿之间的TAKT差*/
timer4_Ch3._ui32captuer_diff = timer4_Ch3._ui32capture_wert2 - timer4_Ch3._ui32capture_wert1;
/*小于0.5 的频率该值大于48000000,置0*/
if (timer4_Ch3._ui32captuer_diff > 48000200)
{
timer4.ui32Freq_Ch3_0_01Hz = 0;
}
else
{
/* 计算频率*/
timer4.ui32Freq_Ch3_0_01Hz = (UINT32)((uint64_t)SystemCoreClock / (uint64_t)timer4_Ch3._ui32captuer_diff);
}
timer4_Ch3._ui32capture_wert1 = timer4_Ch3._ui32capture_wert2; // 新值赋给旧值,等待下一个上升沿
timer4_Ch3._ui16overflow_old = timer4.ui16Counter_Overflow; // 记录当下计数器溢出次数
}
}
/* 溢出中断*/
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
{
/* Clear TIM4 overflow interrupt pending bit */
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
/*有了上升沿后上升沿标记为1,在下一个上升沿每道来之前,如果计数器溢出次数超过或等于733,那么该信号为无效信号,直接置0*/
if (1 == timer4_Ch3._ui8mark)
{
/*计数器溢出次数没超过65536*/
if ((timer4_Ch3._ui16overflow_old <= timer4.ui16Counter_Overflow) )
{
/*计算上次上升沿和当下的计数器溢出次数的差"*/
timer4_Ch3._ui16overflow_counter = timer4.ui16Counter_Overflow - timer4_Ch3._ui16overflow_old;
if (timer4_Ch3._ui16overflow_counter >= 733)
{
timer4.ui32Freq_Ch3_0_01Hz = 0;
timer4_Ch3._ui8mark = 0;
}
}
else
{
/*计数器溢出次数超过65536*/
timer4_Ch3._ui16overflow_counter = 0xFFFFFFFF - timer4_Ch3._ui16overflow_old + timer4.ui16Counter_Overflow + 1;
/*Wenn der Counter mehr als oder gleich 733 mals ueberlaeuft, wird der zweite Impuls nicht mehr gewartet*/
/*同上*/
if (timer4_Ch3._ui16overflow_counter >= 733)
{
timer4.ui32Freq_Ch3_0_01Hz = 0;
timer4_Ch3._ui8mark = 0;
}
}
}
timer4.ui16Counter_Overflow++; // 计数器每次溢出自加1
}
我知道中断里写的太多了,肿么办???
|