访问手机版页面
你的位置:老古开发网 > STM32单片机 > STM32F103单片机 > 正文  
STM32F103VET6超声波模块HC-SR04 的测试例程
内容导读:
近来有时间,整理一下资料,自己近十年来,业余画了不少的开发测试板,在淘宝上也买了不少的板子与器件,一直以来,都喜欢DIY,今天整理了一下超声波模块HC-SR04的程序,网上资料应该不少,自己工作中也接触过。记录

近来有时间,整理一下资料,自己近十年来,业余画了不少的开发测试板,在淘宝上也买了不少的板子与器件,一直以来,都喜欢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;

标签: hc-sr04,超声波模块,stm32f103vet6,
来源:互联网 作者:karen 时间:2018/7/27 12:50:02
相关阅读
推荐阅读
阅读排行
最近更新
商品推荐