基于stm32和HC_SR04超声波模块的测距和报警

news2024/12/23 5:08:29

基于stm32和HC_SR04超声波模块的测距和报警

目录

  • **基于stm32和HC_SR04超声波模块的测距和报警**
    • **一.工作原理**
    • **二.功能实现**
      • **HC_SR04初始化和读取距离**
      • **使用呼吸灯表示距离远近**
      • **主函数编写**
    • **三.效果**
    • **四.关于modbus和串口RS485**
    • **五.总结**

一.工作原理

(1)采用 IO 口 TRIG 触发测距,给最少 10us 的高电平信号;

(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;

(3)有信号返回, 通过 IO 口 ECHO 输出一个高电平, 高电平持续的时间就是超声
波从发射到返回的时间。 测试距离 = (高电平时间*声速(340M/S))/2。
实物图:
在这里插入图片描述

引脚连接:
在这里插入图片描述

时序:
在这里插入图片描述

二.功能实现

实验源码上传在在gitee上,
https://gitee.com/ashenone-129/stm32

HC_SR04初始化和读取距离

hc_sr04.c

#include "hcsr04.h"
#include "delay.h"


TIM_ICInitTypeDef  tim_ic_init;
//g_cap_state:捕获状态标志(bit7:完成捕获; bit6:捕获高电平;bit5-bit0:捕获高电平溢出次数)
u16 g_cap_state, g_cap_val;
u32 g_cap_distance;	//超声波测量距离

//---------------------------------------------------------------------------------------------------------------------------------------------
//	函 数 名: timer4_cap_init
//	功能说明: TIM4初始化
//	形    参: timer_arr:自动重装值; timer_psc:时钟分频系数
//	返 回 值: 无
//	日    期: 
//	作    者: 
//  备    注: 
//---------------------------------------------------------------------------------------------------------------------------------------------

void timer4_cap_init(u16 timer_arr, u16 timer_psc)
{
	GPIO_InitTypeDef gp_init;
	TIM_TimeBaseInitTypeDef  tim_base_init;
	NVIC_InitTypeDef nvic_init_config;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);	//使能TIM2时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //使能GPIOB时钟

	gp_init.GPIO_Pin  	= GPIO_Pin_8; 
	gp_init.GPIO_Mode 	= GPIO_Mode_IPD; //PB8 输入 (ECHO) 
	GPIO_Init(GPIOB, &gp_init);

	gp_init.GPIO_Pin  	= GPIO_Pin_9;     
	gp_init.GPIO_Mode 	= GPIO_Mode_Out_PP;     //PB9 输出 (TRIG)
	gp_init.GPIO_Speed 	= GPIO_Speed_2MHz;     //2M
	GPIO_Init(GPIOB, &gp_init);

	//初始化定时器4 TIM4	 
	tim_base_init.TIM_Period 		= timer_arr; //设定计数器自动重装值 
	tim_base_init.TIM_Prescaler 	= timer_psc; 	//预分频器   
	tim_base_init.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
	tim_base_init.TIM_CounterMode 	= TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM4, &tim_base_init); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

	//初始化TIM4输入捕获参数
	tim_ic_init.TIM_Channel 	= TIM_Channel_3; //CC1S=03 	选择输入端 IC3映射到TI1上
	tim_ic_init.TIM_ICPolarity 	= TIM_ICPolarity_Rising;	//上升沿捕获
	tim_ic_init.TIM_ICSelection = TIM_ICSelection_DirectTI;
	tim_ic_init.TIM_ICPrescaler = TIM_ICPSC_DIV1;	 //配置输入分频,不分频 
	tim_ic_init.TIM_ICFilter 	= 0x00;//配置输入滤波器 不滤波
	TIM_ICInit(TIM4, &tim_ic_init);

	//中断分组初始化
	nvic_init_config.NVIC_IRQChannel 					= TIM4_IRQn;  //TIM4中断
	nvic_init_config.NVIC_IRQChannelPreemptionPriority 	= 3;  //先占优先级2级
	nvic_init_config.NVIC_IRQChannelSubPriority 		= 3;  //从优先级0级
	nvic_init_config.NVIC_IRQChannelCmd 				= ENABLE; //IRQ通道被使能
	NVIC_Init(&nvic_init_config);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 	
	
	TIM_ITConfig(TIM4, TIM_IT_Update|TIM_IT_CC3, ENABLE);//允许更新中断 ,允许CC3IE捕获中断	
	TIM_Cmd(TIM4, ENABLE); 	//使能定时器3
}

//---------------------------------------------------------------------------------------------------------------------------------------------
//	函 数 名: hcsr04_read_distance
//	功能说明: 超声波测量距离
//	形    参: 无
//	返 回 值: 无
//	日    期: 
//	作    者: 
//  备    注: 
//---------------------------------------------------------------------------------------------------------------------------------------------
void hcsr04_read_distance(void)
{
	GPIO_SetBits(GPIOB, GPIO_Pin_9);	//启动超声波测量
	delay_us(15);
	GPIO_ResetBits(GPIOB, GPIO_Pin_9);
	
	if (g_cap_state & 0X80)	//捕获一次高电平
	{
		g_cap_distance = g_cap_state & 0X3f;
		g_cap_distance *= 65535;
		g_cap_distance += g_cap_val;
		g_cap_distance = g_cap_distance * 170 / 1000;	//计算距离(mm)
		g_cap_state = 0X00;
	}
}

void TIM4_IRQHandler(void)
{
	u16 sta_val;
	
	sta_val = TIM4->SR;
	if ((g_cap_state & 0X80) == 0X00)	//未捕获
	{
		if (sta_val & 0X01)	//溢出
		{
			if (g_cap_state & 0X40)	//捕获到高电平
			{
				if ((g_cap_state & 0X3f) == 0X3f)	//高电平时间过长
				{
					g_cap_state |= 0X80;	//记录一次捕获
					g_cap_val = 0Xffff;	//溢出时间
				}
				else 
				{
					g_cap_state++;	//继续捕获
				}
			}
		}
		
		if (sta_val & 0X08) //捕获3(通道3)发生捕获事件
		{
			if (g_cap_state & 0X40)	//捕获下降沿
			{
				g_cap_state |= 0X80;	//标记成功捕获一次高电平
				g_cap_val = TIM4->CCR3;	//获取当前捕获值
				TIM4->CCER &= ~(1<<9);	//CC1P=0 设置为上升沿捕获
			}
			else 
			{
				g_cap_state = 0;
				g_cap_val = 0;
				g_cap_state |= 0X40;	//标记捕获到上升沿
				TIM4->CNT = 0;	//清空计数器
				TIM4->CCER |= (1<<9);	//CC1P=1 设置为下降沿捕获
			}
		}
	}
	
	TIM4->SR = 0;	//清除中断标志位
}

hc_sr04.h

#ifndef __HCSR04_H__
#define __HCSR04_H__

#include "sys.h" 

extern u32 g_cap_distance;

extern void timer4_cap_init(u16 timer_arr, u16 timer_psc);
extern void hcsr04_read_distance(void);

#endif

使用呼吸灯表示距离远近

PWM.c

#include "stm32f10x.h"  
#include "PWM.h"

void PWM_Init()
{	
	TIM_TimeBaseInitTypeDef TIM1_TimeBaseInitStructure;
	TIM_OCInitTypeDef  TIM1_OCInitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	//时钟使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//初始化定时器参数
	TIM1_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;   //时钟划分
	TIM1_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;   //计数器模式向上计数
	TIM1_TimeBaseInitStructure.TIM_Period = 100 -1; //自动重载
	TIM1_TimeBaseInitStructure.TIM_Prescaler = 720 -1;
	TIM1_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseInitStructure);

	//TIM1_OCStructInit(&TIM1_OCInitStructure);
	TIM1_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
	TIM1_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM1_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
	TIM1_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	TIM_OC1Init(TIM1, &TIM1_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
	
	//设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	TIM_CtrlPWMOutputs(TIM1,ENABLE);	//MOE 主输出使能	

	//TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能	 
	
	//TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
	
	TIM_Cmd(TIM1,ENABLE);
	
}

void PWM_SetCompare1(uint16_t compare)
{
	TIM_SetCompare1(TIM1,compare);
}

PWM.h

#ifndef __PWM_H
#define __PWM_H
#include "stm32f10x.h"
void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);
void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);
void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
void PWM_Init();
//void TIM_CtrlPWMOutputs(TIM1,ENABLE);	//MOE 主输出使能	

#endif

主函数编写

#include "typedef.h"
#include "declares.h"
#include "variable.h"
#include "drvexflash.h"
#include "drvnrf2401.h"
#include "drvadc.h"
#include "drvuart.h"
#include "drvsdcard.h"
#include "hardware_spi.h"
#include "delay.h"
#include "drvled.h"
#include "app_adc.h"
#include "app_flash.h"
#include "app_htu21d.h"
#include "app_at24cxx.h"
#include "drvoled.h"
#include "drvtimer.h"
#include "drvexti.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "logic_grammer.h"
#include "c_language_regular.h"
#include "hcsr04.h"
#include "drvrtc.h"
#include "PWM.h"

void PWM_SetCompare1(uint8_t value);
int main_rtc(void)
{
	u8 i = 0;
	
	delay_init();	    	 //延时函数初始化	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
	uart_init(1, 115200 * 8);	 //串口初始化为961200
	Bsp_LedInit();		  	 //初始化与LED连接的硬件接口 
	PWM_Init();
	timer4_cap_init(0Xffff, 72 - 1);
	RTC_Init_LSI(); //内部低速时钟
	while (1)
	{
		hcsr04_read_distance();
		delay_ms(500);
			
		/*GPIO_SetBits(GPIOA, GPIO_Pin_8);	//启动超声波测量
	delay_ms(500);
	GPIO_ResetBits(GPIOA, GPIO_Pin_8);*/
	
		if(g_cap_distance<=100){
		PWM_SetCompare1(0);
			delay_ms(10);
		}
		else if(g_cap_distance>100&&g_cap_distance<=200){
		PWM_SetCompare1(40);
				delay_ms(10);
		}
		else if(g_cap_distance>200&&g_cap_distance<=300){
		PWM_SetCompare1(70);
				delay_ms(10);
		}
		else if(g_cap_distance>300){
		PWM_SetCompare1(100);
				delay_ms(10);
		}
		printf("g_cap_distance = %d \r\n", g_cap_distance);	//用串口1打印输出
		/*get_time();
		i++;
	
		delay_ms(10);
		if (g_time_flag)
		{
			g_time_flag = 0;
			printf("RTC Time:20%d-%d-%d %d:%d:%d\r\n",w_year_x, w_month_x, w_date_x, hour_x, min_x, sec_x);//输出时间	
		}*/
	}
}
int main(void)
{
	main_rtc();
	//main_hcr();
}

其余的例如串口初始化或GPIO初始化可详见gitee.

三.效果

在这里插入图片描述

在这里插入图片描述

四.关于modbus和串口RS485

1)RS485与RS232(UART)有什么不同?
电气特性:

RS485:使用差分信号传输,具有更强的抗干扰能力,可以在较长的距离上传输数据,一般可达1200米。
RS232(UART):使用单端信号传输,抗干扰能力较弱,传输距离较短,通常在15米以内。
连接方式:

RS485:支持多点通信,即一个总线上可以连接多个设备。
RS232:通常是点对点通信,即一对一的连接方式。
数据速率:

RS485:数据传输速率(波特率)通常在300bps到10Mbps之间。
RS232:数据传输速率较低,一般在300bps到115.2kbps之间。
应用场景:

RS485:常用于工业环境中,因为其抗干扰能力强,适合长距离通信。
RS232:常用于计算机与打印机、调制解调器等设备之间的短距离通信。
电气接口:

RS485:使用9针D-sub连接器,通常使用A和B两个引脚传输数据。
RS232:使用9针或25针D-sub连接器,数据传输主要通过2、3引脚(发送和接收)。
协议复杂性:

RS485:协议相对简单,主要关注物理层和链路层。
RS232:协议较为复杂,包括物理层、数据链路层、网络层等多个层面。
功耗:

RS485:由于使用差分信号,功耗相对较低。
RS232:功耗相对较高,尤其是在长距离传输时。
成本:

RS485:由于其多点通信和长距离传输的特性,可能在某些应用中成本较高。
RS232:由于其简单性和普及性,成本通常较低。

2)Modbus协议是什么?

Modbus协议是一种串行通信协议,最初由Modicon(现在是施耐德电气的一部分)在1979年开发,用于其可编程逻辑控制器(PLC)。Modbus协议广泛应用于工业自动化领域,特别是在监控和控制设备之间进行通信时.
特点:
开放性:Modbus是一个开放的协议,这意味着它不受专利限制,任何制造商都可以免费使用它来开发兼容的设备。

应用层协议:Modbus主要定义了应用层的通信规则,它不指定物理层或数据链路层的具体实现。因此,Modbus可以运行在多种物理介质上,如RS232、RS485、以太网等。

功能码:Modbus使用功能码来定义通信中执行的操作,例如读取或写入寄存器、诊断等。每个功能码对应一个特定的操作。

数据格式:Modbus协议定义了一种简单的数据格式,用于在设备之间传输信息。数据通常以二进制形式传输,并且包含地址、功能码、数据和校验等部分。

多点通信:Modbus支持多点通信,即一个主设备可以与多个从设备通信。在RS485网络上,Modbus使用广播方式来实现这一点。

校验机制:Modbus提供了多种校验机制,包括无校验、奇偶校验和CRC校验,以确保数据传输的可靠性。

简单性:Modbus协议相对简单,易于实现,这使得它在工业自动化领域非常流行。

版本:Modbus有几个版本,包括Modbus ASCII、Modbus RTU(二进制模式)和Modbus TCP/IP。Modbus RTU是最常用的版本,它使用二进制数据格式来减少传输时间。

应用领域:Modbus广泛应用于各种工业控制和自动化系统中,包括制造、电力、石油和天然气、水处理等行业。

集成性:由于其开放性和简单性,Modbus协议可以很容易地与其他控制系统和协议集成,如BACnet、OPC等

3)如果让你设计一款 12路车载超声波雷达,采用 stm32F103+HC-SR04超声波模块,对外提供RS485和Modbus协议,你的设计方案是什么?

  1. 系统架构
    主控制器:STM32F103负责协调整个系统,处理数据,以及与外部设备通信。
    超声波传感器:HC-SR04模块用于检测距离,每个模块可以测量一个方向的距离。
    RS485通信接口:用于与其他车载系统或中央控制单元通信。
    Modbus协议:实现标准的Modbus通信,便于集成到现有的工业自动化系统中。
  2. 硬件设计
    STM32F103:选择具有足够GPIO引脚和串行通信接口的型号。
    HC-SR04模块:每个模块包含一个超声波发射器和一个接收器,需要12个模块来覆盖车辆周围。
    电源管理:设计电源电路为STM32和超声波模块提供稳定的电源。
    RS485通信电路:包括驱动器和接收器,以及终端电阻等。
    接口电路:可能需要设计一些接口电路来适配Modbus协议。
  3. 软件设计
    驱动程序:编写HC-SR04超声波模块的驱动程序,实现距离测量功能。
    Modbus协议栈:实现Modbus RTU协议栈,处理Modbus命令和响应。
    RS485通信:实现RS485通信协议,确保数据的正确发送和接收。
    数据处理:编写算法处理超声波数据,如滤波、平均等,以提高测量精度。
    用户接口:可能包括一些基础的用户接口,如LED指示灯或LCD显示屏,显示状态信息。
  4. 系统整合
    布线:合理布线,确保超声波传感器的信号线和电源线不会相互干扰。
    测试:进行单元测试、集成测试和系统测试,确保系统稳定可靠。
    外壳设计:设计适合车载环境的外壳,保护内部组件。
  5. 功能实现
    距离测量:每个HC-SR04模块测量一个方向的距离,STM32F103收集所有数据。
    数据同步:设计同步机制,确保所有传感器数据的一致性。
    Modbus功能码:定义Modbus功能码来读取距离数据、设置参数等。
    错误处理:实现错误检测和处理机制,如传感器故障、通信错误等。

五.总结

这次作业实现了HC_SR04模块的超声波测距,加深了我对modbus,RS485的认识.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1704550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式 20 中介者模式 Mediator Pattern

设计模式 20 中介者模式 Mediator Pattern 1.定义 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;它通过封装对象之间的交互&#xff0c;促进对象之间的解耦合。中介者模式的核心思想是引入一个中介者对象&#xff0c;将系统中对象之间…

【IC】良率模型-yield model

缺陷密度Default Density&#xff08;D0&#xff09;&#xff0c;表示单位面积的缺陷数D。 单位面积有M个部件&#xff0c;一个部件的平均失效率为&#xff1a; 一个面积为A的系统&#xff08;芯片&#xff09;良率&#xff1a; Possion模型&#xff1a; 当M趋于无穷时&…

秋招突击——算法打卡——5/27——复习{寻找特定中位数}——新做:{最长回文字串、Z 字形变换}

文章目录 复习——寻找特定中位数新作——最长回文子串个人思路分析实现代码参考学习和上述思路相同&#xff0c;枚举中心点字符串哈希二分 新作——Z 字形变换个人做法思路分析实现代码 参考解法分析总结 复习——寻找特定中位数 第一次的链接&#xff1a;寻找中位数本来以为…

香橙派OrangePi AIpro上手初体验

一、前言 非常感谢能够收到CSDN和香橙派的OrangePi AIpro开发板评测活动的邀请&#xff1b;收到的OrangePi AIpro实物如下所示&#xff1a; 二、OrangePi AIpro介绍 通过查询香橙派官网可以了解到OrangePi AIpro的相关信息如下&#xff1a;OrangePi AIPro 开发板是香橙派联合…

浙江大学数据结构MOOC-课后习题-第七讲-图4 哈利·波特的考试

题目汇总 浙江大学数据结构MOOC-课后习题-拼题A-代码分享-2024 题目描述 代码展示 照着教程视频来的&#xff0c;没啥好说的捏 #include <cstdlib> #include <iostream>#define MAXSIZE 100 #define IFINITY 65535 typedef int vertex; typedef int weightType;/…

【StableDiffusion】SD1.4、1.5、2.0、2.1 和 SDXL0.9-1.0、SDXL turbo 等的区别

总览 1.基础sd base model家族&#xff1a;SD1.4、SD1.5、SD1.5-LCM、SD2.0、SD2.0-768、SD2.1、SD2.1-768、SD2.1-UNCLIP 2.升级sdxl base model家族&#xff1a;SDXL0.9、SDXL1.0、SDXL1.0-LCM、SDXL-DISTILLED、SDXL-TURBO 3.专门用于视频生成的 SVD 家族&#xff1a;SVD、…

洪师傅代驾系统开发 支持公众号H5小程序APP 后端Java源码

代驾流程图 业务流程图 管理端设置 1、首页装修 2、师傅奖励配置 师傅注册后,可享受后台设置的新师傅可得的额外奖励; 例:A注册了师傅,新人奖励可享受3天,第一天的第一笔订单完成后可得正常佣金佣金*奖励比例 完成第二笔/第三笔后依次可得正常佣金佣金*奖励比例 完成的第四…

城市空气质量数据爬取分析可视化

城市空气质量数据爬取分析可视化 一、效果展示二、完整代码2.1 数据爬取代码2.2 数据分析代码一、效果展示 先来看一下数据情况以及可视化效果,本项目使用了pyecharts绘制了日历图、雷达图、折线图、柱状图、饼图和平行坐标系。完整代码附后: 数据如下: 日历图: 饼图: …

Docker基础篇之常用命令

文章目录 1. 帮助启动类命令2. 镜像命令3. 容器命令4. 总结 1. 帮助启动类命令 启动docker&#xff1a; systemctl start docker停止docker&#xff1a; systemctl stop docker重启docker&#xff1a; systemctl restart docker查看docker 的运行状态&#xff1a; systemc…

ubuntu 22.04 appearance设置没有dock选项

1、问题描述 解决办法可以直接跳到后面见2 下图是我同学电脑的appearance界面选项&#xff0c;她有Dock的界面显示。 下面是我的界面&#xff0c; 没有Dock&#xff1a; 然后各种app的界面都在最底下&#xff0c;而且每次只能点击左上角的activities才能显示。 但是如果不打开某…

YoloV8实战:各种图绘制汇总(mAP50、mAP50-95、loss、PR_curve、F1_curve)|科研必备|绘图神器

摘要 本文的内容是告诉大家如何绘制mAP50、mAP50-95、loss、PR_curve、F1_curve等图像,方便大家写论文。 绘制mAP50、mAP50-95、loss等图。 先上效果,如下图: 首先将,训练的result.csv汇总到一个文件夹下面(这样方便寻找),要不然找起来太麻烦。如下图: 我都放到re…

STM32H750外设之ADC通道选择

目录 概述 1 通道选择功能介绍 2 通道选择&#xff08; SQRx、 JSQRx&#xff09; 2.1 通道复用 2.1.1 通道介绍 2.1.2 通道框图 2.2 转换分组 2.3 内部专用通道 3 通道预选寄存器 (ADCx_PCSEL) 3.1 功能介绍 3.2 预选通道寄存器 概述 本位主要介绍STM32H750外设之…

【钉钉AI助理】测试用例创造师,快速生成高质量的测试用例!

前言&#xff1a; 我最近发现了个提升工作效率的秘密武器——钉钉AI助理里的‘测试用例创造师’。 试了下&#xff0c;简直是工作中的小确幸&#xff0c;既增加了乐趣&#xff0c;又真的帮了大忙。往里一粘需求&#xff0c;唰唰几下&#xff0c;各种测试场景就蹦出来了&#…

188M2传奇BLUEM2引擎源码开源版附带编译教程2024最新开源

2024最新开源188M2传奇BLUEM2引擎源码开源2版最初开源版本附带编译教程 源码下载地址&#xff1a;极速云 如果需要优惠可以选择第一版最初开源188M2传奇BLUEM2引擎源码开源1版最初开源版本附带编译教程2024最新开源

帆软生成csv文件

帆软官网提供了导出csv文件的插件&#xff0c;需要下载指定版本的插件 请选择具体的详情点击官网介绍&#xff1a;文档介绍 插件地址&#xff1a;插件地址

Monocular Model-Based 3D Tracking of Rigid Objects:2005年综述

1 Introduction 在视频序列中跟踪一个物体意味着在物体或摄像机移动时&#xff0c;持续识别其位置。根据物体类型、物体和摄像机的自由度以及目标应用的不同&#xff0c;有多种方法可供选择。二维跟踪通常旨在跟踪物体或物体部分的图像投影&#xff0c;这些物体的三维位移会导…

微信资源混淆,导致的约束布局 Constraintlayout 控件重叠!

问题 1、广告六要素 虽然我不参与广告 sdk 接入等相关工作&#xff0c;但是最近总是听到一个词广告六要素。这到底是什么&#xff1f; 国内下载类广告&#xff0c;尤其是针对移动应用推广的广告&#xff0c;其成功实施往往围绕几个关键要素进行&#xff0c;这些要素能够帮助…

互联网政务应用安全管理规定:使用安全连接方式访问

前几日&#xff0c;由中央网络安全和信息化委员会办公室、中央机构编制委员会办公室、工业和信息化部、公安部等4部门联合制定的《互联网政务应用安全管理规定》&#xff08;以下简称规定&#xff09;发布了&#xff0c;规定定义了互联网政务应用&#xff0c;也对互联网政务应用…

stream-并行流

定义 常规的流都是串行的流并行流就是并发的处理数据&#xff0c;一般要求被处理的数据互相不影响优点&#xff1a;数据多的时候速度更快&#xff0c;缺点&#xff1a;浪费系统资源&#xff0c;数据少的时候开启线程更耗费时间 模版 Stream<Integer> stream1 Stream.of…

拿捏数据结构- 链式二叉树

链式二叉树的概念&#xff1a; 链式二叉树解决的是非完全二叉树解决不了的问题 什么意思呢&#xff0c;简单的说就是&#xff0c;链式二叉树 可以是下面三种二叉树 但是非链式二叉树只能是前两种 链式二叉树的存储 节点结构&#xff1a;首先定义一个结构体或类来表示二叉树的节…