首先:定时器的CNT从0向上计数到指定值后,又从0开始向上计数,如此循环,每一次溢出都会响应一次中断,置位TIM_FLAG_Update
捕获:当定时器的捕获脚检测一个边沿时,会置位TIM_FLAG_CCx,同时TIMx->CCRx记录下此时CNT的值,并把它记录在cap_start变量中;当再有一个边沿时,又会置位TIM_FLAG_CCx,TIMx->CCRx又记录下此时CNT的值,并把它记录在cap_end变量中;这时cap_end和cap_start的差值就是高电平的时间了;
如果CNT已经溢出了好几次了怎么算呢?
CNT每次响应溢出中断时,再定义一个溢出变量overflow++就行了
根据cap_start,cap_end,overflow和定时器的ARR寄存器值就可以算出高电平时间了
以下是参考程序:
void TIM2_IRQHandler(void)
{
static u16 cap_start=0, cap_end=0, cap_sta=0, cap_tim=0;
static u32 overflow=0;
if (TIM2->SR & TIM_FLAG_Update)//溢出中断
{
overflow++;
}
if (TIM2->SR & TIM_FLAG_CC1)//捕获中断
{
if (cap_sta==0)//捕获到了上升沿
{
cap_start = TIM2->CCR1;
cap_tim = overflow;
xxxx;//设置成下降沿中断
cap_sta=1;//下一次进入下降沿判断
}
else if (cap_sta ==1)//补货到了下降沿
{
cap_end = TIM2->CCR1;
xxxx;//设置成上升沿中断,为下一次准备
cap_sta=0;//进入下一次的上升沿判断
if(overflow == cap_tim)//两次捕获间,CNT没有溢出
pulse_time = cap_end - cap_start;
else //CNT溢出了(overflow-cap_tim)次
pulse_time = cap_end+(TIM2->ARR+1-cap_start)+
(overflow-1-cap_tim)*(TIM2->ARR+1);
}
}
}
|