单片机学习小组
登录
直播中
石正厚
8年用户
1214经验值
私信
关注
HC-SR04超声波模块驱动的原理以及过程是怎样的?
开启该帖子的消息推送
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;
}
}
}
一、前期准备
单片机: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;
}
}
}
举报
更多回帖
rotate(-90deg);
回复
相关问答
HC-SR04
超声波
HC-SR04
超声波模块
的原理与时序详解
2022-01-20
3672
怎样
去编写
HC-SR04
超声波模块
的控制程序呢
2021-11-08
1496
如何通过
HC-SR04
超声波模块
去实现测距功能呢
2021-12-13
2837
超声波模块
HC-SR04
死机
2019-06-06
2781
HC-SR04
超声波模块
检测不到高电平
2017-06-30
5796
如何去编写
HC-SR04
超声波
测距
模块
的
驱动
程序呢
2021-12-15
1712
哪位大侠用过
超声波模块
HC-SR04
??
2012-05-25
4117
如何利用
HC-SR04
超声波
测距
模块
去实现精确的直线测距呢
2021-10-20
1778
HC-SR04
超声波模块
为什么要发8个脉冲出去
2016-11-16
7933
如何对基于STM32F103VET6的
超声波
传感器
HC-SR04
进行测距呢
2021-11-09
2182
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分