访问电脑版页面

导航:老古开发网手机版STM32单片机STM32F103单片机

STM32F103VET6超声波模块HC-SR04 的测试例程

导读:近来有时间,整理一下资料,自己近十年来,业余画了不少的开发测试板,在淘宝上也买了不少的板子与器件,一直以来,都喜欢DIY,今天整理了一下超声波模块HC-SR04的程序,网上资料应该不少,自己工作中也接触过。记录
关键字:
hc-sr04,超声波模块,stm32f103vet6,

近来有时间,整理一下资料,自己近十年来,业余画了不少的开发测试板,在淘宝上也买了不少的板子与器件,一直以来,都喜欢DIY,今天整理了一下超声波模块HC-SR04的程序,网上资料应该不少,自己工作中也接触过。记录一下。


超声波如何设计的我不太关心,我只关心如何使用。这个模块可以+3.3V供电,四个引脚,使用STM32两个GPIO引脚控制即可,测试起来,简单。


超声波模块工作的原理:首先需要触发trig,就像是打开或是使能的作用,让超声波工作起来。然后,超声波通过echo返回一段高电平,高电平的时间,就是声音到达障碍物返回的时间,声速是固定的340m/S,因此,可以求得距离。这里是2倍距离的时间,因此计算公式为:2L = Vt = 340m/S * t,这里t单位为S(秒)。


STM32如何操作超声波模块呢?

(1)一个GPIO引脚Trig,用于触发。

(2)一个GPIO引脚接Echo,设置为外部中断,用来接收触发后返回来的高电平。

(3)一个定时器(计数器),用来测时间。

(4)可以使用另一个定时器,如Systick,隔一段时间用来触发一次超声波模块,从而不断获取当前的距离值。

(5)一个串口,用来打印输出测量的距离。


驱动代码如下:


/********************(C)COPYRIGHT2017**************************

*文件名:Sonic.c

*描述:超声波模块测试例程

*实验平台:STM32F103VET6

*库版本:ST3.5.0

*

*编写日期:2017-04-10

*修改日期:2017-04-14

*作者:

****************************************************************************/

#include"Sonic.h"

/*******************************************************************************

*SonicInit

*******************************************************************************/

u32Distance=0;

u8Done;

u32__IOtime_1ms=0;

voidTIM6_Init(void)

{

TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;

//NVIC_InitTypeDefNVIC_InitStructure;

/*TIM6clockenable*/

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);

/*Timebaseconfiguration*/

TIM_TimeBaseStructure.TIM_Period=0xFFFF;

TIM_TimeBaseStructure.TIM_Prescaler=142;//144分频,500K的计数器

TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);

TIM_ITConfig(TIM6,TIM_IT_Update,DISABLE);

TIM_Cmd(TIM6,DISABLE);

}

voidSonic_Init(void)

{

NVIC_InitTypeDefNVIC_InitStructure;

EXTI_InitTypeDefEXTI_InitStructure;

GPIO_InitTypeDefGPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;//PC4Trig

GPIO_Init(GPIOC,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//PC5Echo

GPIO_Init(GPIOC,&GPIO_InitStructure);

GPIO_WriteBit(GPIOC,GPIO_Pin_4,(BitAction)0);//trig

//EXTI_DeInit();

EXTI_ClearITPendingBit(EXTI_Line5);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);

EXTI_InitStructure.EXTI_Line=EXTI_Line5;

EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling;

EXTI_InitStructure.EXTI_LineCmd=ENABLE;

EXTI_Init(&EXTI_InitStructure);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructure);

Distance=0;

Done=1;

}

voidSonic_Trig(void)

{

u16i=0;

if((Done==1)&&(time_1ms>100))

{

time_1ms=0;

GPIO_WriteBit(GPIOC,GPIO_Pin_4,(BitAction)1);

for(i=0;i<0xf0;i++);

GPIO_WriteBit(GPIOC,GPIO_Pin_4,(BitAction)0);

Done=0;

}

}

voidEXTI9_5_IRQHandler(void)

{

staticu8flag_Sta=0;

if(EXTI_GetITStatus(EXTI_Line5)!=RESET)

{

EXTI_ClearITPendingBit(EXTI_Line5);

if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==1)

{

TIM_SetCounter(TIM6,0);

flag_Sta=1;

TIM_Cmd(TIM6,ENABLE);

}

else

{

TIM_Cmd(TIM6,DISABLE);

if(flag_Sta)

{

Distance=TIM_GetCounter(TIM6);

Distance=Distance/29;

if(Distance>300)

Distance=300;

Done=1;

}

flag_Sta=0;

来源:互联网   作者:karen  2018/7/27 12:50:02
栏目: [ STM32F103单片机]

相关阅读

STM32F103试用体验:LCD显示与DHT11测量实验

STM32F103学习笔记 (十) TFTLCD 显示

STM32F103学习笔记 (八) PWM输出

STM32F103外部晶振由8M变为12M

基于STM32F103ZE的USART2 端口时钟

STM32F103系列单片机中的定时器工作原理解析

STM32F103利用模拟I2C驱动ADS1115

STM32F103 开发板试用体验:超声波测距功能的实现

嵌入式微处理器STM32F103有什么特点和应用?怎样去开发?

利用stm32f103的TIM2实现精确延时

STM32F103C8T6 ULN2003步进电机驱动代码

STM32F103ZET6 之 通用定时器单脉冲模式实验

stm32F103单片机无源晶振不起振排除问题

STM32F103试用体验(四):硬件原理与机壳组装

STM32F103试用体验:水共震准备材料中的过程

基于单片机Stm32f103 DAC电流输出解决方案

stm32f103zet6如何识别flash大小

100脚的STM32F103VE单片机通过FSMC接口读写DS12C887时钟芯片中的寄存器

STm32F103ZET6红牛开发板原理图

基于STM32F103的USB数据采集模块的设计