STM32F103VET6超声波模块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;