STM32F103关于输入捕获以及控制超声波测距模块的笔记(1)

今天在学习超声波测距模块US-025的时候,发现需要输入捕获方面的知识又去学习了输入捕获。
首先介绍超声波模块的原理:
1.给Trig一个至少10us的高电平信号
2.超声波模块自动发送8个40khz的方波,自动检测是否有信号返回
3.信号返回则通过Echo输出一个高电平,高电平持续时间就是超声波从发送到返回被接收的时间。
距离=(高电平时间声速(340m/s))/2
因为声音的传播速度与温度有关,所以温度会对测量有一定的影响,到后期可以加以改进。
后来在网上查到了实现超声波测距大致有3种实现的思路:(1)在发送触发信号后一直等待Echo引脚的响应(变为高电平)并打开定时器计时直到Echo变为低电平,关闭定时器记录下计时时间。(2)在发送触发信号后,Echo响应后(上升沿)触发外部中断,开启定时器计时直到Echo变为低电平,关闭定时器记录下计时时间。(3)在发送触发信号后,通过定时器的输入捕获引脚抓取Echo引脚上升沿,开启定时器计时直到Echo变为低电平,关闭定时器记录下计时时间。第一种方式完全在主进程中完成,比较占用主进程资源,比较适合于超声波模块的测试应用。第二种和第三种方式在主进程中发送触发信号中断中处理接收计算距离比较适合于实际项目的应用。
而后在学习输入捕获的过程中,我想介绍一下在timer.c里面的中断服务程序:
首先通俗的解释原因,因为每次测量过程中高电平的持续时间是不知道的,有可能比设定的ARR(自动重装载寄存器周期的值)小,也有可能比其值大,而当持续时间超出设定的ARR值之后就需要更新,重新开始一个新的循环,所以所测量的值可能只是一部分值。因此在这种情况下就需要我们知道高电平持续时间有几次溢出(设为n),设最后所测的值为x,则time=n
arr+x。
void TIM2_IRQHandler(void)
{
if((TIM2CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
if(TIM2CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
{
if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
{
TIM2CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM2CH1_CAPTURE_VAL=0XFFFF;
}else TIM2CH1_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
{
if(TIM2CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
{
TIM2CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿
TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
}else //还未开始,第一次捕获上升沿
{
TIM2CH1_CAPTURE_STA=0; //清空
TIM2CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM2,0);
TIM2CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获
}
}
}
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}


首先,设置 TIM5_CH1 捕获上升沿,这在 TIM5_Cap_Init 函数执行的时候就设置好了,然后等待上升沿中断到来,当捕获到上升沿中断, 此时如果 TIM5CH1_CAPTURE_STA 的第 6 位为 0,则表示还没有捕获到新的上升沿,就先把 TIM5CH1_CAPTURE_STA、TIM5CH1_CAPTURE_VAL 和 TIM5->CNT 等清零,然后再设置TIM5CH1_CAPTURE_STA 的第 6 位为 1,标记捕获到高电平,最后设置为下降沿捕获,等待 下降沿到来。如果等待下降沿到来期间,定时器发生了溢出,就在 TIM5CH1_CAPTURE_STA 里面对溢出次数进行计数,当最大溢出次数来到的时候,就强制标记捕获完成(虽然此时还没 有捕获到下降沿)。当下降沿到来的时候,先设置 TIM5CH1_CAPTURE_STA 的第 7 位为 1,标 记成功捕获一次高电平,然后读取此时的定时器值到 TIM5CH1_CAPTURE_VAL 里面,最后设 置为上升沿捕获,回到初始状态。


发布了14 篇原创文章 · 获赞 7 · 访问量 3522

猜你喜欢

转载自blog.csdn.net/qq_45186557/article/details/97516639