ADC模数转换

news2024/11/12 22:43:15

ADC模数转换

  • ADC简介
    • 逐次逼近型ADC简介
    • STM32的ADC外设
  • ADC的基本结构
  • ADC输入通道
  • 规则组的转换模式
    • 单次转换,非扫描模式
    • 连续转换,非扫描模式
    • 单次转换,扫描模式
    • 连续转换,扫描模式
  • 触发控制
  • 数据对齐
  • 转换时间
  • 校准
  • 可输出不同电压的电路
  • ADC库函数
    • ADC_InitTypeDef参数
    • 函数
  • 案例
    • AD单通道转换
      • 使用的函数
      • 接线图
      • 示例代码

ADC简介

ADC(Analog-Digital Converter)模拟-数字转换器
ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁
12位逐次逼近型ADC,1us转换时间
输入电压范围:03.3V,转换结果范围:04095 18个输入通道,可测量16个外部和2个内部信号源
规则组和注入组两个转换单元
模拟看门狗自动监测输入电压范围

逐次逼近型ADC简介

在这里插入图片描述
“地址锁存和译码”用来选择通道

“IN0~IN7”是8路输入通道,可以输入模拟信号

使用“通道选择开关”选择其中的一路,输入到“比较器”的待测端

“比较器“可以判断两个输入信号的电压大小关系,输出高低电平指示大小。一端是待测端,另一端是”DAC“的电压输出端

给“DAC”一个数据,他就可以输出数据对应的电压,其内部原理是使用加权电阻网络实现

将”比较器“待测端的未知电压与“DAC”输出的已知电压进行比较,当未知电压不等于“DAC”输出的电压时,就调整输入”DAC“的数据来改变”DAC“输出的电压,直到与未知电压近似,此时”比较器“待测端的电压的数字信号就等于输入给”DAC“的数据。比较的方法是:二分法

获取模拟信号对应的数字信号后,将数字信号存放到“8位三态锁存缓冲器”中,并将标志位“EOC”置1,表示成功获取到了数字信号,可以从“8位三态锁存缓冲器”中取值了

STM32的ADC外设

在这里插入图片描述
规则组:

  1. 规则通道:规则组转换单元,一次可以选中16个通道,然后依次进行转换。也可以选择16个通道以下的通道数。
  2. 规则通道数据寄存器:存放规则组转换出来的数据,只有一个数据寄存器,所以当规则组同时转换多个通道的数据时,转换完成一个通道就需要立马将该通道转换的数据取出来,否则会被后面通道转换的数据覆盖。一般配合DMA来使用

注入组:

  1. 注入通道:注入组转换单元,一次可以选中4个通道,然后依次进行转换。也可以选择4个通道以下的通道数。
  2. 注入通道数据寄存器:存放注入组转换出来的数据,有四个数据寄存器,分别对应注入通道连接的4个通道,因此注入组不必担心转换出来的数据被覆盖的情况

ADC的基本结构

在这里插入图片描述

ADC输入通道

在这里插入图片描述

规则组的转换模式

单次转换:在完成一次转换后,进行下一次转换时需要重新触发一次

连续转换:在完成一次转换后,进行下一次转换时无需再触发,自动开始转换

非扫描模式:每一次转换只能转换一个通道

扫描模式:每次转换可以转换16个及以下的通道,按照序列一个一个的转换。16个序列中可以放重复的通道

间断模式:在扫描模式下,每隔几个转换就暂停一次,需要再次触发才能继续转换

单次转换,非扫描模式

在这里插入图片描述

连续转换,非扫描模式

在这里插入图片描述

单次转换,扫描模式

在这里插入图片描述

连续转换,扫描模式

在这里插入图片描述

触发控制

在这里插入图片描述
EXTSEL:配置寄存器的参数。使用库函数的话给个参数就行

触发源:用于触发AD转换

数据对齐

STM32的ADC外设是12位的,那么转换结果只有12位,但是数据寄存器是16位的,所以数据有两种对齐方式

数据右对齐:低16位写转换出来的数据,高4位补0
一般使用该方式,直接读寄存器就是转换的结果,不需要二次计算

数据左对齐:高16位写转换出来的数据,低4位补0
直接读寄存器的话会比实际值大,对于不需要很高分辨率的情况可以选这种,只读寄存器的高8位,舍弃掉后面4位的精度,相当于8位ADC
在这里插入图片描述

转换时间

AD转换的步骤:采样,保持,量化,编码

采样、保持:AD在转换时是需要一小段时间的,需要输入的电压稳定不变才能准确的定位。比如用一个小容量的电容存储一下采样的电压,方便后面的量化、编码

量化、编码:逐次比较

STM32 ADC的总转换时间为:TCONV = 采样时间 + 12.5个ADC周期

采样时间是在保持电压时消耗的时间

ADC周期是从RCC分频过来的ADCCLK,最大频率为14MHz

12位的ADC,所以需要12个周期,还有0.5个周期是做其他事情花的时间

例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期
TCONV = 1.5 + 12.5 = 14个ADC周期 = 1μs

当然,也可以对ADCCLK进行超频,大于14MHz,这样转换时间会更快,但是稳定性会下降

校准

不需要详细了解,只需要在初始化ADC的后面加上几条用于校准的代码即可

ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差

建议在每次上电后执行一次校准

启动校准前, ADC必须处于关电状态超过至少两个ADC时钟周期

可输出不同电压的电路

在这里插入图片描述

ADC库函数

ADC_InitTypeDef参数

typedef struct
{
  uint32_t ADC_Mode;                      /*!< 选择工作模式,独立模式还是双ADC模式 */
  FunctionalState ADC_ScanConvMode;       /*!< 选择扫描模式或非扫描模式 */
  FunctionalState ADC_ContinuousConvMode; /*!< 单次转换还是连续转换 */
  uint32_t ADC_ExternalTrigConv;          /*!< 选择转换的触发源 */
  uint32_t ADC_DataAlign;                 /*!< 选择数据的对齐,左对齐或右对齐 */
  uint8_t ADC_NbrOfChannel;               /*!< 扫描模式下每一次转换的通道数 */
}ADC_InitTypeDef;

/* ADC_Mode */
ADC_Mode_Independen				// 独立模式
// 下面都是双ADC相关的工作模式
ADC_Mode_RegInjecSimult
ADC_Mode_RegSimult_AlterTrig
ADC_Mode_InjecSimult_FastInterl
ADC_Mode_InjecSimult_SlowInterl
ADC_Mode_InjecSimult
ADC_Mode_RegSimult
ADC_Mode_FastInterl
ADC_Mode_SlowInterl
ADC_Mode_AlterTrig
    
/* ADC_ScanConvMode */
ENABLE		// 扫描模式
DISABLE		// 非扫描模式
    
/* ADC_ContinuousConvMode */
ENABLE		// 连续转换模式
DISABLE		// 单次转换模式

/* ADC_ExternalTrigConv */
ADC_ExternalTrigConv_T1_CC1					// TIM1_CC1事件
    /*!< 适用于ADC1 和 ADC2 */
ADC_ExternalTrigConv_T1_CC2					// TIM1_CC2事件
    /*!< 适用于ADC1 和 ADC2 */
ADC_ExternalTrigConv_T2_CC2					// TIM2_CC2事件
    /*!< 适用于ADC1 和 ADC2 */
ADC_ExternalTrigConv_T3_TRGO				// TIM3_TRGO事件
    /*!< 适用于ADC1 和 ADC2 */
ADC_ExternalTrigConv_T4_CC4					// TIM4_CC4事件
    /*!< 适用于ADC1 和 ADC2 */
ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO		// EXTI线11/TIM8_TRGO事件
    /*!< 适用于ADC1 和 ADC2 */

ADC_ExternalTrigConv_T1_CC3					// TIM1_CC3事件
    /*!< 适用于ADC1, ADC2, ADC3 */
ADC_ExternalTrigConv_None					// 软件控制
    /*!< 适用于ADC1, ADC2, ADC3 */

ADC_ExternalTrigConv_T3_CC1					// TIM3_CC1事件
    /*!< 仅适用于ADC3 */
ADC_ExternalTrigConv_T2_CC3					// TIM2_CC3事件
    /*!< 仅适用于ADC3 */
ADC_ExternalTrigConv_T8_CC1					// TIM8_CC1事件
    /*!< 仅适用于ADC3 */
ADC_ExternalTrigConv_T8_TRGO				// TIM8_TRGO事件
    /*!< 仅适用于ADC3 */
ADC_ExternalTrigConv_T5_CC1					// TIM5_CC1事件
    /*!< 仅适用于ADC3 */
ADC_ExternalTrigConv_T5_CC3					// TIM5_CC3事件
    /*!< 仅适用于ADC3 */
    
/* ADC_DataAlign */
ADC_DataAlign_Right		// 数据右对齐
ADC_DataAlign_Left		// 数据左对齐

/* ADC_NbrOfChannel */
1~16

函数

// 配置ADCCLK分频器,对APB2的72MHz时钟选择2、4、6、8分频,输入到ADCCKL
void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);	// 该函数来自rcc.c文件中

// ADC恢复初始化配置
void ADC_DeInit(ADC_TypeDef* ADCx);

// 使用ADC_InitTypeDef结构体中的属性配置ADC
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);

// 使用默认值填充ADC_InitTypeDef结构体
void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);

// 启动或关闭ADC
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);

// 启动或关闭DMA
void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);

// ADC的中断输出控制
void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);

/* 用于控制校准的函数 */
// 复位校准寄存器
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软件触发转换
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

// ADC获取软件开始转换的状态,没啥用,一般不使用
FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx);

/* 配置间断模式的 */
// 每隔几个通道间断一次
void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number);
// 是否启动间断模式
void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

// ADC规则组通道配置
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);

// 是否允许外部触发转换
void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

// 获取AD转换的数据寄存器,读取转换结果的
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);

// 双ADC模式下读取转换结果
uint32_t ADC_GetDualModeConversionValue(void);

/* 配置注入组相关函数,Injected */
void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv);
void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx);
void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length);
void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset);
uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel);

/* 配置模拟看门狗的函数 */
// 是否启动模拟看门狗
void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);
// 配置看门狗的高低阈值
void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold);
// 配置看门的通道
void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);

// ADC温度传感器、内部参考电压控制。开启内部的两个通道
void ADC_TempSensorVrefintCmd(FunctionalState NewState);

// 获取转换完成标志位状态,判断转换是否完成。中断函数外使用
FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);

// 清除转换完成标志位。中断函数外使用
void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);

// 获取中断状态。中断函数中使用
ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT);

// 清除中断挂起位。中断函数中使用
void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT);

案例

AD单通道转换

使用的函数

// 配置ADCCLK分频器,对APB2的72MHz时钟选择2、4、6、8分频,输入到ADCCKL
void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);	// 该函数来自rcc.c文件中

// 使用ADC_InitTypeDef结构体中的属性配置ADC
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);

// 启动或关闭ADC
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);

// 复位校准寄存器
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软件触发转换
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

// ADC规则组通道配置
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);

// 获取AD转换的数据寄存器,读取转换结果的
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);

// 获取转换完成标志位状态,判断转换是否完成。中断函数外使用
FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);

// 清除转换完成标志位。中断函数外使用
void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);

接线图

在这里插入图片描述

示例代码

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Delay.h"

int16_t Speed;

int main()
{
	/* 开启ADC2和GPIOA的时钟 */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2 | RCC_APB2Periph_GPIOA, ENABLE);
	
	/* 初始化PA0 */
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;		// 模拟输入模式
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	// 对72MHz的PAB2时钟进行分频得到ADCCLK,其中ADCCLK最大频率为14MHz
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);	// 6分频
	
	// 规则组配置。PA0对应ADC2的通道0;通道0排在转换序列的第一位;采样、保持的时间55.5个ADC周期
	ADC_RegularChannelConfig(ADC2, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
	
	/* 初始化ADC2 */
	ADC_InitTypeDef ADC_InitStruct;
	ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;						// 连续转换
	ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;					// 数据右对齐
	ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	// 使用软件作为AD转换的触发源
	ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;						// ADC的工作模式为独立模式,ADC1和ADC2给干各的
	ADC_InitStruct.ADC_NbrOfChannel = 1;								// 每次转换有几个通道。只有在扫描模式下才有效
	ADC_InitStruct.ADC_ScanConvMode = DISABLE;							// 非扫描模式
	ADC_Init(ADC2, &ADC_InitStruct);
	
	// ADC2开始工作
	ADC_Cmd(ADC2, ENABLE);
	
	/* ADC校准 */
	ADC_ResetCalibration(ADC2);								// 复位ADC2的校准寄存器
	while (ADC_GetResetCalibrationStatus(ADC2) == SET);		// ADC2的校准寄存器是否复位完成。复位完成后返回RESET
	ADC_StartCalibration(ADC2);								// ADC2开始进行校准
	while (ADC_GetCalibrationStatus(ADC2) == SET);			// ADC2是否校准完成。校准完成后返回RESET
	
	// 对ADC2进行软件中断,由于是连续转换模式,所以只需要触发一次即可
	ADC_SoftwareStartConvCmd(ADC2, ENABLE);
	
	OLED_Init();
	while(1)
	{
		// AD的规则组是否转换完成,转换完成后返回SET
		while(ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC) == RESET);
		// ADC_GetConversionValue:读取转换结果。该函数就是直接读取DR寄存器,而读取DR寄存器时会自动清除EOC标志位,所以不用手动清除EOC
		OLED_ShowNum(1,1,ADC_GetConversionValue(ADC2), 5);
		Delay_s(1);
	}
}

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

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

相关文章

ElasticSearch精要

1、什么是ElasticSearch&#xff1a; Elasticsearch 是基于 Lucene 的 Restful 的分布式实时全文搜索引擎&#xff0c;每个字段都被索引并可被搜 索&#xff0c;可以快速存储、搜索、分析海量的数据。 集群&#xff1a;是一个或多个服务器的集合&#xff0c;共同保存数据并提供…

Assignment

1 Statement 里面包含了Expression。 对Statement 的interpret 里面包含了 对Expression 的interpret。 2 Expression 可以下降出Assignment 3 单个token前瞻递归下降解析器在解析完左侧操作数并偶然发现 之前&#xff0c;无法看清是否在解析赋值。毕竟&#xff0c;在解析完…

C语言补习课——文件篇

来源&#xff1a;黑马程序员 第157讲 C语言操作文件概述 读取文件&#xff1a;输入流 写文件&#xff1a;输出流 读写的方向判断取决与参照&#xff0c;一般我们站在程序的角度判断读写方向。 第158讲 路径 基本概念 路径就是指文件在电脑中的位置&#xff0c;eg&#xf…

下班后做小红书第7个月,涨粉7w,累计变现5w+,我只用到五个点

下班后做小红书第7个月&#xff0c;涨粉7w&#xff0c;累计变现5w&#xff0c;经常有粉丝问我怎么做博主&#xff0c;甚至想找我付&#x1f4b0;Z询&#xff0c;因为有大家才有我的今天&#xff0c;所以干货直接分享给大家~ 我能快速涨粉的秘籍&#xff0c;其实就是“抄”&…

有关采用parallelStream并行流处理List并使用自定义线程池和lettuce redis客户端一起使用的问题

在使用parallelStream进行处理list时&#xff0c;如不指定线程池&#xff0c;默认的并行度采用cpu核数进行并行&#xff0c;这里采用ForJoinPool来指定线程池&#xff0c;但循环中使用了luttuce 来获取redis的key时&#xff0c;出现没有控制住线程池的线程数问题。具体上代码。…

第二证券:如何选出即将暴涨的股票?

选出行将暴升的股票是一个复杂且风险较高的进程&#xff0c;由于股市的波动受多种要素影响&#xff0c;包含但不限于公司业绩、商场心情、微观经济环境、方针变化等。以下是一些可能有助于选出潜在暴升股票的方法和建议&#xff1a; 1、出现严重利好消息 当股票出现严重利好消…

Nginx文件服务器搭建

1、安装依赖、关闭防火墙 [rootlocalhost ~]# yum install wget gcc gcc-c pcre pcre-devel openssl openssl-devel zlib zlib-devel [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# systemctl disable firewalld 2、创建nginx启动用户 注意&#xff1a;会在…

Windows与linux中docker的安装与使用

windos中安装使用docker 下载Docker_Desktop 安装包进入docker官网下载Docker_Desktop&#xff1a; https://www.docker.com/启用wsl 我们搜索“启用或关闭Windows功能”&#xff0c;打开后勾选适用于Linux的Windows 子系统 Docker_Desktop设置 出现Docker Engine stopp…

vue3 el-tabs 和 el-dropdown 结合实现 tagsView 标签导航

大致思路 所谓 tagsView 可以分成两部分来去看&#xff1a; tagsview 那怎么分开看呢&#xff1f; 首先我们先来看 tags&#xff1a; 所谓 tgas 指的是&#xff1a;位于 appmain 之上的标签 那么现在我们忽略掉 view&#xff0c;现在只有一个要求&#xff1a; 在 view 之…

开源 AI 智能名片 S2B2C 商城小程序相关角色的探索

摘要&#xff1a;本文围绕开源 AI 智能名片 S2B2C 商城小程序的决策产品方向&#xff0c;基于两个原则展开研究。原则一是根据该产品方向尽可能多地寻找相关角色&#xff0c;原则二是以探索痛点而非销售为核心。同时确保识别出的角色覆盖价值使用者、价值传递者与价值生产者三类…

揭秘团购奇迹:如何在一个月内实现超过600万的盈利

你是否曾经对那些看似亏损的商业机会感到好奇&#xff0c;却意外地发现它们在短短一个月内能为你带来超过六百万的收益&#xff1f;这个令人震惊的数字&#xff0c;是否激起了你的好奇心和探索欲&#xff1f;如果你愿意深入了解我们今天要分享的内容&#xff0c;我坚信你也能找…

零基础小白能学网络安全吗?

最近看到很多朋友都在问“零基础能学网络安全吗&#xff1f;” 今天整一篇帮大家分析一下&#xff0c;希望对你有帮助。 首先&#xff0c;问出这个问题的朋友&#xff0c;我大致判断一下&#xff0c;你对网络安全并不了解&#xff0c;只是单纯看到某个视频某篇文章&#xff0…

想从事FPGA需要学好哪些知识?

想从事FPGA需要学好&#xff1a; 1、数字电路基础 2、微机原理&#xff0c;汇编语言&#xff08;推荐王克义老师的《微机原理&#xff08;第2版&#xff09;》&#xff09;或计算机体系结构或单片机原理&#xff1b; 3、C/C&#xff0b;&#xff0b;语言&#xff1b; 4、Ve…

免费且实用:UI设计常用的颜色参考网站和一些Icon设计网站

用心去分享&#xff01;请给我点个关注和点赞收藏&#xff01;谢谢各位努力的人才&#xff01; 1.在UI设计的时候&#xff0c;没有灵感&#xff0c;怎么办&#xff1f;可以参考这个网站&#xff08;需要魔法能量&#xff09; 网址如下&#xff1a; Color Hunt - Color Palette…

windows中多ping网络ICMP

之前没搞过ICMP,第一次弄&#xff0c;遇到好多坑&#xff0c;其中在接收ICMP消息时无法指定ip这个坑困扰了好久&#xff0c;最后在网上找到一种解决方法&#xff1b;直接看效果吧&#xff01;&#xff01; 其中我获取ip状态直接扔到线程池里面处理的 struct DevicePingMsg {D…

OpenAI新模型“Strawberry“蓄势待发:会思考的AI即将登场?

OpenAI新模型"Strawberry"蓄势待发&#xff1a;会思考的AI即将登场&#xff1f; OpenAI的神秘大模型"草莓"&#xff08;Strawberry&#xff0c;之前称为Q*&#xff09;可能要提早亮相了。这款AI不仅能思考&#xff0c;还可能彻底改变我们与人工智能互动的方…

果蔬识别系统性能优化之路(三)

目录 前情提要遗留问题 解决方案优化查询速度优化ivf初始化的速度 下一步 前情提要 果蔬识别系统性能优化之路&#xff08;二&#xff09; 遗留问题 优化同步速度&#xff0c;目前大约30秒&#xff0c;不是一个生产速度 这次来解决遗留问题 通过console&#xff0c;发现两个…

【F178】基于Springboot+vue实现的智能无人仓库管理

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 项目描述 互联网发展至今&#xff0c;无论是其理论还是技术都已经…

揭秘数据库性能飞跃的秘密:深入理解索引与执行计划的艺术

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

2024最新版超级全的Python基础知识

数据类型和变量 Python使用缩进来组织代码块,一般使用4个空格的缩进.使用#来注释一行,其他每一行都是一个语句,当语句以冒号:结尾时,缩进的语句视为代码块.Python对大小写敏感 1.1整数 Python可以处理任意大小的整数,包括负整数,写法与数学上写法一致,例如&#xff1a;-100.如…