经验分享帖 基于STM32的超声波测距HC-SR04(附程序)

CSDN上其实有很多超声波测距的博客,但我还是想写一篇,主要是附上可用的程序,伸手党最爱。其实我也是个伸手党,不过还是希望大家能自己动手自己多练自己能实现。

同时写下我的心得与看法:

1,程序是用STM32CubeMX生成代码并改造完成的,所以使用的HAL库。

2,使用的是高级定时器TIM1(仅计时,没有用输入捕获的功能)+ 外部中断EXTI。

3,定时器分频值理论上越小结果越精确,自动重装载值越大越不容易溢出(因为定时器一旦溢出,那结果就要考虑加上n*65536这种情况(n为溢出次数))。

4,所以我设置PSC=72-1,ARR=65536-1。这时定时器计一个数耗时为1us ,由于距离结果是直接获得cm的 ,所以音速单位我们将其换成cm/us ,

5,我手中的超声波模块HC-SR04是5V供电的,不了解其他的是不是也是这样,用3.3V供电的话结果误差较大。

6,HAL库我使得并不熟,所以连设置当前计数器的值和读当期计数器的值这两个函数我都不知道名字叫啥,不过幸好我晓得他们最终操作的是哪个寄存器,就是TIM1->CNT了。所以,有些寄存器操作还是很简单的,譬如,一些数据寄存器:USART1->DR, SPI1->DR, TIM1->PSC, TIM1->ARR.里面存的都是数,因此不用考虑每一位是啥子功能。

7,PF5接Echo, PF6接Trig, 暂时想不到了,嘻嘻先这样吧,以后想到了再补充。写得不好,多多见谅,欢迎批评指正。

贴两张图
在这里插入图片描述
在这里插入图片描述

最后留下程序:

链接:https://pan.baidu.com/s/1HfPSHaTwpq23DD83RbbmIA
提取码:f2hj

2022-07-05插入一张图片,并给提问问题的小伙伴:提问问题请将问题描述清楚,一句“怎么没数据”“怎么不显示”,这样的问题我是真的不知道
在这里插入图片描述

  • 17
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
以下是一种可能的 STM32 驱动 HC-SR04 超声波测距模块的程序代码: ```c #include "stm32f4xx.h" #define TRIG_PIN GPIO_Pin_10 #define ECHO_PIN GPIO_Pin_9 #define GPIO_PORT GPIOA void delay_us(uint32_t us) { uint32_t count = us * (SystemCoreClock / 1000000); while(count--); } void HC_SR04_Init(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = TRIG_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIO_PORT, &GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = ECHO_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIO_PORT, &GPIO_InitStruct); } float HC_SR04_Read(void) { GPIO_WriteBit(GPIO_PORT, TRIG_PIN, Bit_SET); delay_us(10); GPIO_WriteBit(GPIO_PORT, TRIG_PIN, Bit_RESET); uint32_t count = 0; while(GPIO_ReadInputDataBit(GPIO_PORT, ECHO_PIN) == Bit_RESET) { count++; delay_us(1); if(count > 50000) return -1.0f; } uint32_t time_start = TIM1->CNT; while(GPIO_ReadInputDataBit(GPIO_PORT, ECHO_PIN) == Bit_SET) { count++; delay_us(1); if(count > 50000) return -1.0f; } uint32_t time_end = TIM1->CNT; float time_diff = (float)(time_end - time_start) / 1000.0f; return time_diff * 0.34f / 2.0f; // distance in cm } int main(void) { SystemInit(); HC_SR04_Init(); while(1) { float distance = HC_SR04_Read(); if(distance >= 0) { printf("Distance: %.2f cm\n", distance); } else { printf("Error\n"); } delay_us(500000); } return 0; } ``` 注意:这段程序并没有经过完整验证,仅供参考。实际上还需要配置定时器 TIM1,以及可能需要调整延时函数 delay_us 的实现方式。同时需要注意 HC-SR04 需要使用 5V 电源,因此还需要将 STM32 的 PB2 引脚(VDD)连接到 HC-SR04 的 Vcc 引脚。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值