首先来看模块图
在某宝上一搜就能找到,关于它的使用也是非常简单,先看数据手册里面需要注意的几点
1 基本的参数
在实际测试当中,最大测量三米多的距离还是可以,最小距离我没有做测试,我测的最小距离是50厘米,再往下没有继续测。
2 测距的基本原理
这里的基本原理其实应该是它的使用方法,如果你仔细看它的数据手册会发现这种测距模块还有另外一种使用方法:USART通信。
看文字不是很直观,简单粗暴来看图
在写程序的时候没有使用USART的方法,因为上图的这种驱动方式我认为比较简单,后面的程序也是按照这个时序图来编写的。
注意:上图中关于测距的公式,在程序中我没有使用他给的公式,这一点在后面会提到。
3 实物图的连接
实物图的连接就不上图了,购买此模块的时候一般卖家会给你相应的资料。
直接上程序:
主函数:
int main(void)
{
unsigned int count=0;
float distance=0;
float distancebuf[]={0}; //这里的数组没有意义,是在调试程序的时候,怕测的距离有误差,把连续几次测到的数值放入数组中求平均值,以提高精度
/* USART1 config 115200 8-N-1 */
USART1_Config();
Distance_Config(); //距离转换函数,在上面的说明中有提到,但是具体的实现和上面的公式是不相同的
CLI() ;//关闭总中断
SEI(); //开启总中断
Tim3_Config(); //定时器初始化
GPIO_ResetBits(GPIOA,GPIO_Pin_5); //先拉低电平
while(1)
{
GPIO_SetBits(GPIOA,GPIO_Pin_5); //再拉高电平,这里拉低拉高电平是根据上面给出的测距原理来写的
Delay(30); //延时30个us,注意这里使用的是粗略的延时函数,测距原理中说是延时10个us,这里给30个us也无妨
// Delay(20);
// Delay(20);
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
TIM3->CNT=0; //TIM3的计数器清零
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4) == 0); //等待ECHO的高电平
TIM_Cmd(TIM3,ENABLE); //运行TIM3进行计数
while((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4) == 1) && (TIM3->CNT < TIM3->ARR-10));
TIM_Cmd(TIM3,DISABLE);
count=TIM3->CNT;
printf("count=%d",count);
distance=ChangeDistance(count);
printf(" µ±Ç°¾àÀëΪ£º%f\n",distance);
Delay(20000);
Delay(20000); //这里的延时没有具体的意义,可以去掉
while(1); //程序测距一次后卡死在这里
}
}
距离转换函数
float ChangeDistance(unsigned int cout1)
{
float distance=0;
printf("cou1=%d\n",cout1);
distance=cout1/58.0;
return distance;
}
参数是TIM3->CNT的计数,也就是高电平的时间,distance是测距距离
注意:distance的单位是厘米
关于转换的公式为什么是cout1/58.0 这里我也不是很清楚
另外:当ECHO引脚输出高电平后,另一种思路是采用上升沿触发定时器中断的方式来计算高电平时间的,我认为没有必要再配置一次中断,使用while()来等待这个高电平的方法完全可以。当然不容忽视的一个问题是,如果始终检测不到高电平,程序会卡死在while()语句这里,因此有必要加上一个时间的判断。
通过串口打印相应的测量结果。
模块的资料就不上传了,在某宝店里一般都有相应的下载链接。
其他的具体细节,例如定时器的配置,引脚的配置请参考我上传的程序,如有疑惑欢迎留言。
http://download.csdn.net/detail/qq_27312943/9541979
注意:1 有的超声波模块是有温度校准的,有温度校准的模块测距精度要高一些。
2 模块再稳定下来之后测距是比较准确的,即便是我上面写的代码,也需要稳定一下再测距才可以,举个例子,当你将超声波模块对着墙时,刚上电测到的距离并不准确,但是很短时间后测距就会变得非常精准。
3 上面的程序采用的是电平触发的方式,我看到有的说使用串口的方式会使精确度更高,但我没有做相关的实验。
4 想要提高测距精度的另一种方法就是多次测量,去掉最大值,最小值后取平均值的方法,我在另一份程序中采用的是测五次距离,然后取出平均值得方法,需要注意多次测量的周期最好大于60ms
关键字:stm32 超声波测距
引用地址:
基于stm32的超声波测距
推荐阅读最新更新时间:2024-03-16 15:36
浅谈QSPI的特点以及QSPI的三种工作模式
意法半导体STM32F7系列MCU采用高性能的ARM Cortex-M7核心,借助ST的ART Accelerator™和L1缓存,STM32F7微控制器可提供Cortex-M7内核的最高理论性能,而无论代码是从嵌入式闪存还是由外部存储器执行的:1082 CoreMark / 462 DMIPS在216 MHz f CPU。带有新外围设备的智能架构。可利用STM32系列丰富的外设资源来外扩SRAM芯片。STM32F7支持QSPI. 意法半导体MCU STM32F7系列释放了Cortex-M7内核,AXI和多AHB总线矩阵,用于互连内核,外围设备和存储器。具有高达2MB的嵌入式闪存,在某些设备上具有读-写功能。两个用于以太网的通
[单片机]
从库函数方向入门stm32的个人建议
必备工具:stm32开发板,一本库函数方向的书籍; (1)选定一个开发板后,注意该版对应的stm32型号,一般选F103ZET6,网上资料多,查看它对应的flash的大小,以后开发时会设置编译器用到。 (2)循序渐进地根据书中介绍进行工程的建设(我是使用野火的《stm32库函数开发》),在开始我们要注意其中如core.c,f103.h等等文件的作用,如内核驱动,系统时钟的设置,外设的驱动文件等等这些是那些文件,在以后的工程文件建设中,这些将几乎可以不修改地添加到其他工程文件中,而需要我们写入程序,实现我们想要功能的是如下文件:stm32.it.c:写入中断服务函数;stm32.conf.h:添加需要控制到的外设驱动文件,x
[单片机]
STM32 SPI NRF24L01复习整理
/********** mySpi.h****************/ #ifndef __MY_SPI_H #define __MY_SPI_H #include stm32f10x.h #include stdio.h #define SPI1_CSN_HIGH() GPIO_SetBits(GPIOA,GPIO_Pin_1); #define SPI1_CSN_LOW() GPIO_ResetBits(GPIOA,GPIO_Pin_1); #define SPI2_CSN_HIGH() GPIO_SetBits(GPIOB,GPIO_Pin_12); #define SPI2_CSN_LOW() GPIO
[单片机]
STM32 Bootloader与启动分析
一、STM32 程序下载与Bootloader 三种启动模式如下表: (截图与stm32中文参考资料) 1、从主闪存存储器启动,即从STM32内置的Flash启动,BOOT0=0,BOOT1=X, 一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,复位(软件复位、手动复位、硬件自动复位)后也直接从这启动程序。不需要使用到系统存储区的Bootloader程序。 2、从系统存储器启动,即STM32的ISP了。B00T0=1,B00T1=0,由于串口不能直接把程序下载到内置的flash里面,所以需要使用到ST公司内嵌于系统存储区(flash的某一部分的地址被编为0x1FFF_F000-0x1FFF_F7FF,这就
[单片机]
STM32 串口通信(库函数操作)
1.说在前面: 清明三天小假期,放松一下无可厚非,但是,依旧要完成自己的学习任务 2.串口通信的简单介绍: 1.将串口作为一个沟通的渠道,可以和外界进行接收和发送信号 2.STM32和串口相关的寄存器: 2-1:USART_SR(状态寄存器):存储着MCU的一些状态 2-2:USART_DR(数据寄存器):暂存着一些数据信息 2-3:USART_BRR(波特率寄存器:暂存波特率信息 2-4:USART_CRI(控制寄存器):用于给usart进行使能 3.注:波特率的计算方法: 只要给出相应的时钟频率和设置usartdiv,就可以计算出波特率 3.串口通讯的简单配置和使用 1.其实基于
[单片机]
STM32内存管理以及STM32中的堆栈
今天仔细读了一下内存管理的代码,然后还有看了堆栈的相关知识,把以前不太明白的一些东西想通了。 首先,先看一下stm32的存储器结构。 Flash,SRAM寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。可访问的存储器空间被分成8个主要块,每个块为512MB。 FLASH存储下载的程序。 SRAM是存储运行程序中的数据。 所以,只要你不外扩存储器,写完的程序中的所有东西也就会出现在这两个存储器中。 这是一个前提! 堆栈的认知 1.STM32中的堆栈。 2.编程中的堆栈。 在编程中很多时候会提到堆栈这个东西,准确的说这个就是RAM中的一个区域。我们先来了解几个说明: (1) 程序中的所有内容最终只会出现
[单片机]
STM32的串口通信
STM32的串口通信 在基础实验成功的基础上,对串口的调试方法进行实践。硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中。 b) 初始化函数定义: void USART_Configuration(void); //定义串口初始化函数 c) 初始化函数调用: void UART_Configuration(void); //串口初始化函数调用 初始化代码: void USART_Configuration(void) //串口初始化函数 { //串口参数初始化 USART_InitTypeDef USART_InitStructure
[单片机]
stm32利用oled显示屏与按键进行PID参数调节实现人机交互
上一个学期在学校做四轮车利用PID实现直线走,在调试过程中,我之前是每改一个参数就下载程序进控制板进行调试,观察车是否偏移来确定pid参数,但是后来我发现这样的效率很慢,经别人提醒后,我自己做了一个小小的人机交互界面,来显示pid的参数以及对pid参数进行调整。 以下是显示效果: 接着我在附上主要代码: // 功能描述 : OLED 7针SPI接口演示例程(STM32F103系列) // 说明: // ---------------------------------------------------------------- // GND 电源地 // VCC 3.
[单片机]