单片机学习小组
直播中

石正厚

8年用户 1214经验值
私信 关注

HC-SR04超声波模块驱动的原理以及过程是怎样的?

HC-SR04超声波模块驱动的原理以及过程是怎样的?

回帖(1)

董方帅

2022-2-28 11:51:09
一、前期准备
单片机:STM32F103C8T6
开发环境:MDK5.14
库函数:标准库V3.5
二、实验效果



三、驱动原理
触发信号Tirig维持10Us以上的高电平即可等待Echo的返回,这里是用EXTI检测俩个跳变信号,去打开和关闭定时器,最后一次测量计算结果后清除定时器计时,并等待下一个循环开始。需要完整工程或者有问题的请加QQ:1002521871,验证:呵呵。

四、驱动代码
US-020.h

#ifndef __US_020_H__
#define        __US_020_H__
#include "stm32f10x.h"
#include "gpio.h"
#include "delay.h"

#define                        Trig                        PAout(0)
#define                        Trig_Pin                GPIO_Pin_0
#define                        Trig_Port                GPIOA
#define                        Trig_CLKLine        RCC_APB2Periph_GPIOA
#define                        Echo                        PAin(1)
#define                        Echo_Pin                GPIO_Pin_1
#define                        Echo_Port                GPIOA
#define                        Echo_CLKLine        RCC_APB2Periph_GPIOA

extern uint32_t US_Count;
extern void US_020Configuration(void);
extern void US_SendStartSignal(void);
extern float US_DataConversion(uint32_t *count);
#endif


US-020.c

#include "US-020.h"

uint32_t US_Count = 0;
void US_020Configuration(void)
{
        GPIO_InitTypeDef    GPIO;
    NVIC_InitTypeDef         MyNVIC;      
        EXTI_InitTypeDef        MyEXTI;
    //Enable APB2 Bus
    RCC_APB2PeriphClockCmd(Trig_CLKLine | Echo_CLKLine, ENABLE);
   
    //Register IO
    GPIO.GPIO_Pin   = Trig_Pin;
    GPIO.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_Init(Trig_Port, &GPIO);
      
        Trig = 0;
        //Register IO
    GPIO.GPIO_Pin   = Echo_Pin;
    GPIO.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
    GPIO_Init(Echo_Port, &GPIO);
      
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                                //设置中断优先级组为1,优先组(可设0~4位)
      
        MyNVIC.NVIC_IRQChannel = EXTI1_IRQn;                                //设置中断向量号
        MyNVIC.NVIC_IRQChannelPreemptionPriority = 0;        //设置抢先优先级
        MyNVIC.NVIC_IRQChannelSubPriority = 1;                        //设置响应优先级
        MyNVIC.NVIC_IRQChannelCmd = ENABLE;                                //使能NVIC
        NVIC_Init(&MyNVIC);
      
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);
        MyEXTI.EXTI_Line        = EXTI_Line1;
        MyEXTI.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
        MyEXTI.EXTI_Mode        = EXTI_Mode_Interrupt;
        MyEXTI.EXTI_LineCmd        = ENABLE;
        EXTI_Init(&MyEXTI);
}

void US_SendStartSignal(void)
{
        Trig = 1;
        DelayUs(20);
        Trig = 0;
}
      
float US_DataConversion(uint32_t *count)
{
        float result = 0;
        result = (float)((float)(*count * 340) / 2000.0);
        *count = 0;
        return result;
}

void EXTI1_IRQHandler(void)
{
        if (EXTI_GetITStatus(EXTI_Line1) != RESET)
        {
                EXTI_ClearITPendingBit(EXTI_Line1);
                if (Echo == 1)
                {
                        TIM_Cmd(TIM3, ENABLE);  
                        LED = 0;
                }
               
                if (Echo == 0)
                {
                        TIM_Cmd(TIM3, DISABLE);  
                        LED = 1;
                }
        }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分