0 卖盘信息
BOM询价
您现在的位置: 首页 > 技术方案 >健康医疗 > 基于STM8S103F3P6的超声波测距仪设计方案

基于STM8S103F3P6的超声波测距仪设计方案

来源:
2024-10-23
类别:健康医疗
eye 15
文章创建人 拍明芯城

基于STM8S103F3P6的超声波测距仪设计方案

引言

超声波测距仪是一种利用超声波传播时间来测量距离的设备,在工程、科研以及日常生活中有着广泛的应用。超声波测距具有非接触、指向性好、传播速度恒定、易于检测等优点,能够在极端或恶劣的工作环境中保障操作人员的人身安全,并能实时测量。本文将详细介绍基于STM8S103F3P6的超声波测距仪设计方案。

image.png

主控芯片介绍

型号及特性
  • 型号:STM8S103F3P6

  • 厂商:STMicroelectronics(意法半导体)

  • 封装:TSSOP-20

  • 主要特性

    • 8位微控制器,低功耗、高性能,适合小型化、智能化的嵌入式应用。

    • 拥有32KB的闪存和2KB的SRAM。

    • 内置ADC(模数转换器)和定时器,能够处理超声波信号的发射与接收。

    • 具有3级流水线的哈佛结构与扩展指令集的内核,性能稳定,运算速度快。

    • 支持多次重复擦写的Flash程序存储器,时钟控制灵活方便,有多种寄存器。

    • 时钟源包括外部时钟输入、内部低功耗128kHz RC等四个主时钟源。

    • 含有窗口看门狗和独立看门狗两个看门狗定时器,中断资源丰富。

在设计中的作用

STM8S103F3P6作为主控芯片,在超声波测距仪的设计中起到了核心作用。通过其内部定时器记录超声波的发射与接收时间差,并利用ADC将传感器的模拟信号转换为数字值,从而实现距离的精确测量。同时,STM8S103F3P6还通过GPIO接口控制超声波传感器的发射和接收状态,并通过串行通信能力驱动显示模块,如OLED显示屏或LED指示灯,用于显示测量结果和状态指示。

超声波测距仪设计方案

系统总体架构

超声波测距仪主要由以下几个部分组成:

  1. MCU单元:STM8S103F3P6单片机,控制整个电路的运行。

  2. 超声波模块:采用HC-SR04等型号的超声波传感器,用于发射和接收超声波信号。

  3. 测温单元:使用DS18B20温度传感器,实时测量环境温度,用于温度补偿以提高测量精度。

  4. 按键单元:用于调整预设预警值。

  5. 显示单元:OLED显示屏,用于显示测量结果。

  6. 指示单元:LED指示灯和蜂鸣器,用于状态指示和预警提示。

系统工作原理
  1. 超声波测距原理

超声波测距的基本原理是利用超声波在空气中的传播速度恒定,通过测量超声波从发射到接收的时间差来计算距离。设超声波的传播速度为c(在空气中约为343米/秒),传播时间为t,则超声波往返的距离S为:

S = c * t

由于测量的是单程距离,因此实际距离L为:

L = S / 2

  1. 工作流程

    • STM8S103F3P6单片机控制超声波传感器HC-SR04发射一个短暂的40KHz超声波脉冲。

    • 单片机进入等待模式,通过内部定时器记录从发射到接收到回波的时间差t。

    • 根据时间差t和超声波的传播速度c,计算出超声波往返的距离S,进而得到目标距离L。

    • 同时,通过DS18B20温度传感器实时测量环境温度,并进行温度补偿以提高测量精度。

    • 计算结果通过OLED显示屏显示出来,并根据测量值通过LED指示灯和蜂鸣器进行状态指示和预警提示。

硬件设计
  1. MCU单元

STM8S103F3P6单片机作为主控芯片,负责整个电路的控制和数据处理。其引脚配置如下:

  • GPIO口:用于控制超声波传感器的发射和接收状态,以及驱动显示模块和指示单元。

  • ADC口:用于将传感器的模拟信号转换为数字值,以便单片机进行处理。

  • 定时器:用于记录超声波的发射与接收时间差。

  1. 超声波模块

采用HC-SR04超声波传感器,其工作原理如下:

  • VCC和GND分别接电源和地。

  • Trig引脚接STM8S103F3P6的一个GPIO口,用于控制超声波的发射。

  • Echo引脚接STM8S103F3P6的另一个GPIO口(带中断功能),用于接收超声波的回波信号。

  1. 测温单元

使用DS18B20温度传感器,其工作原理如下:

  • VCC和GND分别接电源和地。

  • DQ引脚接STM8S103F3P6的一个GPIO口(通过单总线协议通信)。

  1. 显示单元

采用OLED显示屏,用于显示测量结果。其工作原理如下:

  • VCC和GND分别接电源和地。

  • 数据接口(如SPI或I2C)接STM8S103F3P6的相应GPIO口。

  1. 指示单元

包括LED指示灯和蜂鸣器,用于状态指示和预警提示。其工作原理如下:

  • LED指示灯:通过STM8S103F3P6的GPIO口控制其亮灭状态。

  • 蜂鸣器:通过STM8S103F3P6的GPIO口控制其发声状态。

  1. 电源模块

采用5V稳压直流电源,可由自锁开关控制选择是用USB或者是排针输入。

软件设计
  1. 程序总体结构

软件设计采用模块化思想,主要包括以下几个模块:

  • 初始化模块:用于初始化单片机、超声波传感器、温度传感器、显示模块和指示单元等。

  • 超声波测距模块:用于控制超声波传感器的发射和接收,并计算距离。

  • 温度补偿模块:用于实时测量环境温度,并进行温度补偿以提高测量精度。

  • 显示模块:用于将测量结果显示在OLED屏幕上。

  • 指示模块:用于根据测量值通过LED指示灯和蜂鸣器进行状态指示和预警提示。

  • 按键处理模块:用于处理按键输入,调整预设预警值。

  1. 关键代码实现

以下是部分关键代码的实现示例:


// 初始化函数  

void Initialization(void)  

{

// 初始化单片机  

STM8S_Clock_DeInit(); // 时钟初始化  

STM8S_DeInitGPIO(GPIOA, GPIO_PIN_ALL); // GPIO初始化  

STM8S_ADC1_DeInit(); // ADC初始化  

STM8S_TIM2_DeInit(); // 定时器初始化  



// 初始化超声波传感器  

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_PIN_0; // Trig引脚  

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP_Low_Speed;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_PIN_1; // Echo引脚  

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);



// 初始化温度传感器  

// ...(省略具体代码)  



// 初始化显示模块  

// ...(省略具体代码)  



// 初始化指示单元  

// ...(省略具体代码)  

}



// 超声波测距函数  

uint16_t Measure_Distance(void)  

{

uint16_t distance = 0;

uint32_t time = 0;



// 发射超声波信号  

GPIO_SetBits(GPIOA, GPIO_PIN_0);

Delay_us(10); // 延时10us  

GPIO_ResetBits(GPIOA, GPIO_PIN_0);



// 等待Echo引脚高电平信号  

while (GPIO_ReadInputDataBit(GPIOA, GPIO_PIN_1) == Bit_RESET);



// 定时器开始计时  

TIM2_TimeBaseInit(TIM2_PRESCALER_1, 0xFFFF); // 定时器预设值  

TIM2_Cmd(ENABLE); // 启动定时器  



// 等待Echo引脚低电平信号  

while (GPIO_ReadInputDataBit(GPIOA, GPIO_PIN_1) == Bit_SET);



// 获取定时器计数值  

time = TIM2_GetCounter();

TIM2_Cmd(DISABLE); // 停止定时器  



// 计算距离(假设声波速度为343m/s)  

distance = (uint16_t)((time * 34300) / 20000); // 转换为厘米  



return distance;

}



// 温度补偿函数  

void Temperature_Compensation(uint16_t *distance, float temperature)  

{

// 根据温度对声速进行补偿(具体补偿公式根据实际情况确定)  

// ...(省略具体代码)  

}



// 主函数  

int main(void)  

{

uint16_t distance;

float temperature;

主函数


Initialization(); // 初始化  



while (1)

{

// 测量环境温度  

temperature = Measure_Temperature(); // 假设此函数返回以摄氏度为单位的温度值  



// 测量距离  

distance = Measure_Distance();



// 温度补偿  

Temperature_Compensation(&distance, temperature);



// 显示测量结果  

Display_Distance(distance); // 假设此函数负责将距离值显示在OLED屏幕上  



// 状态指示和预警提示  

Indicate_Status(distance); // 假设此函数根据距离值控制LED指示灯和蜂鸣器  



// 按键处理  

Process_Keys(); // 假设此函数负责处理按键输入,调整预设预警值  



// 延时一段时间  

Delay_ms(100); // 假设此函数实现毫秒级延时  

}

}



// 测量温度函数(示例)  

float Measure_Temperature(void)  

{

// 此处省略DS18B20温度传感器的具体通信和数据处理代码  

// 假设返回的温度值为浮点数,单位为摄氏度  

return 25.0; // 示例返回值,实际应根据DS18B20的通信结果计算得出  

}



// 显示距离函数(示例)  

void Display_Distance(uint16_t distance)  

{

// 此处省略OLED显示屏的具体通信和显示代码  

// 假设OLED显示屏已经初始化,并能够通过特定的函数接口显示字符串或数字  

char buffer[16];

sprintf(buffer, "Distance: %dcm", distance);

OLED_DisplayString(buffer); // 假设此函数负责将字符串显示在OLED屏幕上  

}



// 状态指示和预警提示函数(示例)  

void Indicate_Status(uint16_t distance)  

{

// 假设预设预警值为50cm  

#define WARNING_DISTANCE 50  



if (distance < WARNING_DISTANCE)

{

// 距离小于预警值,点亮红色LED并发出蜂鸣声  

GPIO_SetBits(GPIOB, GPIO_PIN_0); // 假设红色LED连接在GPIOB的PIN0上  

BUZZER_ON(); // 假设此宏定义控制蜂鸣器发声  

}

else  

{

// 距离大于或等于预警值,熄灭红色LED并停止蜂鸣声  

GPIO_ResetBits(GPIOB, GPIO_PIN_0);

BUZZER_OFF(); // 假设此宏定义控制蜂鸣器停止发声  

}

}



// 按键处理函数(示例)  

void Process_Keys(void)  

{

// 此处省略按键扫描和处理的代码  

// 假设按键能够调整预设预警值WARNING_DISTANCE  

// 按键按下时,可以增加或减少预警值,并保存到非易失性存储器中(如EEPROM)  

}



// 延时函数(毫秒级)  

void Delay_ms(uint32_t ms)  

{

// 使用定时器实现毫秒级延时  

// 此处省略具体实现代码,可以根据STM8S103F3P6的定时器特性自行编写  

}



// 延时函数(微秒级)  

void Delay_us(uint16_t us)  

{

// 使用循环实现微秒级延时,注意此方法精度较低,仅适用于对延时精度要求不高的场合  

// 具体实现可以根据STM8S103F3P6的指令周期和时钟频率进行计算  

while (us--);

}

温度补偿算法

温度补偿是提高超声波测距精度的关键之一。由于超声波在空气中的传播速度受温度影响,因此需要根据实时测量的环境温度对测量结果进行修正。常见的温度补偿算法如下:

  1. 线性补偿法:根据实验数据,拟合出超声波传播速度与温度之间的线性关系,然后利用该关系对测量结果进行修正。

  2. 多项式补偿法:如果线性关系不够准确,可以采用多项式拟合的方法,建立超声波传播速度与温度之间的多项式关系,进行更精确的补偿。

  3. 查找表法:预先测量并存储不同温度下的超声波传播速度,测量时根据实时温度查找对应的传播速度进行补偿。

在本设计方案中,可以根据实际情况选择合适的温度补偿算法,并将其实现为Temperature_Compensation函数的一部分。

结论

基于STM8S103F3P6的超声波测距仪设计方案具有成本低、功耗低、精度高、易于实现等优点。通过合理的硬件设计和软件编程,可以实现稳定可靠的超声波测距功能,并可根据实际需求进行功能扩展和优化。本设计方案可作为相关领域的参考和借鉴,为超声波测距技术的应用提供有力支持。


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

相关资讯

拍明芯城微信图标

各大手机应用商城搜索“拍明芯城”

下载客户端,随时随地买卖元器件!

拍明芯城公众号
拍明芯城抖音
拍明芯城b站
拍明芯城头条
拍明芯城微博
拍明芯城视频号
拍明
广告
恒捷广告
广告
深亚广告
广告
原厂直供
广告