当前位置: 首页 > news >正文

STM32入门笔记(03): ADC(SPL库函数版)(2)

A/D转换的常用技术有逐次逼近式双积分式并行式跟踪比较式等。目前用的较多的是前3种。

A/D转换器的主要技术指标

转换时间
分辨率

例如,8位A/D转换器的数字输出量的变化范围为0~255,当输入电压的满刻度为5V时,数字量每变化一个数字所对应输入模拟电压的值为5V/255=19.6mV,其分辨能力为19.6mV

转换精度

转换精度指的是转换后所得的结果相对于实际值的准确度,可以用满量程的百分比这一相对误差来表示,如±0.05%

ADC应用设计深入讨论尽管STM32内部集成了12位ADC,但在实际应用中,要想真正实现12位精度且比较稳定的ADC并不简单,需要进一步从硬件、软件方面进行综合、细致地考虑。下面介绍一些在ADC应用设计中应该考虑的几个要点:

工作电压的稳定性

AVCC是提供给ADC工作的电源,如果AVCC不稳定,就会影响ADC的转换精度

参考电压的确定

ADC的参考电压应稍大于输入电压的最高值。ADC的参考电压VREF可以选择为AVCC,或外接参考电压源,外接的参考电压源应该稳定。

采样时钟的选择

ADC时钟频率最大为14MHz。如果STM32系统时钟频率为56MHz时,一般为4分频,ADC时钟频率为14MHz,如果系统时钟频率为72MHz时,一般为6分频,ADC时钟频率为12MHz。

ADC通道的输入信号频率带宽取决于ADC时钟频率。把ADC通道配置为55.5个周期,若ADCCLK的时钟频率配置为12MHz,则ADC采样的时间计算公式如下。Tcovn=采样时间+12.5个周期

其中:Tcovn为总转换时间,采样时间是根据每个通道的ADC_SampleTime的值来决定的。后面的12.5个周期是ADC转换时量化所需要的

固定的周期,ADC的一次转换所需要的时间是Tcovn=(55.5+12.5)×(1/12),大约是5.67μs。STM32的ADC输入阻抗典型值为50kΩ,为了保证测量准确,被测信号源的输出阻抗要尽可能低。

模拟噪声的抑制

器件外部和内部的数字电路会产生电磁干扰,并会影响模拟测量的精度。如果对ADC的转换精度要求很高,则可以采用以下的技术来降低噪声的影响。

使模拟信号的通路尽可能地短,模拟信号连线应从模拟地的布线盘上通过,并使它们尽可能远离高速开关数字信号线。

STM32的AVCC引脚应该通过LC网络与数字端电源VCC相连。

如果某些ADC引脚作为通用数字输出口,那么在ADC转换过程中,不要改变这些引脚的状态。

校准


ADC - 电压

要将 ADC (模数转换器) 的原始数值转换为电压值,通常需要进行以下步骤:

  1. 确定 ADC 的分辨率
    例如,对于 STM32F103C8T6,ADC 的分辨率是 12 位,因此其数值范围是 0 到 4095。

  2. 确定参考电压
    确定 ADC 的参考电压 Vref。在 STM32F103C8T6 中,默认情况下Vref 通常是 3.3V,但这取决于具体的硬件配置。

  3. 读取 ADC 值
    读取 ADC 转换后的数值,例如 ADC_value 。

  4. 使用公式转换为电压值
    使用公式计算实际的电压值:
    在这里插入图片描述

    其中 ( N ) 是 ADC 的分辨率。例如,对于 12 位 ADC,( N = 12 )。

具体步骤如下:

  1. 读取 ADC 值:

    uint16_t ADC_value = HAL_ADC_GetValue(&hadc1);
    
  2. 计算电压值:

    float V_REF = 3.3; // 假设参考电压为 3.3V
    float voltage = (ADC_value / 4095.0) * V_REF;
    

以下是一个完整的例子,假设你使用 STM32 HAL 库:

#include "main.h"ADC_HandleTypeDef hadc1;void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_ADC1_Init();HAL_ADC_Start(&hadc1);while (1){HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);uint16_t ADC_value = HAL_ADC_GetValue(&hadc1);float V_REF = 3.3;float voltage = (ADC_value / 4095.0) * V_REF;// 在这里使用计算出的电压值}
}static void MX_ADC1_Init(void)
{ADC_ChannelConfTypeDef sConfig = {0};hadc1.Instance = ADC1;hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;hadc1.Init.ContinuousConvMode = ENABLE;hadc1.Init.DiscontinuousConvMode = DISABLE;hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc1.Init.NbrOfConversion = 1;if (HAL_ADC_Init(&hadc1) != HAL_OK){Error_Handler();}sConfig.Channel = ADC_CHANNEL_1;sConfig.Rank = ADC_REGULAR_RANK_1;sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){Error_Handler();}
}static void MX_GPIO_Init(void)
{__HAL_RCC_GPIOA_CLK_ENABLE();
}void SystemClock_Config(void)
{// 时钟配置代码
}

这个例子展示了如何初始化 ADC1 并读取通道 1 (PA1) 的 ADC 值,然后将其转换为电压值。


如果将100V电压经过串联电阻分压,电阻R1为66K,R2为3K,这样如何通过ADC采样计算出电压?

将 100V 电压经过分压电路并通过 ADC 进行采样,计算出实际电压的方法如下:

  1. 分压电路公式
    分压电路的输出电压 Vout 可以用以下公式计算:
    在这里插入图片描述

    其中 Vin 是输入电压, R1 和 R2 是分压电阻。

  2. 具体分压电路参数

    在这里插入图片描述

    注意:在实际应用中,必须确保 ( V_{out} ) 不超过 ADC 的参考电压(例如 3.3V)。在这种情况下,分压比使得 Vout 超过了 ADC 允许的最大电压,需要调整分压电阻以确保 Vout 在安全范围内

  3. 假设安全分压电阻

在这里插入图片描述

  1. 通过 ADC 读取分压后的电压
    设定 ADC 的参考电压 ( V_{REF} = 3.3V )。
假设 ADC 读取的数值为 ( ADC_value ),分辨率为 12 位 (0 到 4095)。

  2. 计算实际电压

在这里插入图片描述

  1. 反向计算原始输入电压

在这里插入图片描述

假设使用 STM32 和 HAL 库,代码示例如下:

#include "main.h"ADC_HandleTypeDef hadc1;void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_ADC1_Init();HAL_ADC_Start(&hadc1);while (1){HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);uint16_t ADC_value = HAL_ADC_GetValue(&hadc1);float V_REF = 3.3;float V_out = (ADC_value / 4095.0) * V_REF;float R1 = 96000.0; // 96KΩfloat R2 = 3000.0;  // 3KΩfloat V_in = V_out * (R1 + R2) / R2;// 使用计算出的 V_in}
}static void MX_ADC1_Init(void)
{ADC_ChannelConfTypeDef sConfig = {0};hadc1.Instance = ADC1;hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;hadc1.Init.ContinuousConvMode = ENABLE;hadc1.Init.DiscontinuousConvMode = DISABLE;hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc1.Init.NbrOfConversion = 1;if (HAL_ADC_Init(&hadc1) != HAL_OK){Error_Handler();}sConfig.Channel = ADC_CHANNEL_1;sConfig.Rank = ADC_REGULAR_RANK_1;sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){Error_Handler();}
}static void MX_GPIO_Init(void)
{__HAL_RCC_GPIOA_CLK_ENABLE();
}void SystemClock_Config(void)
{// 时钟配置代码
}

这个代码展示了如何读取 ADC 值并将其转换为实际电压,再通过分压公式计算出原始输入电压。注意在实际电路中,请确保所有电压和电阻值在安全范围内,以防止损坏设备。


ADC 软件滤波

ADC 读取到的值有抖动是常见现象,可以通过以下几种方法来进行滤波:

  1. 平均值滤波:读取多次 ADC 值,取平均值,可以平滑抖动。
  2. 中值滤波:读取多次 ADC 值,取中间值,可以去除突发噪声。
  3. 低通滤波器:通过数字滤波算法,平滑高频噪声。

以下是每种方法的具体实现:

1. 平均值滤波

#define NUM_SAMPLES 10uint16_t Read_ADC_Averaged(ADC_HandleTypeDef* hadc)
{uint32_t sum = 0;for (int i = 0; i < NUM_SAMPLES; i++){HAL_ADC_Start(hadc);HAL_ADC_PollForConversion(hadc, HAL_MAX_DELAY);sum += HAL_ADC_GetValue(hadc);}return sum / NUM_SAMPLES;
}

2. 中值滤波

#define NUM_SAMPLES 9uint16_t Read_ADC_Median(ADC_HandleTypeDef* hadc)
{uint16_t samples[NUM_SAMPLES];for (int i = 0; i < NUM_SAMPLES; i++){HAL_ADC_Start(hadc);HAL_ADC_PollForConversion(hadc, HAL_MAX_DELAY);samples[i] = HAL_ADC_GetValue(hadc);}// 排序for (int i = 0; i < NUM_SAMPLES - 1; i++){for (int j = 0; j < NUM_SAMPLES - i - 1; j++){if (samples[j] > samples[j + 1]){uint16_t temp = samples[j];samples[j] = samples[j + 1];samples[j + 1] = temp;}}}return samples[NUM_SAMPLES / 2];
}

3. 低通滤波器 (IIR 滤波器)

#define ALPHA 0.1 // 滤波系数,取值范围为 0 到 1float Read_ADC_LowPass(ADC_HandleTypeDef* hadc, float previous_filtered_value)
{HAL_ADC_Start(hadc);HAL_ADC_PollForConversion(hadc, HAL_MAX_DELAY);uint16_t raw_value = HAL_ADC_GetValue(hadc);float current_filtered_value = ALPHA * raw_value + (1 - ALPHA) * previous_filtered_value;return current_filtered_value;
}

综合代码示例

将这些滤波方法整合到你的代码中,可以如下:

#include "main.h"ADC_HandleTypeDef hadc1;void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);#define NUM_SAMPLES 10
#define ALPHA 0.1float previous_filtered_value = 0;uint16_t Read_ADC_Averaged(ADC_HandleTypeDef* hadc)
{uint32_t sum = 0;for (int i = 0; i < NUM_SAMPLES; i++){HAL_ADC_Start(hadc);HAL_ADC_PollForConversion(hadc, HAL_MAX_DELAY);sum += HAL_ADC_GetValue(hadc);}return sum / NUM_SAMPLES;
}uint16_t Read_ADC_Median(ADC_HandleTypeDef* hadc)
{uint16_t samples[NUM_SAMPLES];for (int i = 0; i < NUM_SAMPLES; i++){HAL_ADC_Start(hadc);HAL_ADC_PollForConversion(hadc, HAL_MAX_DELAY);samples[i] = HAL_ADC_GetValue(hadc);}for (int i = 0; i < NUM_SAMPLES - 1; i++){for (int j = 0; j < NUM_SAMPLES - i - 1; j++){if (samples[j] > samples[j + 1]){uint16_t temp = samples[j];samples[j] = samples[j + 1];samples[j + 1] = temp;}}}return samples[NUM_SAMPLES / 2];
}float Read_ADC_LowPass(ADC_HandleTypeDef* hadc, float previous_filtered_value)
{HAL_ADC_Start(hadc);HAL_ADC_PollForConversion(hadc, HAL_MAX_DELAY);uint16_t raw_value = HAL_ADC_GetValue(hadc);float current_filtered_value = ALPHA * raw_value + (1 - ALPHA) * previous_filtered_value;return current_filtered_value;
}int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_ADC1_Init();HAL_ADC_Start(&hadc1);while (1){uint16_t ADC_value_averaged = Read_ADC_Averaged(&hadc1);uint16_t ADC_value_median = Read_ADC_Median(&hadc1);previous_filtered_value = Read_ADC_LowPass(&hadc1, previous_filtered_value);float V_REF = 3.3;float V_out_averaged = (ADC_value_averaged / 4095.0) * V_REF;float V_out_median = (ADC_value_median / 4095.0) * V_REF;float V_out_lowpass = (previous_filtered_value / 4095.0) * V_REF;float R1 = 96000.0;float R2 = 3000.0;float V_in_averaged = V_out_averaged * (R1 + R2) / R2;float V_in_median = V_out_median * (R1 + R2) / R2;float V_in_lowpass = V_out_lowpass * (R1 + R2) / R2;// 使用计算出的 V_in}
}static void MX_ADC1_Init(void)
{ADC_ChannelConfTypeDef sConfig = {0};hadc1.Instance = ADC1;hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;hadc1.Init.ContinuousConvMode = ENABLE;hadc1.Init.DiscontinuousConvMode = DISABLE;hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc1.Init.NbrOfConversion = 1;if (HAL_ADC_Init(&hadc1) != HAL_OK){Error_Handler();}sConfig.Channel = ADC_CHANNEL_1;sConfig.Rank = ADC_REGULAR_RANK_1;sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){Error_Handler();}
}static void MX_GPIO_Init(void)
{__HAL_RCC_GPIOA_CLK_ENABLE();
}void SystemClock_Config(void)
{// 时钟配置代码
}

这个代码示例展示了如何分别使用平均值滤波、中值滤波和低通滤波来处理 ADC 抖动。根据实际需求选择合适的滤波方法,可以有效减小 ADC 读数的抖动。


低通滤波器(IIR)

低通滤波器是一种常用的信号处理技术,用于平滑信号并去除高频噪声。最常见的低通滤波器之一是指数加权移动平均滤波器(IIR 低通滤波器)。

原理

指数加权移动平均滤波器的基本原理是对当前采样值和先前的滤波值进行加权平均。公式如下:

在这里插入图片描述

具体实现步骤

  1. 定义变量

    • 滤波系数 (\alpha)
    • 上一次的滤波输出值(初始为 0)
  2. 读取 ADC 值

    • 使用 HAL 库读取 ADC 值
  3. 计算滤波值

    • 应用低通滤波公式
  4. 重复进行

    • 在循环中持续读取 ADC 值并计算滤波值

代码实现

以下是一个详细的 C 语言代码示例,使用 STM32 HAL 库实现低通滤波器:

#include "main.h"ADC_HandleTypeDef hadc1;void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);#define ALPHA 0.1  // 滤波系数,范围在 0 到 1 之间float previous_filtered_value = 0;  // 上一次的滤波输出值float Read_ADC_LowPass(ADC_HandleTypeDef* hadc, float previous_filtered_value)
{HAL_ADC_Start(hadc);HAL_ADC_PollForConversion(hadc, HAL_MAX_DELAY);uint16_t raw_value = HAL_ADC_GetValue(hadc);float current_filtered_value = ALPHA * raw_value + (1 - ALPHA) * previous_filtered_value;return current_filtered_value;
}int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_ADC1_Init();HAL_ADC_Start(&hadc1);while (1){previous_filtered_value = Read_ADC_LowPass(&hadc1, previous_filtered_value);float V_REF = 3.3;float V_out = (previous_filtered_value / 4095.0) * V_REF;float R1 = 96000.0; // 96KΩfloat R2 = 3000.0;  // 3KΩfloat V_in = V_out * (R1 + R2) / R2;// 在这里使用计算出的 V_in}
}static void MX_ADC1_Init(void)
{ADC_ChannelConfTypeDef sConfig = {0};hadc1.Instance = ADC1;hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;hadc1.Init.ContinuousConvMode = ENABLE;hadc1.Init.DiscontinuousConvMode = DISABLE;hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc1.Init.NbrOfConversion = 1;if (HAL_ADC_Init(&hadc1) != HAL_OK){Error_Handler();}sConfig.Channel = ADC_CHANNEL_1;sConfig.Rank = ADC_REGULAR_RANK_1;sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){Error_Handler();}
}static void MX_GPIO_Init(void)
{__HAL_RCC_GPIOA_CLK_ENABLE();
}void SystemClock_Config(void)
{// 时钟配置代码
}

详细说明

  1. 定义滤波系数和变量

    • #define ALPHA 0.1 定义滤波系数,决定新输入值的权重。
    • float previous_filtered_value = 0; 初始化上一次的滤波输出值。
  2. 读取 ADC 值并应用低通滤波公式

    • HAL_ADC_Start(hadc); 启动 ADC。
    • HAL_ADC_PollForConversion(hadc, HAL_MAX_DELAY); 等待 ADC 转换完成。
    • uint16_t raw_value = HAL_ADC_GetValue(hadc); 获取 ADC 读取值。
    • float current_filtered_value = ALPHA * raw_value + (1 - ALPHA) * previous_filtered_value; 应用低通滤波公式计算当前滤波值。
  3. 在主循环中持续滤波

    • previous_filtered_value = Read_ADC_LowPass(&hadc1, previous_filtered_value); 调用滤波函数,更新滤波值。
  4. 计算和使用滤波后的电压值

    • float V_out = (previous_filtered_value / 4095.0) * V_REF; 计算分压电路的输出电压。
    • float V_in = V_out * (R1 + R2) / R2; 反向计算原始输入电压。

通过这个实现,可以有效地平滑 ADC 读取值的抖动,提高测量的稳定性。


ADC - 电流

为了通过 ADC 采集电流,并根据 ADC 值计算出电流值,需要以下几个步骤:

  1. 选择电流传感器:通常使用分流电阻 (shunt resistor) 或霍尔效应电流传感器。
  2. 采样电压:通过分流电阻或传感器将电流转换为电压,然后用 ADC 采样该电压。
  3. 计算电流:根据电压值和已知的分流电阻或传感器的特性,计算出实际电流。

以下是详细步骤:

1. 分流电阻测量电流

使用分流电阻测量电流的方法如下:

在这里插入图片描述

2. ADC 采样电压

使用 ADC 采样分流电阻上的电压。假设 ADC 的参考电压 ( V_{REF} ) 为 3.3V,分辨率为 12 位 (0 到 4095)。

3. 计算电流

根据 ADC 采样到的电压值,计算实际电流:
[
I = \frac{V_{shunt}}{R_{shunt}} = \frac{ADC_{value} \times V_{REF}}{4095 \times R_{shunt}}
]

代码实现

以下是一个详细的 C 语言代码示例,使用 STM32 HAL 库通过分流电阻测量电流:

#include "main.h"ADC_HandleTypeDef hadc1;void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);#define R_SHUNT 0.01  // 分流电阻值 (单位: 欧姆)
#define V_REF 3.3     // ADC 参考电压 (单位: 伏特)
#define ADC_RESOLUTION 4095.0 // ADC 分辨率 (12 位)float Read_Current(ADC_HandleTypeDef* hadc, float R_shunt)
{HAL_ADC_Start(hadc);HAL_ADC_PollForConversion(hadc, HAL_MAX_DELAY);uint16_t ADC_value = HAL_ADC_GetValue(hadc);float V_shunt = (ADC_value / ADC_RESOLUTION) * V_REF;float current = V_shunt / R_shunt;return current;
}int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_ADC1_Init();HAL_ADC_Start(&hadc1);while (1){float current = Read_Current(&hadc1, R_SHUNT);// 在这里使用计算出的电流值 current}
}static void MX_ADC1_Init(void)
{ADC_ChannelConfTypeDef sConfig = {0};hadc1.Instance = ADC1;hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;hadc1.Init.ContinuousConvMode = ENABLE;hadc1.Init.DiscontinuousConvMode = DISABLE;hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc1.Init.NbrOfConversion = 1;if (HAL_ADC_Init(&hadc1) != HAL_OK){Error_Handler();}sConfig.Channel = ADC_CHANNEL_1;sConfig.Rank = ADC_REGULAR_RANK_1;sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){Error_Handler();}
}static void MX_GPIO_Init(void)
{__HAL_RCC_GPIOA_CLK_ENABLE();
}void SystemClock_Config(void)
{// 时钟配置代码
}

详细说明

  1. 定义分流电阻和 ADC 参数

    • #define R_SHUNT 0.01 定义分流电阻值,单位为欧姆。
    • #define V_REF 3.3 定义 ADC 参考电压,单位为伏特。
    • #define ADC_RESOLUTION 4095.0 定义 ADC 的分辨率。
  2. 读取 ADC 值并计算电流

    • HAL_ADC_Start(hadc); 启动 ADC。
    • HAL_ADC_PollForConversion(hadc, HAL_MAX_DELAY); 等待 ADC 转换完成。
    • uint16_t ADC_value = HAL_ADC_GetValue(hadc); 获取 ADC 读取值。
    • float V_shunt = (ADC_value / ADC_RESOLUTION) * V_REF; 计算分流电阻上的电压。
    • float current = V_shunt / R_shunt; 计算实际电流。
  3. 在主循环中持续测量电流

    • float current = Read_Current(&hadc1, R_SHUNT); 调用测量电流的函数,获取当前电流值。

通过这个实现,可以有效地使用 ADC 采集电流,并根据 ADC 值计算出实际电流值。


ADC - 温度

使用查表法计算温度是一种常见且简单的方法,特别适合在微控制器上实现,因为它不需要复杂的数学运算。以下是具体步骤和实现方法:

步骤概述

  1. 建立查表:根据 NTC 热敏电阻的特性曲线,创建一个电阻值与温度对应的查表(数组)。
  2. 读取 ADC 值:使用 ADC 读取分压电路的电压。
  3. 计算 NTC 电阻值:根据分压公式计算 NTC 热敏电阻的电阻值。
  4. 查找温度:在查表中找到对应的温度值。

具体步骤

1. 建立查表

NTC 热敏电阻的电阻值随温度变化。可以根据热敏电阻的数据手册或特性曲线建立一个电阻值与温度对应的查表。例如:

const uint32_t resistance_table[] = {3380, 3300, 3220, /* ... */ 100}; // 阻值 (单位: 欧姆)
const float temperature_table[] = {0, 1, 2, /* ... */ 100}; // 温度值 (单位: 摄氏度)
const int table_size = sizeof(resistance_table) / sizeof(resistance_table[0]);
2. 使用 ADC 读取电压

使用 STM32 的 ADC 采样 Vout。

3. 计算 NTC 电阻值

在这里插入图片描述

4. 查找温度

在查表中找到对应的温度值,可以使用线性插值法提高精度。

代码实现

以下是一个详细的 C 语言代码示例,使用 STM32 HAL 库实现以上步骤:

#include "main.h"
#include <stdio.h>ADC_HandleTypeDef hadc1;void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);#define R1 10000  // 固定电阻值 (单位: 欧姆)
#define V_REF 3.3 // ADC 参考电压 (单位: 伏特)
#define ADC_RESOLUTION 4095.0 // ADC 分辨率 (12 位)// 查表 (电阻值单位: 欧姆, 温度单位: 摄氏度)
const uint32_t resistance_table[] = {3380, 3300, 3220, /* ... */ 100};
const float temperature_table[] = {0, 1, 2, /* ... */ 100};
const int table_size = sizeof(resistance_table) / sizeof(resistance_table[0]);float Read_NTC_Temperature(ADC_HandleTypeDef* hadc)
{HAL_ADC_Start(hadc);HAL_ADC_PollForConversion(hadc, HAL_MAX_DELAY);uint16_t ADC_value = HAL_ADC_GetValue(hadc);float Vout = (ADC_value / ADC_RESOLUTION) * V_REF;float R_ntc = R1 * (V_REF / Vout - 1);// 查表法找到温度值for (int i = 0; i < table_size - 1; i++){if (R_ntc >= resistance_table[i+1] && R_ntc <= resistance_table[i]){// 线性插值计算温度float R1 = resistance_table[i];float R2 = resistance_table[i+1];float T1 = temperature_table[i];float T2 = temperature_table[i+1];float temperature = T1 + (R_ntc - R1) * (T2 - T1) / (R2 - R1);return temperature;}}// 如果未找到匹配的电阻值,返回一个默认值return -273.15; // 表示错误
}int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_ADC1_Init();HAL_ADC_Start(&hadc1);while (1){float temperature = Read_NTC_Temperature(&hadc1);// 使用计算出的温度值 temperature}
}static void MX_ADC1_Init(void)
{ADC_ChannelConfTypeDef sConfig = {0};hadc1.Instance = ADC1;hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;hadc1.Init.ContinuousConvMode = ENABLE;hadc1.Init.DiscontinuousConvMode = DISABLE;hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc1.Init.NbrOfConversion = 1;if (HAL_ADC_Init(&hadc1) != HAL_OK){Error_Handler();}sConfig.Channel = ADC_CHANNEL_1;sConfig.Rank = ADC_REGULAR_RANK_1;sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){Error_Handler();}
}static void MX_GPIO_Init(void)
{__HAL_RCC_GPIOA_CLK_ENABLE();
}void SystemClock_Config(void)
{// 时钟配置代码
}

详细说明

  1. 定义常量和查表

    • #define R1 10000 定义固定电阻 ( R1 ) 的值,单位为欧姆。
    • #define V_REF 3.3 定义 ADC 参考电压,单位为伏特。
    • #define ADC_RESOLUTION 4095.0 定义 ADC 的分辨率。
    • const uint32_t resistance_table[]const float temperature_table[] 分别定义电阻值和温度值的查表。
    • const int table_size 定义查表的大小。
  2. 读取 ADC 值并计算电阻和温度

    • HAL_ADC_Start(hadc); 启动 ADC。
    • HAL_ADC_PollForConversion(hadc, HAL_MAX_DELAY); 等待 ADC 转换完成。
    • uint16_t ADC_value = HAL_ADC_GetValue(hadc); 获取 ADC 读取值。
    • float Vout = (ADC_value / ADC_RESOLUTION) * V_REF; 计算分压电路的输出电压。
    • float R_ntc = R1 * (V_REF / Vout - 1); 计算 NTC 热敏电阻的电阻值。
  3. 查找温度值

    • 遍历查表,通过线性插值计算电阻值与温度值之间的关系,找到对应的温度。

通过这个实现,可以有效地使用 ADC 采集 NTC 热敏电阻的电阻值,并通过查表法将其转换为温度。线性插值可以提高温度计算的精度。查表数据可以根据具体的 NTC 热敏电阻特性曲线来建立。

相关文章:

STM32入门笔记(03): ADC(SPL库函数版)(2)

A/D转换的常用技术有逐次逼近式、双积分式、并行式和跟踪比较式等。目前用的较多的是前3种。 A/D转换器的主要技术指标 转换时间 分辨率 例如&#xff0c;8位A/D转换器的数字输出量的变化范围为0&#xff5e;255&#xff0c;当输入电压的满刻度为5V时&#xff0c;数字量每变化…...

2024年7月2日 (周二) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键&#xff0c;实现一键唤起、一键隐藏的 Windows 工具&#xff0c;并且支持窗口动态绑定快捷键&#xff08;无需设置自动实现&#xff09;。 卸载工具 HiBitUninstaller: Windows上的软件卸载工具 经典名作30周年新篇《恐怖惊魂夜…...

如何使用Spring Boot Profiles进行环境配置管理

如何使用Spring Boot Profiles进行环境配置管理 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨如何利用Spring Boot Profiles来管理不同环境…...

Java错题归纳(二)

1、若有如下接口A的定义&#xff0c;下列哪些类下确实现了该接口&#xff1a;C interface A { void method1(int i); void method2(int j); } A class B implements A{ void method1( ) { } void method2( ) { } } B class B implements A { void method1(int i ) { }…...

Grafana面试题精选和参考答案

目录 Grafana是什么以及它的主要应用场景 Grafana支持的数据源 Grafana的体系结构及主要组件 Grafana如何实现数据的可视化和监控 Grafana支持的图表类型 如何在Grafana中创建和编辑仪表盘 Grafana的查询编辑器功能 Grafana支持的认证方式 Grafana的性能调优建议 Gra…...

Node版本管理工具 fnm 安装使用

fnm 是一个基于 Rust 开发的 Node 版本管理工具&#xff0c;它的目标是提供一个快速、简单且可靠的方式来管理 Node.js 的不同版本。同时&#xff0c;它是跨平台的&#xff0c;支持 macOS、Linux、Windows。&#x1f680; Fast and simple Node.js version manager, built in R…...

vector模拟实现【C++】

文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间和类类的成员变量 迭代器迭代器获取函数 构造函数默认构造使用n个值构造迭代器区间构造解决迭代器区间构造和用n个值构造的冲突拷贝构造 析构函数swap【交换函数】赋值运算符重载emptysize和capacityopera…...

《每天5分钟用Flask搭建一个管理系统》第11章:测试与部署

第11章&#xff1a;测试与部署 11.1 测试的重要性 测试是确保应用质量和可靠性的关键步骤。它帮助开发者发现和修复错误&#xff0c;验证功能按预期工作。 11.2 Flask测试客户端的使用 Flask提供了一个测试客户端&#xff0c;可以在开发过程中模拟请求并测试应用的响应。 …...

Landsat数据从Collection1更改为Collection2

目录 问题解决 问题 需要注意!您使用的是废弃的陆地卫星数据集。为确保功能持续&#xff0c;请在2024年7月1日前更新。 在使用一些以前的代码时会遇到报错&#xff0c;因为代码里面用的是老的数据集 解决 对于地表反射率SR&#xff0c;需要在name中&#xff0c;将C01换为C02&…...

《每天5分钟用Flask搭建一个管理系统》第12章:安全性

第12章&#xff1a;安全性 12.1 Web应用的安全威胁 Web应用面临的安全威胁包括但不限于跨站脚本攻击&#xff08;XSS&#xff09;、SQL注入、跨站请求伪造&#xff08;CSRF&#xff09;、不安全的直接对象引用&#xff08;IDOR&#xff09;等。 12.2 Flask-Talisman扩展的使…...

Unity之创建与导出PDF

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity之创建与导出PDF TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&#xff01; 助力快速…...

【Android面试八股文】优化View层次过深问题,选择哪个布局比较好?

优化深层次View层次结构的问题&#xff0c;选择合适的布局方式是至关重要的。以下是几点建议&#xff1a; 使用ConstraintLayout&#xff1a;ConstraintLayout是Android开发中推荐的布局&#xff0c;能够有效减少嵌套&#xff0c;提高布局性能。相比RelativeLayout&#xff0c;…...

什么是带有 API 网关的代理?

带有 API 网关的代理服务显著提升了用户体验和性能。特别是对于那些使用需要频繁创建和轮换代理的工具的用户来说&#xff0c;使用 API 可以节省大量时间并提高效率。 了解 API API&#xff0c;即应用程序编程接口&#xff0c;是服务提供商和用户之间的连接网关。通过 API 连接…...

sql拉链表

1、定义&#xff1a;维护历史状态以及最新数据的一种表 2、使用场景 1、有一些表的数据量很大&#xff0c;比如一张用户表&#xff0c;大约1亿条记录&#xff0c;50个字段&#xff0c;这种表 2.表中的部分字段会被update更新操作&#xff0c;如用户联系方式&#xff0c;产品的…...

STM32CubeMX实现矩阵按键(HAL库实现)

功能描述&#xff1a; 实现矩阵按键验证&#xff0c;将矩阵按键的按键值&#xff0c;通过串口显示&#xff0c;便于后面使用。 实物图 原理图&#xff1a; 编程原理&#xff1a; 原理很简单&#xff0c;就是通过循环设置引脚为低电平&#xff0c;另外引脚扫描读取电平值&…...

mmdetection3D指定版本安装指南

1. 下载指定版本号 选择指定版本号下载mmdetection3d的源码&#xff0c;如这里选择的是0.17.2版本 git clone https://github.com/open-mmlab/mmdetection3d.git -b v0.17.22. 安装 cd mmdetection3d安装依赖库 pip install -r requirment.txt编译安装 pip install -v e .…...

SQLMap工具详解与SQL注入防范

SQLMap工具详解与SQL注入防范 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨SQLMap工具的详细使用方法以及如何防范SQL注入攻击。 SQL注入简介 SQL注入是一种常见的安全漏洞&am…...

如何在Java中实现自定义数据结构:从头开始

如何在Java中实现自定义数据结构&#xff1a;从头开始 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Java中实现自定义数据结构&#xff…...

【机器学习】在【Pycharm】中的应用:【线性回归模型】进行【房价预测】

专栏&#xff1a;机器学习笔记 pycharm专业版免费激活教程见资源&#xff0c;私信我给你发 python相关库的安装&#xff1a;pandas,numpy,matplotlib&#xff0c;statsmodels 1. 引言 线性回归&#xff08;Linear Regression&#xff09;是一种常见的统计方法和机器学习算法&a…...

如何在 Linux 中后台运行进程?

一、后台进程 在后台运行进程是 Linux 系统中的常见要求。在后台运行进程允许您在进程独立运行时继续使用终端或执行其他命令。这对于长时间运行的任务或当您想要同时执行多个命令时特别有用。 在深入研究各种方法之前&#xff0c;让我们先了解一下什么是后台进程。在 Linux 中…...

软考-软件设计师

软考 软考科目 软考分为初级、中级、高级&#xff0c;初级含金量相对不够&#xff0c;高级考试有难度&#xff0c;所以大多数人都在考中级&#xff0c;中级也分很多科目&#xff0c;我考的是软件设计师&#xff08;已经通过&#xff09;。 合格标准 考试分为上午题和下午题…...

UOS系统中JavaFx笔锋功能

关于笔锋功能&#xff0c;网上找了很久&#xff0c;包括Java平台客户端&#xff0c;Android端&#xff0c;相关代码资料比较少&#xff0c;找了很多经过测试效果都差强人意&#xff0c;自己也搓不出来&#xff0c;在UOS平台上JavaFX也获取不到压力值&#xff0c;只能用速度的变…...

后端加前端Echarts画图示例全流程(折线图,饼图,柱状图)

本文将带领读者通过一个完整的Echarts画图示例项目&#xff0c;演示如何结合后端技术&#xff08;使用Spring Boot框架&#xff09;和前端技术&#xff08;使用Vue.js或React框架&#xff09;来实现数据可视化。我们将实现折线图、饼图和柱状图三种常见的数据展示方式&#xff…...

ValidateAntiForgeryToken、AntiForgeryToken 防止CSRF(跨网站请求伪造)

用途&#xff1a;防止CSRF&#xff08;跨网站请求伪造&#xff09;。 用法&#xff1a;在View->Form表单中: aspx&#xff1a;<%:Html.AntiForgeryToken()%> razor&#xff1a;Html.AntiForgeryToken() 在Controller->Action动作上&#xff1a;[ValidateAntiForge…...

《昇思25天学习打卡营第5天 | mindspore 网络构建 Cell 常见用法》

1. 背景&#xff1a; 使用 mindspore 学习神经网络&#xff0c;打卡第五天&#xff1b; 2. 训练的内容&#xff1a; 使用 mindspore 的 nn.Cell 构建常见的网络使用方法&#xff1b; 3. 常见的用法小节&#xff1a; 支持一系列常用的 nn 的操作 3.1 nn.Cell 网络构建&…...

SQLServer:从数据类型 varchar 转换为 numeric 时出错。

1.工作要求 计算某两个经纬度距离 2.遇到问题 从数据类型 varchar 转换为 numeric 时出错。 3.解决问题 项目版本较老&#xff0c;使用SQLServer 2012 计算距离需执行视图&#xff0c;如下&#xff1a; SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GO ALTER view vi_ord…...

探索迁移学习:通过实例深入理解机器学习的强大方法

探索迁移学习&#xff1a;通过实例深入理解机器学习的强大方法 &#x1f341;1. 迁移学习的概念&#x1f341;2. 迁移学习的应用领域&#x1f341;2.1 计算机视觉&#x1f341;2.2 自然语言处理&#xff08;NLP&#xff09;&#x1f341;2.3 医学图像分析&#x1f341;2.4 语音…...

【Linux】性能分析器 perf 详解(四):trace

上一篇:【Linux】性能分析器 perf 详解(三) 1、trace 1.1 简介 perf trace 类似于 strace 工具:用于对Linux系统性能分析和调试的工具。 原理是:基于 Linux 性能计数器(Performance Counters for Linux, PCL),监控和记录系统调用和其他系统事件。 可以提供关于硬件…...

信息安全体系架构设计

对信息系统的安全需求是任何单一安全技术都无法解决的&#xff0c;要设计一个信息安全体系架构&#xff0c;应当选择合适的安全体系结构模型。信息系统安全设计重点考虑两个方面&#xff1b;其一是系统安全保障体系&#xff1b;其二是信息安全体系架构。 1.系统安全保障体系 安…...

GPT-5即将登场:AI赋能下的未来工作与日常生活新图景

随着OpenAI首席技术官米拉穆拉蒂在近期采访中的明确表态&#xff0c;GPT-5的发布已不再是遥不可及的梦想&#xff0c;而是即将在一年半后与我们见面的现实。这一消息无疑在科技界乃至全社会引发了广泛关注和热烈讨论。从GPT-4到GPT-5的飞跃&#xff0c;被形容为从高中生到博士生…...

RocketMQ实战:一键在docker中搭建rocketmq和doshboard环境

在本篇博客中&#xff0c;我们将详细介绍如何在 Docker 环境中一键部署 RocketMQ 和其 Dashboard。这个过程基于一个预配置的 Docker Compose 文件&#xff0c;使得部署变得简单高效。 项目介绍 该项目提供了一套 Docker Compose 配置&#xff0c;用于快速部署 RocketMQ 及其…...

前端项目vue3/React使用pako库解压缩后端返回gzip数据

pako仓库地址&#xff1a;https://github.com/nodeca/pako 文档地址&#xff1a;pako 2.1.0 API documentation 外部接口返回一个直播消息或者图片数据是经过zip压缩的&#xff0c;前端需要把这个数据解压缩之后才可以使用&#xff0c;这样可以大大降低网络数据传输的内容&…...

C++专业面试真题(1)学习

TCP和UDP区别 TCP 面向连接。在传输数据之前&#xff0c;通信双方需要先建立一个连接&#xff08;三次握手&#xff09;。可靠性。TCP提供可靠的数据传输&#xff0c;它通过序列号、确认应答、重传机制和校验和等技术确保数据的正确传输。数据顺序&#xff1a;TCP保证数据按发…...

2024 年人工智能和数据科学的五个主要趋势

引言 2023年&#xff0c;人工智能和数据科学登上了新闻头条。生成性人工智能的兴起无疑是这一显著提升曝光度的驱动力。那么&#xff0c;在2024年&#xff0c;该领域将如何继续占据头条&#xff0c;并且这些趋势又将如何影响企业的发展呢&#xff1f; 在过去几个月&#xff0c;…...

GPU云渲染平台到底怎么选?这六点要注意!

随着对高效计算和图像处理需求的增加&#xff0c;GPU云渲染平台成为许多行业的关键工具。尤其是对影视动画制作领域来说&#xff0c;选择一个合适的GPU云渲染平台可以大大提升工作效率。然而&#xff0c;面对市场上众多的选择&#xff0c;如何找到适合自己的GPU云渲染平台呢&am…...

【区块链+基础设施】国家健康医疗大数据科创平台 | FISCO BCOS应用案例

在医疗领域&#xff0c;疾病数据合法合规共享是亟待解决的难题。一方面&#xff0c;当一家医院对患者实施治疗后&#xff0c;若患者转到其 他医院就医&#xff0c;该医院就无法判断诊疗手段是否有效。另一方面&#xff0c;医疗数据属于个人敏感数据&#xff0c;一旦被泄露或被恶…...

redis压测和造数据方式

一、redis 压测工具 1、压测命令 1、对3000字节的数据进行get set的操作 redis-benchmark -h 10.166.15.36 -p 7001 -t set,get -n 100000 -q -d 3000 2、100个并发连接&#xff0c;100000个请求&#xff0c;检测host为localhost 端口为6379的redis服务器性能 redis-benchma…...

数据存储方案选择:ES、HBase、Redis、MySQL与MongoDB的应用场景分析

一、概述 1.1 背景 在当今数据驱动的时代&#xff0c;选择合适的数据存储技术对于构建高效、可靠的信息系统至关重要。随着数据量的爆炸式增长和处理需求的多样化&#xff0c;市场上涌现出了各种数据存储解决方案&#xff0c;每种技术都有其独特的优势和适用场景。Elasticsear…...

数组理论基础

1. **数组定义**&#xff1a; - 数组是存放在连续内存空间上的相同类型数据的集合。 2. **数组特性**&#xff1a; - 数组下标从0开始。 - 数组的内存空间地址是连续的。 3. **数组操作**&#xff1a; - 数组可以通过下标索引快速访问元素。 - 数组元素的删除…...

FlinkCDC 数据同步优化及常见问题排查

【面试系列】Swift 高频面试题及详细解答 欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 欢迎关注微信公众号&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、…...

手把手edusrc漏洞挖掘和github信息收集

0x1 前言 这里主要还是介绍下新手入门edusrc漏洞挖掘以及在漏洞挖掘的过程中信息收集的部分哈&#xff01;&#xff08;主要给小白看的&#xff0c;大佬就当看个热闹了&#xff09;下面的话我将以好几个不同的方式来给大家介绍下edusrc入门的漏洞挖掘手法以及利用github信息收…...

linux系统中的各种命令的解释和帮助(含内部命令、外部命令)

目录 一、说明 二、命令详解 1、帮助命令的种类 &#xff08;1&#xff09;help用法 &#xff08;2&#xff09;--help用法 2、如何区别linux内部命令和外部命令 三、help和—help 四、man 命令 1、概述 2、语法和命令格式 &#xff08;1&#xff09;man命令的格式&…...

Gemma轻量级开放模型在个人PC上释放强大性能,让每个桌面秒变AI工作站

Google DeepMind团队最近推出了Gemma&#xff0c;这是一个基于其先前Gemini模型研究和技术的开放模型家族。这些模型专为语言理解、推理和安全性而设计&#xff0c;具有轻量级和高性能的特点。 Gemma 7B模型在不同能力领域的语言理解和生成性能&#xff0c;与同样规模的开放模型…...

Git使用中遇到的问题(随时更新)

问题1.先创建本地库&#xff0c;后拉取远程仓库时上传失败的问题怎么解决&#xff1f; 操作主要步骤&#xff1a; step1 设置远程仓库地址: $ git remote add origin gitgitee.com:yourAccount/reponamexxx.git step2 推送到远程仓库: $ git push -u origin "master&qu…...

php 跨域问题

设置header <?php $origin isset($_SERVER[HTTP_ORIGIN])? $_SERVER[HTTP_ORIGIN]:;$allow_originarray(http://www.aaa.com,http://www.bbb.com, ); if( $origin in $allow_origin ){header("Access-Control-Allow-Origin:".$origin);header("Access-Co…...

【leetcode52-55图论、56-63回溯】

图论 回溯...

2024 年江西省研究生数学建模竞赛题目 A题交通信号灯管理---完整文章分享(仅供学习)

问题&#xff1a; 交通信号灯是指挥车辆通行的重要标志&#xff0c;由红灯、绿灯、黄灯组成。红灯停、绿灯行&#xff0c;而黄灯则起到警示作用。交通信号灯分为机动车信号灯、非机动车信号灯、人行横道信号 灯、方向指示灯等。一般情况下&#xff0c;十字路口有东西向和南北向…...

日志可视化监控体系ElasticStack 8.X版本全链路实战

目录 一、SpringBoot3.X整合logback配置1.1 log4j、logback、self4j 之间关系 1.2 SpringBoot3.X整合logback配置 二、日志可视化分析ElasticStack 2.1为什么要有Elastic Stack 2.2 什么是Elastic Stack 三、ElasticSearch8.X源码部署 ​四、Kibana源码部署 五、LogSta…...

【LinuxC语言】定义线程池结果

文章目录 前言任务结构体线程池定义总结前言 在并发编程中,线程池是一种非常重要的设计模式。线程池可以有效地管理和控制线程的数量,避免线程频繁创建和销毁带来的性能开销,提高系统的响应速度。在Linux环境下,我们可以使用C语言来实现一个简单的线程池。 线程池的主要组…...

uniapp分包

分包是为了优化小程序的下载和启动速度 小程序启动默认下载主包并启动页面&#xff0c;当用户进入分包时&#xff0c;才会下载对应的分包&#xff0c;下载完进行展示。 /* 在manifest.json配置下添加optimization&#xff0c;开启分包优化 */ "mp-weixin" : {/**分包…...

基于Pinia的WebSocket管理与优化实践(实现心跳重连机制,异步发送)

WebSocket作为一种全双工通信协议&#xff0c;允许服务器和客户端之间建立持久的连接&#xff0c;提供了比传统HTTP请求更为高效的数据交换方式。本文将探讨如何使用Pinia状态管理库在Vue应用中优雅地管理和优化WebSocket连接&#xff0c;以实现稳定、高效的实时数据传输。 环境…...

谷粒商城学习-09-配置Docker阿里云镜像加速及各种docker问题记录

文章目录 一&#xff0c;配置Docker阿里云镜像加速二&#xff0c;Docker安装过程中的几个问题1&#xff0c;安装报错&#xff1a;Could not resolve host: mirrorlist.centos.org; Unknown error1.1 检测虚拟机网络1.2 重设yum源 2&#xff0c;报错&#xff1a;Could not fetch…...

SQLyog脚本无限试用重置脚本

文章目录 引言脚本(win)必要操作、说明 引言 SQLyog 需要po jie&#xff0c;但是网上的没看到很好使的&#xff0c;直接下的官方。能处理14天试用也是很ok的。 脚本(win) echo offREM SQLyog注册表key&#xff0c;可能跟你的不一样&#xff0c;如果不一样&#xff0c;请替换…...

数据结构历年考研真题对应知识点(串的模式匹配)

目录 4.2串的模式匹配 4.2.2串的模式匹配算法——KMP算法 【KMP 匹配过程中指针变化的分析(2015)】 【KMP 匹配过程中比较次数的分析(2019)】 4.2串的模式匹配 4.2.2串的模式匹配算法——KMP算法 【KMP 匹配过程中指针变化的分析(2015)】 最终得到子串指针变化公式 jnex…...

用requirements.txt配置环境

1. 在anaconda创建环境 创建Python版本为3.8的环境&#xff0c;与yolov5所需的包适配。 2. 在Anaconda Prompt中激活环境 (base) C:\Users\吴伊晴>conda activate yolov5 3. 配置环境 用指定路径中的requirements.txt配置环境。 (yolov5) C:\Users\吴伊晴>pip insta…...

JS hook

参照&#xff1a; JS 逆向之 Hook JS Hook 与 过 debugger 一、常用Hook 1. eval (function() {let _eval eval;eval function(val) {if (val.indexof(debugger) -1) {_eval_cache(obj);}} })(); 2. JSON.parse() (function () {var parse_ JSON.parse;JSON.parse …...

订单超13000台,配激光雷达+空悬+CDC,增程/纯电

前不久,星途星纪元ET开启预售,新车提供增程和纯电两种动力,官方给出的预售价格区间为:增程版19.9万-23.9万元,纯电动版为23.9-32.9万元,作为一台长度接近5米,轴距为3米的大5座车型,它的目标竞品为理想L7/L6以及问界M7等车型,星纪元ET的优势是动力组合丰富,价格便宜,另…...

起售13.98万,取消鲢鱼嘴设计,试驾体验第十一代索纳塔!

对于2002年就进入国内市场的索纳塔,相信大多数人并不陌生,定位上是一台中型车,整体的风格就是突出运动基因,而在今年是迎来了家族第十一代车型上市。车辆指导售价在13.98~18.68万之间,作为一台中型车,定价方面还算合理,从低到高,动力上有两种选择,一种是1.5T涡轮增压引…...

软件架构设计属性之一:功能性属性浅析

引言 软件架构设计属性中的功能性属性是评估软件架构是否满足其预定功能需求的关键指标。功能性属性确保软件能够执行其设计中的任务&#xff0c;并提供所需的服务。以下是对软件架构设计中功能性属性的浅析&#xff1a; 一、定义 功能性属性是指软件系统所具备的功能特性&a…...

Java中的ORM框架——myBatis

一、什么是ORM ORM 的全称是 Object Relational Mapping。Object代表应用程序中的对象&#xff0c;Relational表示的是关系型数据库&#xff0c;Mapping即是映射。结合起来就是在程序中的对象和关系型数据库之间建立映射关系&#xff0c;这样就可以用面向对象的方式&#xff0c…...

Facebook的魅力:数字时代的社交热点

在当今数字化时代&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中的巨头&#xff0c;一直以其独特的魅力吸引着全球数十亿用户。本文将深入探讨Facebook的魅力所在&#xff0c;以及它在数字时代的社交热点。 1. 社交网络的霸主&…...

学业辅导导师:文心一言智能体详细介绍和开发

一、前言 本期题目 开发方向&#xff1a;学习成长类 解读&#xff1a; AI技术在学习成长方向的应用正日益增多&#xff0c;本期赛题需围绕该方向开发智能体包括但不限于:作文辅导助手、个性化学习助手、考试助手、各垂类教育内容专家等 二、我的智能体&#xff1a;学业辅导…...