STM32F407学习笔记——HC-SR04模块(基本测距应用)
一、基本原理:
定义stm32的GPIO,给予Trig高电平(大于10us即可这里给予的是20us),再拉低发送超声波,超声波在碰到障碍物时返回被超声波模块接受,Echo输出高电平,通过定时器得出Echo高电平持续时间即可计算与障碍物之间的距离。
二、代码功能:
通过stm32控制超声波模块将测得的距离反馈在串口上。
三、接线:Trig——PA6 、Echo——PA7
四、代码部分:
HC-SR04.h
#ifndef _sr04_H
#define _sr04_H
#include "sys.h"
#define TRIG_Send PAout(6)
#define ECHO_Reci PAin(7)
float Senor_Using(void);
void TIM4_Int_Init(void);
#endif
HC-SR04.c
#include "HC-SR04.h"
#include "delay.h"
#include "math.h"
int overcount=0;
//GPIO及定时器设置
void TIM4_Int_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
GPIO_Init(GPIOA,&GPIO_InitStruct);
TIM_TimeBaseStructure.TIM_Period = 999;
TIM_TimeBaseStructure.TIM_Prescaler =71;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE );
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM4, DISABLE);
}
//测距函数
float Senor_Using(void)
{
float length=0,sum=0;
u16 tim;
unsigned int i=0;
while(i!=5)
{
PAout(6)=1;
delay_us(20);
PAout(6)=0;
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)==RESET);
TIM_Cmd(TIM4,ENABLE);
i+=1;
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)==SET);
TIM_Cmd(TIM4,DISABLE);
tim=TIM_GetCounter(TIM4);
length=(tim+overcount*1000)/58.0;
sum=length+sum;
TIM4->CNT=0;
overcount=0;
delay_ms(100);
}
length=sum/5;//取均值
return length;
}
//中断函数
void TIM4_IRQHandler(void)
{
if (TIM_GetITStatus(TIM4,TIM_IT_Update)!= RESET)
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update );
overcount++;
}
}
main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "HC-SR04.h"
int main(void)
{
float length;
delay_init(168);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(9600);
TIM4_Int_Init();
while(1)
{
length = Senor_Using();
printf("¾àÀëΪ:%.3fcm\n",length);
delay_ms(1000);
}
}
PS:
(1):所用模板为正点原子
(2):超声波模块5v供电
(3):基于stm32f407zgt6测试成功
仅供初学者学习使用