深圳市航顺芯片技术研发有限公司
直播中

123

10年用户 826经验值
擅长:可编程逻辑
私信 关注
[问答]

请问下怎样去设计一种基于STM32的超声波测距模块

如何去使用超声波模块?

怎样去设计一种基于STM32的超声波测距模块?

回帖(1)

陈蓓

2021-8-20 17:16:11
  基于STM32的超声波测距(外部中断+定时器)
  首先说明一下我使用的硬件:
  stm32f103c8t6最小系统、0.96寸OLED、超声波模块HC-SR04。
  再就是程序设计的一个思路:
  超声波模块的使用说明已经指出,给TRIG引脚一个不少于10微秒的高电平,模块自动发送8个40KHz的方波,接收到返回信号后引脚ECHO会输出高电平,其距离为ECHO引脚高电平时间*声速/2,每次测量间隔建议60ms以上。由此,我们可提取到需要使用到的三个芯片功能:1、定时器,2、外部中断,3、IO输出。
  下面是配置代码,进行一一介绍(不想看我哔哔的最下方有完整得超声波配置.c和.h +_+ ):
  1、外部中断和IO输出都是使用的GPIO所以使用一个配置函数
  1.1 GPIO宏定义参数:
  
  1.2 GPIO端口配置函数Ultrasound_GPIO_Conf():
  这里要注意,中断的触发方式为上下边沿,用处在中断服务函数里面体现。
  
  
  2、定时器配置(定时器在这里比较忙,它要进行返回信号高电平的计时,和测距间隔时间计时,所以要配置中断)
  2.1 定时器宏定义参数:
  
  2.2 定时器配置函数Ultrasound_TIM_Conf():
  这里值得注意的是,在配置中断的时候必须要清除中断标志位,不然程序会死在NVIC_Init函数里面
  
  3、超声波模块初始化函数(将上面写的两个函数调用一下下就好了)
  
  4、超声波启动函数
  
  5、距离获取函数
  这里比较花里胡哨,因为进行了一下数据筛选。ULTRASOUND_DIS_INDEX是一个宏定义,它是我设定的获取多少次数据,进行一次数据筛选。
  
  5、外部中断服务函数(敲黑板,比较绕请细品)
  这里总体说一说此程序比较理想的执行情况:
  (1)超声波被调用初始化函数,定时器被设定为可中断,并且定时器开始计数;
  (2)计数到溢出,触发定时器中断,它会调用超声波启动函数Ultrasound_start();
  (3)超声波启动后,有回波信号,将触发外部中断(上边沿),进入外部中断直接关掉定时器中断和定时器,判断确实有回波信号,进入到(检测到返回信号)代码段,清空定时器的CNT寄存器,重设重载值ARR寄存器,开启定时器。此时,定时器进行ECHO引脚得高电平持续时间检测;
  (4)再一次中断来临(下降沿),还是直接关掉定时器中断触发和定时器,这次进入(返回信号结束)代码段,首先判断定时器是不是计数的高电平时间。若是,就判断我的获取次数是否已满,满了就置位flag, 没有满,就将定时器CNT寄存器里面的值提出来参与距离公式运算得到当前所测距离。执行到最后继续开启定时器中断和定时器,并重新设定重载值。此时定时器进行间隔时间计数。所以,定时器计数到溢出中断后,又会去调用一次超声波启动函数Ultrasound_start();
  (5)外部中断函数则在此等待下一次工作来临;
  
  6、主函数
  
  7、下面是超声波配置完整的.c和.h
  == ultrasound.c ==
  
  
  == ultrasound.c ==
  
  
  
  
  
  
举报

更多回帖

发帖
×
20
完善资料,
赚取积分