STM32驱动HC-SR04实现超声波测距

基础知识:

我用的是HC-SR04超声波测距模块,这个模块有四个引脚,分别是VCC、Trig(触发)、Echo(接收)、Gnd

工作原理:

外部MCU给模块Trig引脚一个大于10uS的高电平脉冲,模块Echo引脚会返回一个与距离等比的高电平脉冲信号,距离可根据脉宽时间T算出:

距离=T*C/2 (C为声速)

时序图:

思路:

Trig引脚发一个高电平信号,然后等待Echo引脚返回高电平,通过GPIO引脚上升沿触发一个Echo引脚的中断,在中断回调函数中开启定时器计数,然后等待Echo引脚的下降沿再触发一次中断,停止计数。把计数得到的计数值自行计算一下自己设置的时钟频率下的时间,就可以通过公式算出距离啦!

自定义:

设置两个GPIO引脚,一个叫Trig,一个叫Echo

Trig引脚设置成推挽输出模式,默认输出电平为低电平

Echo引脚设置成外部中断模式,上升沿下降沿都可触发的那种

代码:

模块的驱动代码:

1、推荐自己写一个sr.c和sr.h
在sr.c中定义一个extern类型的变量distance,以便于在main函数中调用得到距离
2、sr.c代码

//发射超声波
void SuperOut()
    {
		HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_SET);//输出引脚高电平
		delay_us(15);//持续至少10us,保险起见设15us
		HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET);
	}
		
//gpio中断回调
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
        if(HAL_GPIO_ReadPin(Echo_GPIO_Port,Echo_Pin) == GPIO_PIN_SET)//若Echo引脚返回高电平
	    {
		    __HAL_TIM_SetCounter(&htim3,0);//定时器计数清零
		    HAL_TIM_Base_Start(&htim3);	//开始计数
	    }
        else//若Echo引脚返回低电平
	    {
		    HAL_TIM_Base_Stop(&htim3);//定时器停止计数
		    count = __HAL_TIM_GetCounter(&htim3);//得到定时器的计数值
		    distance = count * 0.017;//算出距离cm
	    }
    }

主函数里直接调用这个函数来计数就好了

问题小总结:

VCC我试过3.3V可以驱动它测距,一开始用自己板5V引脚供电怎么都实现不了测距,后来搞半天才发现是因为我用的st-link只能给3.3V的电压,5V引脚因为电压不够用不了所以实现不了。

OK,就这样^v^!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值