认识HCSR04超声波传感器
接口定义和模式选择
Vcc、 Trig(控制端)、 Echo(接收端)、 Gnd 三种控制模式,一般使用第一种GPIO控制,下面我的代码是使用第一种GPIO控制,如果使用其他两种可以自己探索下,我下面页简单介绍下。
GPIO模式
UART串口模式和I2C模式
工作原理
时序图
原理图
编程思路
接线图
我这里使用的是STM32F103C8T6,开发板与传感器接线图
GPIOA0配置为推挽输出,GPIOA8普通输入模式
PA8也是定时器CH1通道
main函数
main函数代码,传感器没有单独封装.c和.h文件直接跟主函数写一起
while (1)
{
//1、让计数器CNT归零
__HAL_TIM_SET_COUNTER(&htim1,0);
//2、清除CC1、CCR标志位
__HAL_TIM_CLEAR_FLAG(&htim1,TIM_FLAG_CC1);
__HAL_TIM_CLEAR_FLAG(&htim1,TIM_FLAG_CC2);
//3、开启定时器
HAL_TIM_IC_Start(&htim1,TIM_CHANNEL_1);
HAL_TIM_IC_Start(&htim1,TIM_CHANNEL_2);
//4、向Trig发送脉冲
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);
for(uint32_t i =0;i<10;i++); //延时10us
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);
//5、等待测量结束
uint8_t success = 0;//标志位测量是否成功,0失败1成功
uint32_t expireTime = HAL_GetTick() + 50;//最长等待时间
//判断是否超时
while(expireTime > HAL_GetTick())
{
uint32_t cc1Flag = __HAL_TIM_GET_FLAG(&htim1,TIM_FLAG_CC1);//cc1标志位
uint32_t cc2Flag = __HAL_TIM_GET_FLAG(&htim1,TIM_FLAG_CC2);//cc2标志位
if(cc1Flag && cc2Flag){ //cc1和cc2标志位都为1
success = 1;//测量成功
break;//结束循环
}
}
//6、关闭定时器
HAL_TIM_IC_Stop(&htim1,TIM_CHANNEL_1);
HAL_TIM_IC_Stop(&htim1,TIM_CHANNEL_2);
//7、计算距离
if(success == 1) //测量成功
{
//读取ccr1的值
uint16_t ccr1 = __HAL_TIM_GET_COMPARE(&htim1,TIM_CHANNEL_1);
//读取ccr2的值
uint16_t ccr2 = __HAL_TIM_GET_COMPARE(&htim1,TIM_CHANNEL_2);
//计算脉宽
float pulseWidth = (ccr2 - ccr1) * 1e-6f;
//距离
float distance = 340.0f * pulseWidth / 2.0f;
if(distance <0.2)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
}
else
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
}
}
}
效果演示
效果演示,除了这个板载LED亮我还加了蜂鸣器
HCSR04超声波测距传感器
本人也是在学习32中,刚入门水平,如本文如有错误请指正。看到这了,动动发财的小手点个赞鼓励支持下,你的点赞是我的持续更新的动力!