HC-SR04原理
1、采用TRIG引脚触发测距,给至少10us的高电平信号来启动模块。
2、模块自动发送8个40khz的方波,自动检测是否有信号返回。
3、发送方波后,ECHO引脚电平由低变高,保持不变。如果有信号返回,再通过ECHO引脚输出低电平,测量结束。
4、高电平持续的时间就是超声波从发射到返回的时间。通过公式计算测试距离=高电平时间*声速
————————————————
- 主要参数说明
1 :使用电压:DC—5V
2: 静态电流:小于2mA
3: 电平输出:高5V
4: 电平输出:低0V
5: 感应角度:不大于15度
6: 探测距离:2cm-450cm
7: 高精度 可达0.2cm
CubeMX的配置
一、首先配置RCC
二、配置超声波的TRIG端口
这里以PA1引脚为例
三、配置超声波的ECHO端口
这里以TIM2 CH3为例
注意要打开定时器的中断
四、时钟配置
因为我用的是STM32F103C8T6, 最高72M主频
五、最后的工程配置
按照自己的要求更改就行
代码添加
while循环中
while (1)
{
HAL_Delay(50); //在循环中每50ms启动一次检测
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1,GPIO_PIN_SET);//PA1置高电平
HAL_Delay(1);//大于10us即可,这里延时1ms
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1,GPIO_PIN_RESET);//PA1置低电平
HAL_TIM_IC_CaptureCallback(&htim2); //进入中断服务函数
printf("距离为 :%.1fCM\r\n",17.6*high_time/1000); //串口打印距离
}
HAL_TIM_IC_CaptureCallbac中断服务函数中
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
static uint32_t capture_buf[2]={0,0}; //计数器缓存
static uint8_t capture_cnt=0; //循环次数
if(capture_cnt==0)//判断是不是重新测距
{
capture_cnt++;
__HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING); //开启上升沿捕获
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2); //开启捕获
}
if(capture_cnt==3)//测距完成,末减初得到高电平时间
{
high_time = capture_buf[1]- capture_buf[0];//高电平时间=计数差值
capture_cnt=0;
}
if(TIM2== htim->Instance)
{
if(HAL_TIM_ACTIVE_CHANNEL_2 == htim->Channel)
{
switch(capture_cnt)
{
case 1:
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 2:
capture_buf[1]= __HAL_TIM_GET_COMPARE(htim,TIM_CHANNEL_2); //捕获到下降沿,开始第二次计数
capture_cnt++;
HAL_TIM_IC_Stop_IT(htim,TIM_CHANNEL_2); //停止捕获
break;
default: break;
}
}
}
}
总结
总结就是好好学习
附上我的源码文件链接:HAL库输入捕获进行超声波测距.zip