2019-08-19 20:50发布
首先:定时器的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);
最多设置5个标签!
---------------------------------
谢谢 了解了 设置一个溢出标志,防止在高低电平之间出现了计数器重装值这种神奇的事情发生。
首先:定时器的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);
}
}
}
---------------------------------
上升沿捕获,记录了此时计数器寄存器的值,但是再捕获下降沿之前,计数器就重装值了。。。那么下降沿捕获的计数器值减去上升沿计数器值不就是计算错误的了吗。。。。
---------------------------------
上升沿捕获,记录了此时计数器寄存器的值,但是再捕获下降沿之前,计数器就重装值了。。。那么下降沿捕获的计数器值减去上升沿计数器值不就是计算错误的了吗。。。。
一周热门 更多>