STM32F1驱动超声波模块实验

超声波模块测得的距离一直是固定值的同仁看过来:

bug图片

如果你是用3.3v给开发板供电,但用到了开发板的5v给HC-SR04供电,那么你就和我掉进的同一个坑

出现这个问题的原因是STM32开发板一般没有升压芯片或其他升压措施,因此低于5v给开发板供电是不可能输出5v电压的 ,根据测量它只有2.86v,这就导致了HC-SR04供电不足的问题

在这里插入图片描述

在我认为是代码问题并修改了16个小时的最后一分钟,我发现他是供电不足引起的,这一结论真让我哭笑不得

开篇闲谝:

耀风(鄙人)是一个STM32才入门的小白所以文章写的不是很严谨,如果有错误欢迎大家指正。我写这篇文章的目的有两个:
第一,记录本次实验方便自己以后查看(毕竟卡了我16个小时,错误原因竟然是哭笑不得的供电不足)。
第二,分享给其他在学或还不知道怎么使用超声波模块的同仁,避免犯和我一样的错误。

编程IDE工具: KEIL5

实验所需材料:

1.STM32F1系列单片机任意一款
2. HC_SR04超声波模块
3.杜邦线若干

引脚连接:

Tring —>PA4

Echo —>PA5

GND —>GND

VCC —>5v~5.5v

网上资料说超声波模块的供电电压在3~5.5v,但是还是建议用5v左右,因为稳定。如果STM32不是5v供电,那么就不要用STM32开发板上的引脚给HC_SR04供电。

原因就是STM32开发板一般没有升压芯片或其他升压措施,因此低于5v给开发板供电是不可能输出5v电压的 (再啰嗦一遍)

实验原理:

超声波时序图

通过STM32的GPIO给HC_SR04模块的Tring引脚输出一个至少10us的高电平开启超声波模块,然后超声波模块就会自动发送一个连续的由8个40KHZ脉冲组成的脉冲串,发送完成后HC_SR04模块的Echo引脚会变成低电平并且HC_SR04模块的芯片也会开始时。如果HC_SR04发出的脉冲串遇到障碍物就会被反射回来,当超声波模块接收到返回的脉冲串时就会将Echo引脚变成高电平并且HC_SR04模块的芯片也会停止计时,Echo引脚输出高电平的时间就是脉冲串从发出到接收的时间。

由上面这巴拉巴拉的一段话我们可以知道驱动HC_SR04的步骤:

1. 通过STM32的GPIO给HC_SR04的Tring引脚输出一个至少10us的高电平
2. 当HC_SR04的Echo引脚输出高电平时开启STM32的定时器或Systick定时器开始计时,当Echo引脚输出低电平时停止计时,并记录时间
3. 根据时间算距离
distance = T(所测时间)x 340m/s / 2 = T(所测时间) x 170m/s = T(所测时间) x 17000 cm / 1000 000 us = T(所测时间)/ 1000 000 us / 17000 cm = T(所测时间)/ 58.0(近似值)

不想看上面推导的朋友知道距离 distance = T(所测时间)/ 58.0 就可以了

代码核心片段讲解:

//**********引脚初始化*************
void init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
}
/***********延时函数定义(使用Systick定时器实现)**************
1.用Systick定时器的原因就是它操作简单一点,不用初始化,直接调用SysTick_Config()函数即可,然后在写个相应中断函数就可
2.因为在本项目中延时和定时不用同时运行,所以这两个功能用一个定时器就好
*************************************************************/
void delay_ms(uint32_t time)
{
	TIME = time;
	State = 0;  // 用于区分是Systick因延时的进入中断还是因定时进入中断
	SysTick_Config(72000); //定时器每1ms计时一次
	while(TIME!=0);
	SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk; //关闭定时器
}

void delay_us(uint32_t time)
{
	TIME = time;
	State = 0;// 用于区分是Systick因延时的进入中断还是因定时进入中断
	SysTick_Config(72);//定时器每1us计时一次
	while(TIME!=0);
	SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;//关闭定时器
}

//************测引脚电平持续时间函数定义******************
uint32_t pulseIn(GPIO_TypeDef* GPIOx,uint16_t Pin,STATE state)
{
	uint32_t time = 0;
	uint8_t i ;
	while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == (u8)!state){}
	State = 1;
	TIME = 0;
	SysTick_Config(72); //一定要以1us为溢出时间,因为算距离的公式中的T是以us为单位的
	while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == (u8)state){}

	
	SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
	time = TIME;
	TIME = 0;
	printf(" Time = %d\n",time);
	
	return time;
}

extern int TIME;
extern uint8_t State;
void SysTick_Handler(void)
{
	if(State == 0)  //因延时函数中的SysTick定时器溢出进入
	 TIME--;
	else if(State == 1) //因定时中的SysTick定时器溢出进入
		TIME++;
}

int main(void)
{
	init();	
    Usart_begin(USART1,9600); //这是我自己写的STM32库函数二次封装中的USART1初始化函数
                              //啊吧啊吧,本来整个工程都是用我开发的二次封装写的,奈何我竟傻傻的16个小时都认为是代码问题,所以就改掉了。
 while(1){
	float distance;
	GPIO_ResetBits(GPIOA,GPIO_Pin_4);
	delay_us(10);
	GPIO_SetBits(GPIOA,GPIO_Pin_4);
	delay_us(20);
	GPIO_ResetBits(GPIOA,GPIO_Pin_4);
	
    distance = (float)pulseIn(GPIOA, GPIO_Pin_5,HIGH)/58.0; //算出距离(58.0的原因前面有讲解)
    
    printf("distance = %.2lf\n",distance);
	delay_ms(200);
	}
}

后面我会专门写一个这个二次封装用法的文章的,大家先搞着用这个四不像的工程代码吧。啊吧啊吧

输出正常:

在这里插入图片描述
在这里插入图片描述

代码分享:

耀风写的代码,需要请点击下载
提取码:YFJS
  • 11
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
要在STM32驱动超声波模块,你可以按照以下步骤进行操作: 1. 首先,连接超声波模块STM32开发板。将VCC引脚连接到5V电源,GND引脚连接到地线,Trig引脚连接到一个输出引脚(用于发射超声波信号),Echo引脚连接到一个输入引脚(用于接收返回的超声波信号)。 2. 在你的STM32工程中,包含"hc_sr04.h"头文件,并在代码中声明一个全局变量`float Dist_cm`,用于存储测量到的距离。 3. 在代码中调用`HC_SR04_Init()`函数,用于初始化超声波模块。 4. 在主循环中,发送一个至少10us的TTL电平信号来触发超声波模块。可以使用STM32的GPIO库来设置输出引脚的电平。 5. 等待一段时间,让超声波模块发出8个40KHZ的脉冲。 6. 接收回响信号,根据高电平的时间来计算出距离。可以使用STM32的GPIO库来读取输入引脚的电平,并根据计算公式`T(s) * 340(m/s) / 2`计算距离。 请注意,具体的代码实现可能会因为使用的STM32型号和开发环境而有所不同。你需要根据你的具体情况进行相应的调整和修改。 #### 引用[.reference_title] - *1* *2* [STM32驱动HC-SR04超声波模块](https://blog.csdn.net/m0_49476241/article/details/130179740)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【STM32篇】驱动HC_SR04超声波测距模块](https://blog.csdn.net/we_long/article/details/128671122)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值