stm32Cubemx实用篇(二):定时器捕获功能实现SR04超声波测距
本章将介绍使用stm32Cubemx软件配置定时器的输入捕获功能来控制SR04模块测量距离。
硬件平台:Stm32H743IIT6
超声波模块:SR04(网购5元一个)
软件:StmcubemxV6.0.1 、MDK5
cubemx下载地址:
https://www.st.com/stm32cubemx
文章目录
- stm32Cubemx实用篇(二):定时器捕获功能实现SR04超声波测距
- 一、SR04使用方法
- 二、Cubemx参数配置
- 三、MDK代码修改与运行
- 1.输入捕获函数实现
- 2.主函数实现
提示:以下是本篇文章正文内容,下面案例可供参考
一、SR04使用方法
SR04实物
1、工作原理
2、接口定义和使用方法
3、注意事项
1:此模块不宜带电连接,如果要带电连接,则先让模块的 Gnd 端先连接。否则会影响
模块工作。
2:测距时,被测物体的面积不少于 0.5 平方米且要尽量平整。否则会影响测试结果。
二、Cubemx参数配置
1、时钟配置
2、定时器输入捕获设置
设置定时器输入捕获:内部时钟、预分频为240、双边沿触发
具体设置如下图所示:
三、MDK代码修改与运行
1.输入捕获函数实现
HAL库给我们提供了一个输入捕获回调函数,我们只需要重写这个函数,实现测量接受端口高电平持续时间即可。
代码如下(示例):
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
static uint32_t capture_buf[2]={0,0}; //计数器缓存
static uint8_t capture_cnt=0; //循环次数
static uint32_t high_time; //高电平时间,超声波来回一次的时间,us
/* Prevent unused argument(s) compilation warning */
UNUSED(htim);
//需要发送完触发信号后先开启上升沿捕获
if(TIM12== htim->Instance)
{
if(HAL_TIM_ACTIVE_CHANNEL_2 == htim->Channel)
{
switch(capture_cnt)
{
case 0://捕获到上升沿,记录下来当前时间
capture_buf[0]= __HAL_TIM_GET_COMPARE(htim,TIM_CHANNEL_2);
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_FALLING); //开启捕获下降沿
capture_cnt++;
break;
case 1://捕获到下降沿,记录下此刻时间
capture_buf[1]= __HAL_TIM_GET_COMPARE(htim,TIM_CHANNEL_2);
capture_cnt=0;
HAL_TIM_IC_Stop_IT(htim,TIM_CHANNEL_2); //停止捕获
high_time = capture_buf[1]- capture_buf[0];
if(capture_buf[1]>capture_buf[0])printf("ultrasonic DIST = %.1fCM\r\n",17.0*high_time/1000);
break;
default: break;
}
}
}
}
2.主函数实现
这里在主函数增加了按键扫描通过按键控制SR04测量距离。
另外还增加了串口printf函数,打印出测量到的距离。
代码如下(示例):
key=KEYPRESS(); //按键
if(key==1)//如果按键按下则进行一次测距
{
//发送>10us的超声波trig信号
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_11,GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_11,GPIO_PIN_RESET);
__HAL_TIM_SET_CAPTUREPOLARITY(&htim12,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING); //开启上升沿捕获
HAL_TIM_IC_Start_IT(&htim12,TIM_CHANNEL_2); //开启输入捕获中断
}
可以看到按键按下后能够正确测出距离。
结束!!!希望小伙伴们多多关注。