文章目录

  • 一、ADC
    • 1.1简介
    • 1. 2逐次逼近型ADC
    • 1.3ADC框图
    • 1.4ADC基本结构
      • 1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)
      • 1.4.2 信号 “调度站”:多路开关
      • 1.4.3 信号 “加工厂”:ADC 转换器(规则组 + 注入组)
      • 1.4.4信号 “暂存柜”:AD 数据寄存器
      • 1.4.5 信号 “监督员”:模拟看门狗
      • 1.4.6信号 “报警器”:中断输出控制 + NVIC
      • 1.4.7 系统 “动力源”:触发控制 + RCC
      • 1.4.8系统 “总开关”:开关控制
    • 1.5输入通道
    • 1.6转换模式
    • 1.7触发控制
    • 1.8数据对齐
    • 1.9转换时间
    • 1.10校准
    • 1.11硬件电路
  • 二、AD单通道
    • 2.1接线图
    • 2.2代码
    • 2.3ADC 相关 API 函数
        • 1. 时钟配置函数
        • 2. GPIO 配置函数
        • 3. ADC 配置函数
        • 4. ADC 控制函数
        • 5. 状态和数据读取函数
    • 2.4工作现象
  • 三、AD多通道
    • 3.1接线图
    • 3.2代码
    • 3.3AD单通道未提及的关键 API
        • 1. ADC 通道配置函数
        • 2. 采样时间说明
        • 3. ADC 状态标志位
    • 3.4工作现象
        • 1. **光敏传感器(AO 接 ADC 通道,如 PA0)**
        • 2. **声音传感器(AO 接 ADC 通道,如 PA1)**
        • 3. **红外避障传感器(AO 接 ADC 通道,如 PA2)**
        • 4. **电位器(中间引脚接 ADC 通道,如 PA3)**

一、ADC

1.1简介

在这里插入图片描述

1. 2逐次逼近型ADC

在这里插入图片描述

1.3ADC框图

在这里插入图片描述

1.4ADC基本结构

在这里插入图片描述
以下用更通俗的 “信号 journey(旅程)” 逻辑,拆解各模块咋连接、咋配合干活:

1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)

  • GPIO(16 路):像 16 个 “小天线”,能接外部五花八门的模拟信号(比如传感器电压、旋钮调节的电平 ),是最常用的信号入口。
  • 温度传感器:专门测温度,把温度变化转成电压信号,相当于 “温度→电信号” 翻译器。
  • V_REFINT:内部精准参考电压,像 “标准尺”,给 ADC 转换当基准(比如转换时拿信号和它比,确定数字值 )。

这些信号要先 “排队上车”,统一交给 多路开关(下面讲它的作用 )。

1.4.2 信号 “调度站”:多路开关

  • 作用:当 “交通调度员”,决定让哪路信号进 ADC 转换器。
  • 逻辑:比如同时有 GPIO、温度传感器的信号,它选 1 路(规则组模式)或几路(注入组模式 ),送往后边的 ADC 转换器。

1.4.3 信号 “加工厂”:ADC 转换器(规则组 + 注入组)

  • 规则组(最多 16 路):常规 “生产线”,按预设顺序、节奏转换信号(比如循环采集 16 路 GPIO ),适合普通、批量的转换需求。
  • 注入组(最多 4 路):“加急生产线”,优先级更高!遇到紧急信号(比如关键传感器超阈值 ),能插队先转换,灵活处理特殊需求。

不管规则组还是注入组,干的事一样:把模拟信号(连续电压 )切成数字信号(0 和 1 组成的编码 )。

1.4.4信号 “暂存柜”:AD 数据寄存器

  • 转换完的数字信号,得找地方 “临时存一下”:
    • 规则组结果:存在 “规则结果 ×1” 里(1 组数据对应 1 个寄存器 )。
    • 注入组结果:存在 “注入结果 ×4” 里(最多存 4 组,方便快速连续处理 )。
  • 就像工厂生产完零件,先放仓库,等 CPU 来 “取货” 处理。

1.4.5 信号 “监督员”:模拟看门狗

  • 作用:当 “质量检测员”,盯着转换后的数字信号,看是否超出你设定的范围(比如温度不能太高 / 太低 )。
  • 触发:一旦超范围,立马发信号(相当于 “报警” ),告诉系统 “这信号有问题!”

1.4.6信号 “报警器”:中断输出控制 + NVIC

  • 中断输出控制:收到模拟看门狗的 “报警” 后,整理信号,决定咋通知系统。
  • NVIC(嵌套向量中断控制器):系统的 “总调度台”,收到中断信号后,暂停当前任务,优先处理 “信号异常” 事件(比如触发紧急程序、记录日志 )。

1.4.7 系统 “动力源”:触发控制 + RCC

  • RCC(时钟控制器):给 ADC 整个系统提供 “心跳”(时钟信号 ),所有模块得跟着时钟节奏干活,否则会乱套。
  • 触发控制:决定啥时候启动 ADC 转换,像 “开关”:可以软件手动触发(程序里写代码启动 ),也能硬件触发(比如定时器定时启动 ),发的信号叫 “START”。

1.4.8系统 “总开关”:开关控制

  • 简单粗暴:控制 ADC 模块整体 “开 / 关”。不用 ADC 时,关掉省点电;要用时,打开干活。

1.5输入通道

在这里插入图片描述

1.6转换模式

在这里插入图片描述

1.7触发控制

在这里插入图片描述

1.8数据对齐

在这里插入图片描述

1.9转换时间

在这里插入图片描述

1.10校准

在这里插入图片描述

1.11硬件电路

在这里插入图片描述

二、AD单通道

2.1接线图

在这里插入图片描述

2.2代码

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD.h"uint16_t ADValue;			//定义AD值变量
float Voltage;				//定义电压变量int main(void)
{/*模块初始化*/OLED_Init();			//OLED初始化AD_Init();				//AD初始化/*显示静态字符串*/OLED_ShowString(1, 1, "ADValue:");OLED_ShowString(2, 1, "Voltage:0.00V");while (1){ADValue = AD_GetValue();					//获取AD转换的值Voltage = (float)ADValue / 4095 * 3.3;		//将AD值线性变换到0~3.3的范围,表示电压OLED_ShowNum(1, 9, ADValue, 4);				//显示AD值OLED_ShowNum(2, 9, Voltage, 1);				//显示电压值的整数部分OLED_ShowNum(2, 11, (uint16_t)(Voltage * 100) % 100, 2);	//显示电压值的小数部分Delay_ms(100);			//延时100ms,手动增加一些转换的间隔时间}
}

AD.c

#include "stm32f10x.h"                  // Device header/*** 函    数:AD初始化* 参    数:无* 返 回 值:无*/
void AD_Init(void)
{/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);	//开启ADC1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟/*设置ADC时钟*/RCC_ADCCLKConfig(RCC_PCLK2_Div6);						//选择时钟6分频,ADCCLK = 72MHz / 6 = 12MHz/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);					//将PA0引脚初始化为模拟输入/*规则组通道配置*/ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);		//规则组序列1的位置,配置为通道0/*ADC初始化*/ADC_InitTypeDef ADC_InitStructure;						//定义结构体变量ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;		//模式,选择独立模式,即单独使用ADC1ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	//数据对齐,选择右对齐ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//外部触发,使用软件触发,不需要外部触发ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;		//连续转换,失能,每转换一次规则组序列后停止ADC_InitStructure.ADC_ScanConvMode = DISABLE;			//扫描模式,失能,只转换规则组的序列1这一个位置ADC_InitStructure.ADC_NbrOfChannel = 1;					//通道数,为1,仅在扫描模式下,才需要指定大于1的数,在非扫描模式下,只能是1ADC_Init(ADC1, &ADC_InitStructure);						//将结构体变量交给ADC_Init,配置ADC1/*ADC使能*/ADC_Cmd(ADC1, ENABLE);									//使能ADC1,ADC开始运行/*ADC校准*/ADC_ResetCalibration(ADC1);								//固定流程,内部有电路会自动执行校准while (ADC_GetResetCalibrationStatus(ADC1) == SET);ADC_StartCalibration(ADC1);while (ADC_GetCalibrationStatus(ADC1) == SET);
}/*** 函    数:获取AD转换的值* 参    数:无* 返 回 值:AD转换的值,范围:0~4095*/
uint16_t AD_GetValue(void)
{ADC_SoftwareStartConvCmd(ADC1, ENABLE);					//软件触发AD转换一次while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);	//等待EOC标志位,即等待AD转换结束return ADC_GetConversionValue(ADC1);					//读数据寄存器,得到AD转换的结果
}

2.3ADC 相关 API 函数

1. 时钟配置函数

c

运行

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
  • 功能:启用或禁用 APB2 总线上的外设时钟(如 ADC1、GPIOA)。

  • 参数 :

    • RCC_APB2Periph:外设选择(如RCC_APB2Periph_ADC1RCC_APB2Periph_GPIOA)。
    • NewStateENABLEDISABLE

c

运行

void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);
  • 功能:配置 ADC 时钟分频(ADC 时钟必须 ≤ 14MHz)。

  • 参数 :

    • RCC_PCLK2:分频选项(如RCC_PCLK2_Div6表示 72MHz/6=12MHz)。
2. GPIO 配置函数

c

运行

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
  • 功能:初始化 GPIO 引脚。

  • 参数 :

    • GPIOx:GPIO 端口(如GPIOA)。
    • GPIO_InitStruct:GPIO 配置结构体(模式、引脚、速度)。
3. ADC 配置函数

c

运行

void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
  • 功能:配置规则组通道的转换顺序和采样时间。

  • 参数 :

    • ADCx:ADC 外设(如ADC1)。
    • ADC_Channel:通道号(如ADC_Channel_0对应 PA0)。
    • Rank:序列位置(1~16)。
    • ADC_SampleTime:采样周期(如ADC_SampleTime_55Cycles5)。

c

运行

void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
  • 功能:初始化 ADC 参数。

  • 参数 :

    • ADCx:ADC 外设。
    • ADC_InitStruct:ADC 配置结构体(模式、对齐方式、触发方式等)。
4. ADC 控制函数

c

运行

void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  • 功能:启用或禁用 ADC。

  • 参数 :

    • ADCx:ADC 外设。
    • NewStateENABLEDISABLE

c

运行

void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  • 功能:软件触发 ADC 转换。

  • 参数 :

    • ADCx:ADC 外设。
    • NewStateENABLE触发一次转换。

c

运行

void ADC_ResetCalibration(ADC_TypeDef* ADCx);
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);
void ADC_StartCalibration(ADC_TypeDef* ADCx);
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);
  • 功能:ADC 校准流程(复位校准、获取复位状态、开始校准、获取校准状态)。
5. 状态和数据读取函数

c

运行

FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
  • 功能:检查 ADC 标志位状态(如转换完成标志ADC_FLAG_EOC)。

  • 参数 :

    • ADCx:ADC 外设。
    • ADC_FLAG:标志位类型。

c

运行

uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
  • 功能:获取 ADC 转换结果(0~4095,12 位分辨率)。

  • 参数 :

    • ADCx:ADC 外设。
      AD.h
#ifndef __AD_H
#define __AD_Hvoid AD_Init(void);
uint16_t AD_GetValue(void);#endif

2.4工作现象

  1. 初始化阶段
    • 调用AD_Init()后,ADC1 时钟开启,GPIOA 引脚配置为模拟输入模式,规则组通道 0(PA0)完成配置,ADC 进入就绪状态。
    • 校准过程中,ADC_ResetCalibrationADC_StartCalibration会触发内部校准电路工作,校准完成后标志位自动清除。
  2. 转换阶段
    • 调用AD_GetValue()时,软件触发转换(ADC_SoftwareStartConvCmd),ADC_FLAG_EOC标志位在转换完成后置 1,返回值在 0~4095 范围内(对应输入电压 0~3.3V)。
    • 若输入电压稳定(如接固定电阻分压),多次读取的 ADC 值波动较小(通常≤±3LSB)。
  3. 数据对应关系

在这里插入图片描述

三、AD多通道

3.1接线图

在这里插入图片描述

3.2代码

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD.h"uint16_t AD0, AD1, AD2, AD3;	//定义AD值变量int main(void)
{/*模块初始化*/OLED_Init();				//OLED初始化AD_Init();					//AD初始化/*显示静态字符串*/OLED_ShowString(1, 1, "AD0:");OLED_ShowString(2, 1, "AD1:");OLED_ShowString(3, 1, "AD2:");OLED_ShowString(4, 1, "AD3:");while (1){AD0 = AD_GetValue(ADC_Channel_0);		//单次启动ADC,转换通道0AD1 = AD_GetValue(ADC_Channel_1);		//单次启动ADC,转换通道1AD2 = AD_GetValue(ADC_Channel_2);		//单次启动ADC,转换通道2AD3 = AD_GetValue(ADC_Channel_3);		//单次启动ADC,转换通道3OLED_ShowNum(1, 5, AD0, 4);				//显示通道0的转换结果AD0OLED_ShowNum(2, 5, AD1, 4);				//显示通道1的转换结果AD1OLED_ShowNum(3, 5, AD2, 4);				//显示通道2的转换结果AD2OLED_ShowNum(4, 5, AD3, 4);				//显示通道3的转换结果AD3Delay_ms(100);			//延时100ms,手动增加一些转换的间隔时间}
}

AD.c

#include "stm32f10x.h"                  // Device header/*** 函    数:AD初始化* 参    数:无* 返 回 值:无*/
void AD_Init(void)
{/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);	//开启ADC1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟/*设置ADC时钟*/RCC_ADCCLKConfig(RCC_PCLK2_Div6);						//选择时钟6分频,ADCCLK = 72MHz / 6 = 12MHz/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);					//将PA0、PA1、PA2和PA3引脚初始化为模拟输入/*不在此处配置规则组序列,而是在每次AD转换前配置,这样可以灵活更改AD转换的通道*//*ADC初始化*/ADC_InitTypeDef ADC_InitStructure;						//定义结构体变量ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;		//模式,选择独立模式,即单独使用ADC1ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	//数据对齐,选择右对齐ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//外部触发,使用软件触发,不需要外部触发ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;		//连续转换,失能,每转换一次规则组序列后停止ADC_InitStructure.ADC_ScanConvMode = DISABLE;			//扫描模式,失能,只转换规则组的序列1这一个位置ADC_InitStructure.ADC_NbrOfChannel = 1;					//通道数,为1,仅在扫描模式下,才需要指定大于1的数,在非扫描模式下,只能是1ADC_Init(ADC1, &ADC_InitStructure);						//将结构体变量交给ADC_Init,配置ADC1/*ADC使能*/ADC_Cmd(ADC1, ENABLE);									//使能ADC1,ADC开始运行/*ADC校准*/ADC_ResetCalibration(ADC1);								//固定流程,内部有电路会自动执行校准while (ADC_GetResetCalibrationStatus(ADC1) == SET);ADC_StartCalibration(ADC1);while (ADC_GetCalibrationStatus(ADC1) == SET);
}/*** 函    数:获取AD转换的值* 参    数:ADC_Channel 指定AD转换的通道,范围:ADC_Channel_x,其中x可以是0/1/2/3* 返 回 值:AD转换的值,范围:0~4095*/
uint16_t AD_GetValue(uint8_t ADC_Channel)
{ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);	//在每次转换前,根据函数形参灵活更改规则组的通道1ADC_SoftwareStartConvCmd(ADC1, ENABLE);					//软件触发AD转换一次while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);	//等待EOC标志位,即等待AD转换结束return ADC_GetConversionValue(ADC1);					//读数据寄存器,得到AD转换的结果
}

AD.h

#ifndef __AD_H
#define __AD_Hvoid AD_Init(void);
uint16_t AD_GetValue(uint8_t ADC_Channel);#endif

3.3AD单通道未提及的关键 API

除了之前提到的 ADC API,这段代码还涉及以下未详细说明的函数:

1. ADC 通道配置函数

c

运行

void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
  • 功能:配置规则组序列中的通道及其采样时间。

  • 参数 :

    • ADC_Channel:通道号(如ADC_Channel_0~ADC_Channel_17)。
    • Rank:序列位置(1~16,单通道模式下固定为 1)。
    • ADC_SampleTime:采样周期(如ADC_SampleTime_55Cycles5)。
2. 采样时间说明

ADC 采样时间影响转换精度和速度,可选值包括:

c

运行

ADC_SampleTime_1Cycles5   // 1.5个ADC时钟周期(最快)
ADC_SampleTime_7Cycles5   // 7.5个周期
ADC_SampleTime_13Cycles5  // 13.5个周期
ADC_SampleTime_28Cycles5  // 28.5个周期
ADC_SampleTime_41Cycles5  // 41.5个周期
ADC_SampleTime_55Cycles5  // 55.5个周期
ADC_SampleTime_71Cycles5  // 71.5个周期
ADC_SampleTime_239Cycles5 // 239.5个周期(最慢,抗干扰最强)
3. ADC 状态标志位

c

运行

FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
  • 常用标志位 :

    • ADC_FLAG_EOC:规则组转换完成标志(代码中使用)。
    • ADC_FLAG_AWD:模拟看门狗触发标志(需额外配置)。
    • ADC_FLAG_OVR:数据溢出标志(连续转换模式下可能出现)。

3.4工作现象

  • 初始化后:ADC1 和 GPIOA 时钟开启,PA0~PA3 配置为模拟输入模式,ADC 处于就绪状态但未开始转换(需调用AD_GetValue()触发)。

  • 动态通道选择:每次调用AD_GetValue(channel)时,会临时配置规则组序列 1 为指定通道(如ADC_Channel_2对应 PA2),然后触发单次转换。

  • 转换结果

    :返回值范围为 0~4095,对应输入电压 0~3.3V(假设 VREF 为 3.3V)。例如:

    • 输入 1.65V → 返回值约为 2048(1.65V/3.3V × 4095 ≈ 2048)。
    • 输入悬空(无信号)→ 返回随机值(受噪声影响)。
1. 光敏传感器(AO 接 ADC 通道,如 PA0)
  • 现象 :

    • 光照越强(如手电筒照射),ADC 值 越大(对应电压越高,假设传感器输出与光照正相关);
    • 光照越弱(手遮挡),ADC 值 越小,OLED / 串口数据同步变化。
  • 原理:光敏电阻阻值随光照变化,转换为电压信号被 ADC 采集。

2. 声音传感器(AO 接 ADC 通道,如 PA1)
  • 现象 :

    • 安静时,ADC 值 稳定在低范围(背景噪声小);
    • 拍手 / 说话时,ADC 值 瞬间跳升(声音越强,跳升幅度越大),数据波动明显。
  • 原理:咪头采集声波,转换为电压波动,ADC 捕捉瞬时变化。

3. 红外避障传感器(AO 接 ADC 通道,如 PA2)
  • 现象 :

    • 无遮挡时,ADC 值 接近最大值(红外反射强,输出电压高);
    • 手靠近遮挡时,ADC 值 骤降(反射弱,电压低),响应迅速。
  • 原理:红外发射 + 接收,距离 / 遮挡影响反射强度,转换为电压变化。

4. 电位器(中间引脚接 ADC 通道,如 PA3)
  • 现象 :

    • 顺时针旋转:ADC 值 从 0→4095 线性递增(或递减,取决于接线方向);
    • 逆时针旋转:ADC 值 反向递减 / 递增,变化平滑无跳变。
  • 原理:电位器分压,输出电压与旋转角度线性相关。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 Docker 容器中使用宿主机的 GPU

在 Docker 容器中使用宿主机的 GPU(特别是 NVIDIA GPU)需要安装 NVIDIA Container Toolkit(之前称为 nvidia-docker)。以下是详细的配置步骤: 1. 宿主机环境准备 确保宿主机已正确安装: NVIDIA 显卡驱动&a…

Vue3学习(接口,泛型,自定义类型,v-for,props)

一,前言 继续学习 二,TS接口泛型自定义类型 1.接口 TypeScript 接口(Interface)是一种定义对象形状的强大工具,它可以描述对象必须包含的属性、方法和它们的类型。接口不会被编译成 JavaScript 代码,仅…

Python爬虫实战:研究Restkit库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …

Java八股文——Redis篇

目录 1. 缓存穿透解决方案1. 缓存空值2. 布隆过滤器(Bloom Filter)3. 参数校验4. 接口限流与验证码 2. 缓存击穿解决方案1. 设置热点数据永不过期(或很长过期时间)2. 使用互斥锁(如分布式锁)3. 利用异步更新…

旋量理论:刚体运动的几何描述与机器人应用

旋量理论为描述刚体在三维空间中的运动提供了强大而优雅的数学框架。与传统的欧拉角或方向余弦矩阵相比,旋量理论通过螺旋运动的概念统一了旋转和平移,在机器人学、计算机图形学和多体动力学领域具有显著优势。这种描述不仅几何直观,而且计算…

Strong Baseline: Multi-UAV Tracking via YOLOv12 with BoT-SORT-ReID 2025最新无人机跟踪

Strong Baseline: Multi-UAV Tracking via YOLOv12 with BoT-SORT-ReID 2025最新无人机跟踪 自己研一期间的小论文大致上的结构和内容基本上已经完成,到了最后在测试集上测试数据的阶段,在跑测试集的时间上就去看一些25年和多目标跟踪的领域相关的一些内…

MyBatis中foreach集合用法详解

在 MyBatis 中&#xff0c;<foreach> 标签用于遍历集合&#xff08;Collection、List、Array、Map&#xff09;&#xff0c;常用于构建动态 SQL 语句&#xff08;如 IN 查询、批量插入等&#xff09;。以下是详细用法和示例&#xff1a; 核心属性 属性描述collection必填…

今日学习:ES8语法 | Spring整合ES | ES场景八股

文章目录 ES81 ES架构2 ES适用场景3 ES使用3.1对比mysql3.2 索引(Index)3.3 类型(Type)3.4 文档(Document)3.5 字段(Field)3.6 映射(Mapping) 4 ElasticSearch 基础功能4.1 分词器4.2 索引操作4.2.1 创建索引4.2.2 查看所有索引4.2.3 查看单个索引4.2.4 删除索引 4.3 文档操作4…

力扣刷题(第五十一天)

灵感来源 - 保持更新&#xff0c;努力学习 - python脚本学习 存在重复元素 II 解题思路 这个问题可以通过哈希表来高效解决。具体思路如下&#xff1a; 使用哈希表记录元素最后一次出现的位置&#xff1a;遍历数组&#xff0c;用一个哈希表存储每个元素的最后一次出现的…

基于 Vue3 + Element Plus 实现的智能题目生成页面设计思路

在本篇文章中&#xff0c;我将分享一个基于 Vue3 Element Plus 构建的「智能题目生成页面」的实现思路与设计理念。该页面作为在线学习平台的一部分&#xff0c;核心功能是&#xff1a;用户上传学习资料&#xff0c;AI 自动为其生成定制化题目。以下将从页面风格、功能模块、交…

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…

《P1801 黑匣子》

题目描述 Black Box 是一种原始的数据库。它可以储存一个整数数组&#xff0c;还有一个特别的变量 i。最开始的时候 Black Box 是空的&#xff0e;而 i0。这个 Black Box 要处理一串命令。 命令只有两种&#xff1a; ADD(x)&#xff1a;把 x 元素放进 Black Box; GET&#x…

Docker、Wsl 打包迁移环境

电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本&#xff1a; 2.2.4.0 内核版本&#xff1a; 5.15.153.1-2 WSLg 版本&#xff1a; 1.0.61 MSRDC 版本&#xff1a; 1.2.5326 Direct3D 版本&#xff1a; 1.611.1-81528511 DXCore 版本&#xff1a; 10.0.2609…

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…

Server - 使用 Docker 配置 PyTorch 研发环境

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/148421901 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 建议使…

HarmonyOS5.0——CodeGenie:鸿蒙生态的AI编程革命​

​​CodeGenie&#xff1a;鸿蒙生态的AI编程革命​​ 华为推出的 ​​CodeGenie​​ 是集成于 DevEco Studio 的 AI 辅助编程工具&#xff0c;专为 HarmonyOS 应用开发设计。它通过深度优化 ArkTS 和 C 语言的代码生成能力&#xff0c;显著提升开发效率&#xff0c;降低鸿蒙生…

大模型模型部署和暴露接口

创建环境 激活案件 安装相关依赖 conda create -n fastApi python3.10 conda activate fastApi conda install -c conda-forge fastapi uvicorn transformers pytorch pip install safetensors sentencepiece protobuf 新建文件夹 mkdir App cd App touch main.py 复制代码…

Redis初入门

Nosql&#xff1a;Not-Only SQL&#xff08;泛指非关系型数据库&#xff09;&#xff0c;作为关系型数据库的补充 作用&#xff1a;应对基于海量用户和海量数据前提下的数据处理问题 redis&#xff1a;C语言开发的一个开源的高性能键值对数据库 特征&#xff1a; 1、数据之…

【原神 × 二叉树】角色天赋树、任务分支和圣遗物强化路径的算法秘密!

【原神 二叉树】角色天赋树、任务分支和圣遗物强化路径的算法秘密! 作者:星之辰 标签:#原神 #二叉树 #天赋树 #任务分支 #圣遗物强化 #算法科普 发布时间:2025年6月 总字数:6000+ 一、引子:提瓦特大陆的“树型奥秘” 你是否曾留意过《原神》角色面板的天赋树? 升级技能…