单片机:实现HC-SR04超声波测距带温度补偿(附带源码)
创作时间:
作者:
@小白创作中心
单片机:实现HC-SR04超声波测距带温度补偿(附带源码)
引用
CSDN
1.
https://m.blog.csdn.net/m0_61840987/article/details/144720818
本项目通过结合HC-SR04超声波模块和温度传感器,使用STM32单片机实现了带温度补偿的超声波测距功能。通过实时测量环境温度,计算超声波的传播速度,并据此调整测得的距离值,从而提高了在不同温度环境下的测量精度。这种方法能够适应温度变化,保证测距的稳定性和准确性。
项目背景与目标
HC-SR04是一款常用的超声波传感器,用于测量距离。它通过发射超声波脉冲并接收回波来计算物体的距离。在理想情况下,超声波的传播速度是恒定的,但实际上超声波的传播速度会受到环境温度的影响,导致测量误差。因此,带温度补偿的测距方案能够提高测量精度,尤其是在温度变化较大的环境中。
本项目的目标是利用STM32单片机实现HC-SR04超声波模块的测距,并结合温度补偿,调整超声波传播速度,从而提高测量准确性。
硬件设计
硬件组件
- HC-SR04超声波模块:包括发射端和接收端,能够发射超声波信号并接收反射信号。它通过触发引脚(Trig)发送信号,Echo引脚接收回波信号。
- 温度传感器:通常使用DHT11、DHT22或DS18B20等温度传感器来获取环境温度,进而计算温度对超声波传播速度的影响。
- STM32单片机:控制HC-SR04模块的工作、读取温度传感器的数据,并进行计算。
- 电源:为单片机和模块提供电源。
硬件连接
- HC-SR04:
- Trig引脚连接到单片机的GPIO输出引脚。
- Echo引脚连接到单片机的GPIO输入引脚,检测回波信号。
- 温度传感器(如DHT11):
- 数据引脚连接到单片机的GPIO输入引脚。
软件设计
原理
超声波在空气中的传播速度受温度影响,可以通过公式计算:
其中,v为声速(单位:m/s),T为环境温度(单位:°C)。通过获取当前温度,我们可以计算出实际的声速,并将其用于计算超声波的传播时间,从而得到更精确的测距结果。
测距原理
- Trig引脚:发送一个高电平脉冲(持续约10微秒)以触发HC-SR04发射超声波信号。
- Echo引脚:等待接收到超声波回波。回波持续时间(高电平时间)与超声波传播的时间成正比,回波时间ttt可通过定时器计算。
- 距离计算:
其中,v为声速,t为回波的时间,距离单位为米。除以2是因为回波是从目标物体反射回来的,因此测量的是往返距离。
代码实现
以下是基于STM32的示例代码,用于实现HC-SR04超声波测距并带有温度补偿:
#include "stm32f4xx_hal.h"
#include "stdio.h"
#include "dht11.h" // 假设使用DHT11温度传感器库
#define TRIG_PIN GPIO_PIN_0
#define ECHO_PIN GPIO_PIN_1
#define GPIO_PORT GPIOA
#define SOUND_SPEED_20C 343.2 // 在20°C下声速(m/s)
// 定义变量
uint32_t pulse_duration = 0;
float distance = 0.0;
float temperature = 0.0;
float sound_speed = SOUND_SPEED_20C;
// 定时器初始化
void Timer_Init(void) {
__HAL_RCC_TIM2_CLK_ENABLE();
TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 8399; // 1kHz时钟(1ms中断)
htim2.Init.Period = 10000; // 自动重装载周期
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&htim2);
HAL_TIM_Base_Start_IT(&htim2); // 启动定时器中断
}
// 超声波发射和接收函数
void HC_SR04_Init(void) {
// 配置Trig为输出模式,Echo为输入模式
GPIO_InitTypeDef GPIO_InitStruct = {0};
// Trig引脚初始化
GPIO_InitStruct.Pin = TRIG_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIO_PORT, &GPIO_InitStruct);
// Echo引脚初始化
GPIO_InitStruct.Pin = ECHO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
HAL_GPIO_Init(GPIO_PORT, &GPIO_InitStruct);
}
// 触发超声波信号
void Trigger_HC_SR04(void) {
HAL_GPIO_WritePin(GPIO_PORT, TRIG_PIN, GPIO_PIN_SET);
HAL_Delay(10); // 保持10微秒
HAL_GPIO_WritePin(GPIO_PORT, TRIG_PIN, GPIO_PIN_RESET);
}
// 计算超声波回波持续时间
void Measure_Echo(void) {
pulse_duration = 0;
while (HAL_GPIO_ReadPin(GPIO_PORT, ECHO_PIN) == GPIO_PIN_SET) {
pulse_duration++;
HAL_Delay(1); // 每1ms计数
}
}
// 温度获取函数(假设使用DHT11传感器)
void Get_Temperature(void) {
temperature = DHT11_ReadTemperature(); // 从DHT11读取温度
sound_speed = 331.3 + 0.606 * temperature; // 根据温度计算声速
}
// 距离计算
void Calculate_Distance(void) {
distance = (sound_speed * pulse_duration) / 2000.0; // 距离 = 声速 × 时间 / 2
}
// 主函数
int main(void) {
HAL_Init();
// 初始化GPIO和定时器
HC_SR04_Init();
Timer_Init();
// 主循环
while (1) {
// 获取温度,计算声速
Get_Temperature();
// 触发HC-SR04发射超声波信号
Trigger_HC_SR04();
// 测量Echo引脚的回波持续时间
Measure_Echo();
// 计算距离
Calculate_Distance();
// 处理测量结果(例如输出到串口显示)
printf("Temperature: %.2f°C, Distance: %.2f meters\n", temperature, distance);
HAL_Delay(500); // 每隔500ms测量一次
}
}
代码解释
- 定时器初始化:
- 使用TIM2定时器以1ms的频率进行计时,用于测量Echo引脚的高电平持续时间,进而计算超声波传播时间。
- GPIO初始化:
HC_SR04_Init()函数配置了GPIO引脚,Trig引脚为输出模式,用于触发超声波的发射;Echo引脚为输入模式,用于读取回波信号。
- 超声波触发和回波测量:
Trigger_HC_SR04()函数用于向HC-SR04的Trig引脚发送一个10微秒的高电平脉冲,触发超声波信号的发射。Measure_Echo()函数用于检测Echo引脚的高电平持续时间,即超声波从发射到反射回来的时间。
- 温度获取与声速计算:
Get_Temperature()函数通过DHT11传感器获取当前温度,并使用公式v = 331.3 + 0.606 * T计算出实际的声速。
- 距离计算:
Calculate_Distance()函数根据超声波的回波时间和实际声速,计算出目标物体的距离。
- 输出结果:
- 每次测量后,通过串口(
printf())输出温度和测得的距离。
总结
本项目通过结合HC-SR04超声波模块和温度传感器,使用STM32单片机实现了带温度补偿的超声波测距功能。通过实时测量环境温度,计算超声波的传播速度,并据此调整测得的距离值,从而提高了在不同温度环境下的测量精度。这种方法能够适应温度变化,保证测距的稳定性和准确性。
本文原文来自CSDN
热门推荐
年糕怎么保存 年糕变硬如何回软
关税风云录:从南北战火到中美贸易波澜的历史回响
硫酸新霉素的作用功效
醋酸氯己定的功效和作用是什么
装饰材料行业色彩一致性的管理解决方案
痘痘的起因曝光!神经酰胺是最佳解决方案?挑战!30天「神经酰胺与抗痘」保养计划
自制天然去污粉的方法:马桶的黄渍、霉菌、水垢全部消失
室内绿植养护指南:打造绿色健康生活空间
胳膊剧烈疼痛竟是颈椎惹的祸,微创手术巧解压迫神经的“大山”
宋朝皇室对宗室女的婚姻有何规定?宋代婚嫁制度有何变化?
《赛马娘 热血喧闹大感谢祭!》评测 门槛十分低的轻松派对游戏
移动得更好,用侧弓步避开伤害
脸上长了痘挤了就能好?正确处理方法在这里
被AlphaGo击败的李世石,用8年重建崩塌的世界
高中数学备考攻略:必练题型盘点及高效刷题推荐
脾切除手术后可能出现的五大后遗症及预防措施
脾切除手术后的饮食护理指南
9200 万独居青年的深夜觉醒:从 “生存性孤独“ 到 “创造性独处
全球视野下的公司名称注册:步骤、注意事项与各国要求全解析
汉式婚礼:从炎黄到明末的四千年传承
盘点植物大战僵尸各大版本,你都玩过几个?
二战末期的"虎王":一场被遗忘的装甲传奇
糖尿病饮食指南:低GI水果清单与科学搭配建议
【科普帖】大家平时睡的枕头都选对了吗?——枕头应如何选择
魏纯暹新作《艺术城市》:以艺术视角探索城市发展的未来之路
地铁站装修效果图设计:塑造城市文化与现代交通的新地标
交通强国·试点先行 | 这样做让交通更加“智慧”
新能源汽车最大载重375公斤引发争议
日本学院动漫:从经典到新兴的发展历程
从 "兵仙" 到 "反贼":韩信的悲剧人生与帝王权术的博弈