讲师博文
Wi-Fi超声波测距传感器节点实验 来源 : 未知     2018-09-21

【实验目的】

学习STM32的M0系列芯片的使用

学习MDK开发软件的使用方法,如仿真调试

通过本实验掌握stm32F0xx的ADC使用方法

【实验环境】

Wi-Fi超声波测距传感器模块

MDK开发工具和相应的仿真器

PC机 XP、Window7/8

【实验内容】:

编写超声波实验程序,实现STM32F0xx芯片采集到超声波测距长度的AD值,并把AD值通过串口Wi-Fi模块(STA)传输给服务端Wi-Fi模块(AP),在PC上的串口调试助手显示数据。

【实验原理】

声波是一种能在气体、液体和固体中传播的机械波。根据振动频率的不同,可分为次声波、声波、超声波和微波等。

( 1 ) 次声波:振动频率低于l6Hz的机械波。

( 2 ) 声波:振动频率在16—20KHz之间的机械波,在这个频率范围内能为人耳所闻。

( 3 ) 超声波:高于20KHz的机械波。

超声波与一般声波比较,它的振动频率高,而且波长短,因而具有束射特性,方向性强,可以定向传播,其能量远远大于振幅相同的一般声波,并且具有很高的穿透能力。例如,在钢材中甚至可穿透10米以上。超声波在均匀介质中按直线方向传播,但到达界面或者遇到另一种介质时,也像光波一样产生反射和折射,并且服从几何光学的反射、折射定律。超声波在反射、折射过程中,其能量及波型都将发生变化。超声波在界面上的反射能量与透射能量的变化。取决于两种介质声阻抗特性。和其他声波一样,两介质的声阻抗特性差愈大,则反射波的强度愈大。例如,钢与空气的声阻抗特性相差10万倍,故超声波几乎不通过空气与钢的介面,全部反射。超声波在介质中传播时,随着传播距离的增加,能量逐渐衰减,能量的衰减决定于波的扩散、散射(或漫射)及吸收。扩散衰减,是超声波随着传播距离的增加,在单位面积内声能的减弱;散射衰减,是由于介质不均匀性产生的能量损失;超声波被介质吸收后,将声能直接转换为热能,这是由于介质的导热性、粘滞性及弹性造成的。

超声波传感器的测距原理:超声波发射器向某一方向发射超声波,在发射时刻的同时开始 计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。设超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离S ,即 S=340t/2。需要说明的是,超声波传感器发射的波束比较窄(<10°),反射后仍然很窄,如果被测物体被旋转放置,有可能反射波束会偏离出接收探头的位置,导致探头接收不到反射波信号,测距将失败。

 

第 2 章 图 超声波传感器测量物体距离原理示意图

超声波测距传感器包括有发射超声波和接收超声波的两部分装置,习惯上称为超声波换能器或超声波探头。常用的超声波传感器有两种,即压电式超声波传感器和磁致式超声波传感器。本实验采用的是压电式超声波传感器, 主要由超声波发射器(或称发射探头)和超声波接收器(或称接收探头)两部分组成,它们都是利用压电材料(如石英、压电陶瓷等)的压电效应进行工作的。利用逆压电效应将高频电振动转换成高频机械振动,产生超声波,以此作为超声波的发射器。而利用正压电效应将接收的超声振动波转换成电信号,以此作为超声波的接收器。

HCC--SSRR0044超声波测距模块可提供2cm--400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。

HC--SR04的时序图:

 

以上时序图表明你只需要提供一个10uS以上脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式:uS/58=厘米或者uS/148=英寸;或是:距离= 高电平时间*声速(340M/S)/2;建议测量周期为60ms以上,以防止发射信号对回响信号的影响。

基本工作原理:

采用IO口TRIG触发测距,给少10us的高电平信呈;

模块自动发送8个40khz的方波,自动检测是否有信号返回;

有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声;

波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;

 

图 超声波原理图

 

图 超声波实物图

有原理图可知,超声波的触发引脚和PB_9相连,回响信号与PB_8引脚相连。回响信号是超声波发出波与接收到回波的时间。

【实验步骤】

完成第3章节"RealView MDK4.22a集成开发环境",就可以做传感器实验了,首先打开光盘中的传感器工程文件。

右键解压程序源码 v1.rar, 选择解压到当前文件夹。

工程源码路径:华清远见-网络拓扑图资料光盘\无线传感模块\低功耗Wi-Fi部分-STM32F051\程序源码\STM23F051 超声波测距传感器(OK)\MDK-ARM

 

编译下载超声波程序(先编译后下载)

如果需要调试的话,应先下载程序,再点击右上方的调试按钮进入调试界面。

 

超声波模块连接

 

上图连接说明,AP模式的Wi-Fi是通过串口直接和PC机相连接。串口Wi-Fi接收到数据,以串口的形式输出到PC的串口调试助手上显示。

【实验结果】

利用串口调试工具做实验,打开串口调试工具,波特率115200、串口号(你的电脑的端口号)、点击打开。 接收到的数据如下,

 

可以通过串口发送21 57 04 00 53 00 02 C0 00 00 38 FA控制继电器的开。

21 51: 为字符'!W'

04 00 :设备地址 注意:04为低八位地址,00为高八位地址

53 :设备类型 'S' ,是超声波传感器

00 02 C0: 采集到的超声波与障碍之间的距离(单位:mm)。02 为高八位,C0 第八位。转成十进制704 mm

38:当前电池电量

FA :校验和。

【实验参考代码】

Main.c函数

COBOL Code

int main(void)

{

uint8_t Send_buf[11]={0};

uint8_t result = 0,i;

uint8_t flag = 0;

uint32_t distance;

SystemInit(); //系统时钟初始化

/* Configure LED6 */

STM_EVAL_LEDInit(LED6);

Systick_Init(); //滴答定时初始化

GPIO_Configuration_Init();

USART_Cfig_Init(); //串口初始化

NVIC_Configuration();

SR04_Config();

USART_RX_IntteruptEnable(COM1); //USART1 接收中断使能

USART_RX_IntteruptEnable(COM2); //USART2 接收中断使能

//初始化定时器

TIM_INT_Config();

//初始化中断

// STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_EXTI);

Send_buf[0] = 0x21;

Send_buf[1] = 'W';

Send_buf[2] = 0x04; //地址 低字节

Send_buf[3] = 0x00; //地址 高字节

Send_buf[4] = 'S';

while(1)

{

STM_EVAL_LEDOn(LED6);

distance = Sensor_using();

Send_buf[6] = distance >> 8;

Send_buf[7] = distance;

for(i=0;i<(11-2);i++)

{

result ^= Send_buf[i+1];

}

Send_buf[10] = result; //存储校验结果

UART_Send(USART2,Send_buf,11);

result = 0;

STM_EVAL_LEDOff(LED6);

printf("distance :%d\n",distance);

Delay(1000);

}

}

采集回响时间并转换成距离(单位mm)

COBOL Code

/*返回值 单位 毫米*/

uint32_t Sensor_using(void)

{

uint32_t distanceval =0;

uint16_t TIM=0,TIMS=0;

uint8_t i,j=0;

// for(i=0;i<5;i++)

// {

GPIO_SetBits(GPIOB,GPIO_Pin_9); //输出10us以上触发

delay_us(100);

GPIO_ResetBits(GPIOB,GPIO_Pin_9);

TIM_SetCounter(TIM2,0);

while(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)&& overflow==0); //检测到高电平

TIM_Cmd(TIM2, ENABLE); //开启定时器

while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8) && overflow==0); //检测到低电平

TIM_Cmd(TIM2, DISABLE);

if(overflow!=0)

{

overflow=0;

return 0.0;

}

TIM = TIM_GetCounter(TIM2); //读取当前值

distanceval = ((TIM *340)/2/10) - 50; //50 误差数值

//printf("\r\ndistance:%x mm\r\n",distanceval);

return(distanceval);

}

扫码申领本地嵌入式教学实录全套视频及配套源码

上一篇:Java线程创建

下一篇:WI-FI三轴传感器节点实验

400-611-6270

Copyright © 2004-2024 华清远见教育科技集团 版权所有
京ICP备16055225号-5京公海网安备11010802025203号