STM32F407研究ノート-HC-SR04モジュール(基本的なレンジングアプリケーション)

STM32F407研究ノート-HC-SR04モジュール(基本的なレンジングアプリケーション)

1.基本原理:
stm32のGPIOを定義し、Trigを高レベルにし(ここでは10us以上は20usです)、プルダウンして超音波を送信します。超音波は障害物に当たると超音波モジュールに戻り、エコーします。ハイパワーを出力しますタイマーを通してエコーハイレベルの持続時間を取得すると、障害物までの距離を計算できます。

2.コード機能:
stm32を介して超音波モジュールを制御し、シリアルポートで測定された距離をフィードバックします。

3.配線:トリガー-PA6、エコー-PA7

4.コード部分:
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に基づく

初心者が学び、使用するためだけに

おすすめ

転載: blog.csdn.net/weixin_54121461/article/details/113996294