stm32之ADC
目录
- 1.简介
- 2.逐次逼近型ADC
- 3.基本结构
- 4.输入通道
- 5.转换模式
- 6.触发控制
- 7.数据对齐
- 8.转换时间
- 7.校准
- 10.ADC外围电路
- 11.api和结构体
- 11.1 结构体
- 11.2 api
- 1. ADC_DeInit
- 2. ADC_Init
- 3. ADC_StructInit
- 4. ADC_Cmd
- 5. ADC_DMACmd
- 6. ADC_ITConfig
- 7. ADC_ResetCalibration
- 8. ADC_GetResetCalibrationStatus
- 9. ADC_StartCalibration
- 10. ADC_GetCalibrationStatus
- 11. ADC_SoftwareStartConvCmd
- 12. ADC_GetConversionValue
- 13. ADC_AnalogWatchdogCmd
- 14. ADC_GetDualModeConversionValue
- 15. ADC_AutoInjectedConvCmd
- 16. ADC_InjectedDiscModeCmd
- 17. ADC_ExternalTrigInjectedConvConfig
- 18. ADC_ExternalTrigInjectedConvCmd
- 19. ADC_SoftwareStartInjectedConvCmd
- 20. ADC_GetSoftwareStartInjectedConvCmdStatus
- 21. ADC_InjectedChannelConfig
- 22. ADC_InjectedSequencerLengthConfig
- 23. ADC_SetInjectedOffset
- 24. ADC_GetInjectedConversionValue
- 25. ADC_AnalogWatchdogCmd
- 26. ADC_AnalogWatchdogThresholdsConfig
- 27. ADC_AnalogWatchdogSingleChannelConfig
- 28. ADC_TempSensorVrefintCmd
- 29. ADC_GetFlagStatus
- 30. ADC_ClearFlag
- 12.实验
- 注意
- 12.1 AD单通道
- 12.2 AD多通道
1.简介
ADC(Analog-Digital Converter)模拟-数字转换器
ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁
12位逐次逼近型ADC,1us转换时间
输入电压范围:03.3V,转换结果范围:04095
18个输入通道,可测量16个外部和2个内部信号源
规则组和注入组两个转换单元
模拟看门狗自动监测输入电压范围
STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道
2.逐次逼近型ADC
先来讲一下ADC0809:
这是一个独立的8位逐次逼近型ADC芯片,在以前单片机不是很先进,所以需要外挂一个ADC转换芯片。
-
IN0~IN7是8路输入通道,通过对地址锁存和译码的ADDA、B、C进行输入就可以选择对应的INx输入通道,再对ALE输入一个锁存信号,就能将INx的通道开关给打开。地址锁存和译码和通道选择开关就构成了一个输入通道选择器的功能。而在STM32中的ADC是有18路输入通道的,所以就有个18路输入的多路开关。
-
选择好对应的输入通道后,怎么去知道其输入的电压对应的编码数据呢?? — 就得靠逐次逼近的方法去一一比较了。
-
- 比较器可以去判断两个输入电压的大小关系,一个电压来自输入通道的待测电压,一个电压来自DAC数模转换器而来( 通过SAR给DAC一个数据,就能将其转换为对应模拟信号(比较电压))。
- 那么怎么去知道待测电压对应的编码,这就需要SAR不断给DAC一个比较电压的编码,DAC转换为电压模拟信号和待测电压进行比较,类似二分查找的方法。第一次比较电压编码取中间值X,经过DAC转换为电压去和待测电压比较,如果大于待测电压,第二次比较电压编码值在0~X取中间值,经过DAC转换继续比较;如果大于待测电压,也是同理。
- 说白了就是二分查找一直找到和待测电压等近的编码值就是了,所以才叫逐次逼近型DAC。
-
START是输入开始转换信号的
-
CLOCK是ADC时钟,因为ADC是一步一步进行判断的,是需要时钟来推动这个过程。
-
**VREF+和VREF-**是DAC的参考电压,SAR给DAC的编码值对应多少V的电压,由这两个决定。通常是和Vcc和GND相连在一起的。
那么接下来可以看看stm32内部的ADC框图:
1. 模拟输入
- ADCx_IN0 ~ ADCx_IN15:这是 16 个模拟输入通道,每个通道可以连接到不同的模拟信号源。每个通道可以配置为常规通道或注入通道。
- 温度传感器:ADC 内部集成了温度传感器,可以检测芯片的温度。温度传感器的输出可以被 ADC 采样。
- 基准电压(VREF+ 和 VREF-):用于提供 ADC 的参考电压,决定了 ADC 的采样范围。
2. 模拟多路开关
- 模拟多路开关(Mux)用于选择 ADC 的输入信号。最多支持 4 个注入通道和 16 个常规通道,选择的通道会传递到 ADC 转换模块。
3. ADC 模块核心功能
-
常规通道和注入通道:ADC 支持两种通道类型:
-
- 常规通道用于定期采样,可用于普通信号的采集。
- 注入通道用于非定期采样,可以通过外部触发信号或软件触发,适合需要特别关注的信号采样。
-
数据寄存器:
-
- 注入通道数据寄存器:每个注入通道有一个 16 位寄存器用于存储采样结果。
- 常规通道数据寄存器:常规通道的数据会保存在一个 16 位的寄存器中。只能保存最后一个通道的输入数据,一般得配合DMA进行使用,防止结果未送出去就被下一个通道的数据给覆盖
4. 转换时钟与采样控制
-
ADCCLK:这是来自分频器的时钟信号,控制 ADC 的采样速率。ADCCLK 频率可以通过预分频器设置,以满足不同的采样速率要求。貌似只能设置6和8分频,其输入不能超过14MHz
-
转换控制:
-
- 常规通道和注入通道的转换可以通过硬件(外部触发)或软件触发启动。
- 支持连续转换模式和单次转换模式,允许灵活配置采样方式。
5. 触发控制
-
外部触发选择:
-
- EXTSEL:用于选择常规通道的外部触发源(如 TIM1_CH1、TIM3_TRGO 等),控制常规通道转换的启动。
- JEXTSEL:用于选择注入通道的外部触发源,控制注入通道转换的启动。
-
触发控制使能位:
-
- EXTTRIG:用于启用常规通道的外部触发信号。
- JEXTTRIG:用于启用注入通道的外部触发信号。
6. 模拟比较器和模拟看门狗
- 比较器:用于将采样值与设定的阈值进行比较。ADC 支持高/低阈值比较,可以用来检测信号是否超出预定范围。
- 模拟看门狗(AWD):当采样值超出设定的阈值范围时,触发 AWD 标志,并可通过 AWDIE 使能相应的中断,用于信号异常检测。
7. 中断与状态标志
-
转换完成标志:
-
- EOC(End Of Conversion):常规通道转换完成标志。
- JEOC(Injected End Of Conversion):注入通道转换完成标志。
- AWD(Analog Watchdog):模拟看门狗触发标志。
-
中断使能位:
-
- EOCIE:常规通道转换完成中断使能位。
- JEOCIE:注入通道转换完成中断使能位。
- AWDIE:模拟看门狗触发中断使能位。
-
这些标志位可以通过配置中断传递给 NVIC,从而触发中断服务例程处理相应的事件。
8. DMA 数据传输
- ADC 支持 DMA 数据流,可以在采样完成后自动将数据传输到内存中,而无需 CPU 干预,提高数据采集的效率。DMA 主要用于常规通道的数据传输。
描述了 ADC 模块的整体结构,包括信号输入、通道选择、触发控制、数据存储、状态监测和中断控制。通过多路开关选择输入信号,进行模数转换后,将采样数据存储到相应的寄存器中,并可通过中断和 DMA 机制实现数据采集和传输。
3.基本结构
以规则组,16个输入通道一次只能选一条进行AD转换然后输出到AD数据寄存器
4.输入通道
通道 | ADC1 | ADC2 | ADC3 |
---|---|---|---|
通道0 | PA0 | PA0 | PA0 |
通道1 | PA1 | PA1 | PA1 |
通道2 | PA2 | PA2 | PA2 |
通道3 | PA3 | PA3 | PA3 |
通道4 | PA4 | PA4 | PF6 |
通道5 | PA5 | PA5 | PF7 |
通道6 | PA6 | PA6 | PF8 |
通道7 | PA7 | PA7 | PF9 |
通道8 | PB0 | PB0 | PF10 |
通道9 | PB1 | PB1 | |
通道10 | PC0 | PC0 | PC0 |
通道11 | PC1 | PC1 | PC1 |
通道12 | PC2 | PC2 | PC2 |
通道13 | PC3 | PC3 | PC3 |
通道14 | PC4 | PC4 | |
通道15 | PC5 | PC5 | |
通道16 | 温度传感器 | ||
通道17 | 内部参考电压 |
5.转换模式
单次转换,非扫描模式:
在单次转换,非扫描模式下,ADC 只对一个通道执行一次转换并停止。这种模式适合采集单个信号源的数据,不需要多通道或连续采样。
工作流程
- 配置单个通道:指定一个通道,例如通道 1。
- 单次转换:启动后 ADC 对该通道进行一次转换。
- 转换完成后停止:转换完成后,ADC 停止工作,不再自动开始新一轮转换。
- 标志位:转换完成时,设置 EOC(End Of Conversion)标志,可以用于判断转换结束。
应用场景
- 单次测量:适合偶尔需要测量一个传感器的数据,且不需要连续采集,例如温度传感器的单次读数。
- 低功耗采样:在需要节省功耗的情况下,仅在必要时启动 ADC,获取一次采样值后停止。
连续转换,非扫描模式:
在连续转换,非扫描模式下,ADC 会对一个通道进行持续不断的连续转换。它适用于需要实时监测单个信号源的场景。
工作流程
-
配置单个通道:指定一个通道,例如通道 2。
-
连续转换:启动后 ADC 会对该通道不断执行转换操作,不间断地采集数据。
-
标志位和中断:
-
- 每次转换完成后会生成 EOC 标志,用于通知本次转换结束。
- 如果开启了 EOC 中断,转换完成时可以触发中断。
-
数据读取:在每次转换完成后,可以从数据寄存器中读取最新的转换值;如果不及时读取,新的值会覆盖上一个数据。
应用场景
- 实时信号监控:适合实时监控单个传感器的数据,比如电压、电流等,保证数据连续更新。
- 信号分析:适用于需要实时分析一个信号源的情况,例如单个通道上的波形信号监控。
单次转换,扫描模式:
在单次转换,扫描模式下,ADC 会对多个通道依次进行一次转换,然后停止。这种模式适合采集多个通道的瞬时值,但不需要连续采样。
工作流程
- 配置多通道:指定多个需要采样的通道(例如通道 1、通道 3 和通道 5)。
- 扫描转换:启动后,ADC 会按照通道序列依次对每个通道进行一次采样。
- 转换完成后停止:当所有通道都完成一次采样后,ADC 停止工作。
- 数据存储:每个通道的采样数据依次存入对应的寄存器或 FIFO 中。
- 标志位:完成所有通道转换后,设置 EOC 标志,表示本次多通道转换结束。
应用场景
- 多通道采样:适用于需要同时采样多个传感器的瞬时值,例如多个传感器的电压、电流值。
- 一次性数据获取:用于在某一特定时刻采集多路数据,而无需持续采集。
连续转换,扫描模式:
在连续转换,扫描模式下,ADC 会对多个通道进行循环、连续的采样,适合需要持续监测多个通道的场景。
工作流程
-
配置多通道:指定多个需要采样的通道(例如通道 1、通道 2 和通道 4)。
-
连续扫描转换:启动后,ADC 按照通道序列依次对每个通道进行采样,每一轮扫描完成后自动开始下一轮。
-
标志位和中断:
-
- 每次完成所有通道转换后,EOC 标志置位,表示本轮多通道采样结束。
- 可配置 EOC 中断,告知 CPU 每轮转换完成。
-
数据存储:每个通道的数据会依次存入 FIFO 或内存;结合 DMA 使用时,可将数据自动传输到内存。
应用场景
- 多通道实时监控:适合需要实时更新多个信号通道数据的应用,例如多传感器系统中的多路数据采集。
- 高效数据传输:可以结合 DMA 实现多通道数据自动存储,降低 CPU 负担,提高数据采集效率。
单次转换,非扫描模式:对一个通道采集一次数据,适合单次测量。
连续转换,非扫描模式:对一个通道连续采集,适合实时监控一个信号。
单次转换,扫描模式:对多个通道各采集一次数据,适合一次性采集多路数据。
连续转换,扫描模式:对多个通道进行循环采集,适合多通道的实时监控。
6.触发控制
7.数据对齐
需要注意的是模拟信号转换后的编码值要注意自己选择的是右对齐还是左对齐模式。如果是左对齐,其数据会比真实数据大16倍。
8.转换时间
AD转换是需要时间的,只不过这个时间是us级别,我们是感知不到。
AD转换的步骤:采样,保持,量化,编码。前两个成一组,后两个成一组
- 采样时间:用于对模拟信号采样的时间。在这段时间内,采样电容充电以获取精确的电压值。采样时间可以通过配置寄存器来设置,不同应用需要不同的采样时间。
- 转换时间:也称为保持和转换时间。STM32 的 ADC 采用 12 位分辨率,每次 A/D 转换需要 12.5 个 ADC 时钟周期来完成量化和编码的过程。
STM32 ADC的总转换时间为: TCONV = 采样时间 + 12.5个ADC周期
例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期 TCONV = 1.5 + 12.5 = 14个ADC周期 = 1μs
转换时间影响因素 :
- DCCLK 频率:ADCCLK 是 ADC 的工作时钟频率,通常是系统时钟(APB2)的分频。增大 ADC 时钟频率可以缩短转换时间,但可能会增加功耗和噪声。
- 采样时间设置:采样时间可根据输入信号的特性进行调整,通常可以选择 1.5、7.5、13.5、28.5、41.5、55.5、71.5、239.5 个周期。对于高速信号,可以选择较短的采样时间,而对于低频信号或高阻抗信号,选择较长的采样时间有助于提高精度。
不同采样时间的应用:
- 短采样时间:适合低阻抗的模拟信号和高速采样需求,可以提高采样速率。
- 长采样时间:适合高阻抗的输入信号,或者对采样精度要求高的场景。
7.校准
STM32 的 ADC 内置了一个自校准模式,用于提高 ADC 的转换精度。由于 ADC 内部电容器组的特性会随着温度、工艺差异等因素发生变化,这可能导致一定的准精度误差。校准可以有效地减小这些误差,提高转换结果的准确性。
自校准的过程
- 误差修正码计算:在校准过程中,ADC 会对内部电容器组的误差进行测量,并为每个电容器计算出一个误差修正码(数字值)。这个修正码会在之后的每次转换中自动用于补偿误差。
- 校准后的转换精度:通过修正码补偿,校准可以大幅度减小因电容器组变化引起的误差,使 ADC 在后续转换中的准确度更高。
校准的操作步骤
- ADC 断电:在启动校准之前,必须确保 ADC 处于关电状态(也就是关闭 ADC)。这通常是通过清除 ADC 控制寄存器(如
ADON
位)来实现。 - 等待两个 ADC 时钟周期:ADC 关闭后,需等待至少两个 ADC 时钟周期才能启动校准。这段延迟确保 ADC 内部状态稳定,准备好校准。
- 启动校准:在满足关电状态和延迟条件后,可以通过设置
CAL
位(通常在ADC_CR2
控制寄存器中)来启动校准过程。启动校准后,ADC 会自动进行误差修正码的计算。 - 等待校准完成:校准过程需要一定时间。在此期间,可以通过检查
CAL
位的状态来判断校准是否完成。当CAL
位清零时,表示校准已完成,ADC 可以开始正常的转换工作。
校准的建议
通常建议在每次上电后进行一次 ADC 校准,确保在不同环境条件下都能获得稳定的 ADC 准确性。校准只需在上电后执行一次,无需每次转换前都进行校准。
校准的注意事项
- 上电后校准:在系统每次上电后执行一次校准是较好的做法,因为上电后电路状态可能与断电前不同,校准可确保 ADC 保持最佳状态。
- 校准时间:校准过程耗时较短,但具体时间依赖于 ADC 时钟频率,通常只需几百微秒至数毫秒。
- 低功耗应用:对于要求低功耗的应用,校准时的短暂断电可能会影响整体电流消耗,需根据实际需求选择是否在每次启动时执行校准。
10.ADC外围电路
第一个是电位器产生可调电压的电路;
第二个是传感器输出电压的电路;
第三个是简单的电压转换电路。
11.api和结构体
11.1 结构体
typedef struct
{uint32_t ADC_Mode; /*!< Configures the ADC to operate in independent ordual mode. This parameter can be a value of @ref ADC_mode */FunctionalState ADC_ScanConvMode; /*!< Specifies whether the conversion is performed inScan (multichannels) or Single (one channel) mode.This parameter can be set to ENABLE or DISABLE */FunctionalState ADC_ContinuousConvMode; /*!< Specifies whether the conversion is performed inContinuous or Single mode.This parameter can be set to ENABLE or DISABLE. */uint32_t ADC_ExternalTrigConv; /*!< Defines the external trigger used to start the analogto digital conversion of regular channels. This parametercan be a value of @ref ADC_external_trigger_sources_for_regular_channels_conversion */uint32_t ADC_DataAlign; /*!< Specifies whether the ADC data alignment is left or right.This parameter can be a value of @ref ADC_data_align */uint8_t ADC_NbrOfChannel; /*!< Specifies the number of ADC channels that will be convertedusing the sequencer for regular channel group.This parameter must range from 1 to 16. */
}ADC_InitTypeDef;
\1. ADC_Mode
uint32_t ADC_Mode;
-
作用:指定 ADC 的工作模式(独立模式或双 ADC 模式)。
-
可选值:
-
ADC_Mode_Independent
: 独立模式(每个 ADC 独立工作,单独进行转换)。ADC_Mode_RegInjecSimult
: 规则组和注入组同时转换模式。ADC_Mode_RegSimult_AlterTrig
: 规则组同时转换 + 交替触发模式。ADC_Mode_InjecSimult_FastInterl
: 注入组同时转换 + 快速交错模式。ADC_Mode_InjecSimult_SlowInterl
: 注入组同时转换 + 慢速交错模式。ADC_Mode_FastInterl
: 快速交错模式。ADC_Mode_SlowInterl
: 慢速交错模式。ADC_Mode_AlterTrig
: 交替触发模式。
-
使用场景:配置单 ADC 工作模式或双 ADC 同步模式(如交错采样、同时采样等)。
-
示例:
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
\2. ADC_ScanConvMode
FunctionalState ADC_ScanConvMode;
-
作用:设置是否启用扫描模式。
-
- 扫描模式用于多通道采样(规则组),通过自动依次转换配置的多个通道。
-
可选值:
-
ENABLE
: 启用扫描模式(用于多通道)。DISABLE
: 禁用扫描模式(仅单通道转换)。
-
使用场景:当规则组中包含多个通道时,需启用扫描模式。
-
示例:
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
\3. ADC_ContinuousConvMode
FunctionalState ADC_ContinuousConvMode;
-
作用:设置是否启用连续转换模式。
-
- 启用后,ADC 在完成一次转换后会自动开始下一次转换,直到手动停止。
-
可选值:
-
ENABLE
: 启用连续转换模式。DISABLE
: 禁用连续转换模式(单次转换模式)。
-
使用场景:当需要连续采集信号时(如数据流监测)。
-
示例:
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
\4. ADC_ExternalTrigConv
uint32_t ADC_ExternalTrigConv;
-
作用:定义启动规则组转换的外部触发源。
-
可选值(外部触发信号来源):
-
ADC_ExternalTrigConv_T1_CC1
: TIM1 捕获比较 1。ADC_ExternalTrigConv_T1_CC2
: TIM1 捕获比较 2。ADC_ExternalTrigConv_T1_CC3
: TIM1 捕获比较 3。ADC_ExternalTrigConv_T2_CC2
: TIM2 捕获比较 2。ADC_ExternalTrigConv_T3_TRGO
: TIM3 更新事件。ADC_ExternalTrigConv_T4_CC4
: TIM4 捕获比较 4。ADC_ExternalTrigConv_Ext_IT11
: 外部中断线 11。ADC_ExternalTrigConv_None
: 禁用外部触发(软件触发)。
-
使用场景:当需要通过外部事件(如定时器或外部信号)触发 ADC 转换时。
-
示例:
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
\5. ADC_DataAlign
uint32_t ADC_DataAlign;
-
作用:指定 ADC 转换数据的对齐方式(左对齐或右对齐)。
-
可选值:
-
ADC_DataAlign_Right
: 数据右对齐。ADC_DataAlign_Left
: 数据左对齐。
-
说明:
-
- ADC 输出为 12 位数据,左对齐时,数据存储在高 12 位;右对齐时,数据存储在低 12 位。
-
使用场景:根据数据处理需求选择对齐方式(如方便移位操作时可用左对齐)。
-
示例:
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
\6. ADC_NbrOfChannel
uint8_t ADC_NbrOfChannel;
-
作用:指定规则组需要转换的通道数。
-
取值范围:1 到 16(最多支持 16 个通道)。
-
说明:
-
- 必须与规则组中配置的实际通道数量一致,否则会出现不可预测的行为。
- 通道的具体配置需通过函数
ADC_RegularChannelConfig()
逐一完成。
-
使用场景:规则组需要采集多个通道的数据时。
-
示例:
ADC_InitStructure.ADC_NbrOfChannel = 4; // 规则组包含 4 个通道
结构体初始化与使用示例
- 定义并初始化结构体:
ADC_InitTypeDef ADC_InitStructure;
- 设置初始化参数:
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; // 扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // 连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 3; // 规则组 3 个通道
- 调用初始化函数:
ADC_Init(ADC1, &ADC_InitStructure);
- 配置通道顺序和采样时间:
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_28Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_28Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_28Cycles5);
- 启动 ADC:
ADC_Cmd(ADC1, ENABLE); // 启用 ADC
ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 开始转换
11.2 api
具体的用法还是建议去参考库函数参考手册
1. ADC_DeInit
void ADC_DeInit(ADC_TypeDef* ADCx);
-
作用:将指定的 ADC 外设寄存器重置为默认值。
-
参数:
-
ADCx
: 指定要重置的 ADC 外设(ADC1
或ADC2
)。
-
使用场景:
-
- 在重新初始化 ADC 配置之前调用,确保寄存器处于初始状态。
-
使用方法:
ADC_DeInit(ADC1); // 将 ADC1 寄存器复位到默认值
2. ADC_Init
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
-
作用:初始化 ADC 的常规功能配置。
-
参数:
-
ADCx
: 要初始化的 ADC 外设。ADC_InitStruct
: 指向包含 ADC 配置参数的结构体。
-
使用场景:
-
- 配置 ADC 模式、数据对齐方式、扫描模式、触发源等。
-
结构体说明:
ADC_InitTypeDef
包括以下成员: -
ADC_Mode
: 模式选择(如单 ADC、双 ADC)。ADC_ScanConvMode
: 是否启用扫描模式。ADC_ContinuousConvMode
: 是否启用连续转换模式。ADC_ExternalTrigConv
: 外部触发选择。ADC_DataAlign
: 数据对齐(左对齐或右对齐)。ADC_NbrOfChannel
: 常规转换通道数。
-
使用方法:
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure); // 初始化 ADC1
3. ADC_StructInit
void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);
-
作用:初始化
ADC_InitTypeDef
结构体的默认值。 -
参数:
-
ADC_InitStruct
: 要初始化的结构体指针。
-
使用场景:
-
- 在用户手动配置之前调用,确保参数有合理的初始值。
-
使用方法:
ADC_InitTypeDef ADC_InitStructure;
ADC_StructInit(&ADC_InitStructure); // 初始化结构体为默认值
4. ADC_Cmd
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
-
作用:使能或禁用指定的 ADC 外设。
-
参数:
-
ADCx
: 要控制的 ADC 外设。NewState
: 设置为 ENABLE(使能)或 DISABLE(禁用)。
-
使用方法:
ADC_Cmd(ADC1, ENABLE); // 使能 ADC1
5. ADC_DMACmd
void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);
-
作用:使能或禁用 ADC 的 DMA 功能。
-
参数:
-
ADCx
: 要配置的 ADC 外设。NewState
: 设置为 ENABLE 或 DISABLE。
-
使用方法:
ADC_DMACmd(ADC1, ENABLE); // 使能 ADC1 的 DMA 功能
6. ADC_ITConfig
void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);
-
作用:配置 ADC 的中断。
-
参数:
-
ADCx
: 要配置的 ADC 外设。ADC_IT
: 指定中断类型(如ADC_IT_EOC
、ADC_IT_AWD
)。NewState
: ENABLE 或 DISABLE。
-
使用方法:
ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE); // 启用 ADC1 的转换结束中断
7. ADC_ResetCalibration
void ADC_ResetCalibration(ADC_TypeDef* ADCx);
-
作用:重置 ADC 的校准。
-
参数:
-
ADCx
: 要重置校准的 ADC 外设。
-
使用方法:
ADC_ResetCalibration(ADC1); // 重置 ADC1 的校准
8. ADC_GetResetCalibrationStatus
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);
-
作用:检查校准复位是否完成。
-
参数:
-
ADCx
: 要检查的 ADC 外设。
-
返回值:
-
SET
: 校准复位尚未完成。RESET
: 校准复位已完成。
-
使用方法:
while (ADC_GetResetCalibrationStatus(ADC1) == SET); // 等待复位完成
9. ADC_StartCalibration
void ADC_StartCalibration(ADC_TypeDef* ADCx);
-
作用:启动 ADC 的校准。
-
参数:
-
ADCx
: 要启动校准的 ADC 外设。
-
使用方法:
ADC_StartCalibration(ADC1); // 启动 ADC1 的校准
10. ADC_GetCalibrationStatus
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);
-
作用:检查校准是否完成。
-
返回值:
-
SET
: 校准尚未完成。RESET
: 校准已完成。
-
使用方法:
while (ADC_GetCalibrationStatus(ADC1) == SET); // 等待校准完成
11. ADC_SoftwareStartConvCmd
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
-
作用:启动 ADC 的软件触发转换。
-
参数:
-
ADCx
: 要触发转换的 ADC 外设。NewState
: ENABLE 或 DISABLE。
-
使用方法:
ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 软件触发 ADC1 的转换
12. ADC_GetConversionValue
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
-
作用:获取 ADC 转换后的值。
-
返回值:
-
- 转换后的 12 位数字值。
-
使用方法:
uint16_t adc_value = ADC_GetConversionValue(ADC1); // 获取 ADC1 的转换值
13. ADC_AnalogWatchdogCmd
void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);
-
作用:启用或禁用 ADC 模拟看门狗。
-
参数:
-
ADCx
: 要配置的 ADC 外设。ADC_AnalogWatchdog
: 配置看门狗的模式。
-
使用方法:
ADC_AnalogWatchdogCmd(ADC1, ADC_AnalogWatchdog_SingleRegEnable);
以下是对所有列出的 ADC 函数的详细说明,涵盖作用、参数、返回值及用法,帮助您全面理解每个函数如何工作以及它们在 STM32F101xx 上的使用方式。
14. ADC_GetDualModeConversionValue
uint32_t ADC_GetDualModeConversionValue(void);
-
作用:用于获取双 ADC 模式下的转换结果。
-
返回值:返回一个 32 位值,其中:
-
- 高 16 位是 ADC2 的转换结果。
- 低 16 位是 ADC1 的转换结果。
-
使用场景:
-
- 双模式采集数据时,使用该函数读取两路数据。
-
使用方法:
uint32_t dual_value = ADC_GetDualModeConversionValue();
uint16_t adc1_value = (uint16_t)(dual_value & 0xFFFF);
uint16_t adc2_value = (uint16_t)(dual_value >> 16);
15. ADC_AutoInjectedConvCmd
void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
-
作用:启用或禁用自动注入转换模式。
-
参数:
-
ADCx
: 指定的 ADC 外设。NewState
: 设置为 ENABLE 或 DISABLE。
-
说明:
-
- 当启用时,常规组转换完成后,会立即触发注入组的转换。
-
使用方法:
ADC_AutoInjectedConvCmd(ADC1, ENABLE); // 启用 ADC1 的自动注入模式
16. ADC_InjectedDiscModeCmd
void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
-
作用:启用或禁用注入组的不连续模式。
-
参数:
-
ADCx
: 指定的 ADC 外设。NewState
: 设置为 ENABLE 或 DISABLE。
-
说明:
-
- 当启用时,注入组的通道转换不连续进行。
-
使用方法:
ADC_InjectedDiscModeCmd(ADC1, ENABLE); // 启用注入组不连续模式
17. ADC_ExternalTrigInjectedConvConfig
void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv);
-
作用:配置注入组的外部触发源。
-
参数:
-
ADCx
: 指定的 ADC 外设。ADC_ExternalTrigInjecConv
: 外部触发源(如ADC_ExternalTrigInjecConv_T1_TRGO
)。
-
使用方法:
ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_T1_TRGO);
18. ADC_ExternalTrigInjectedConvCmd
void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
-
作用:启用或禁用注入组的外部触发功能。
-
参数:
-
ADCx
: 指定的 ADC 外设。NewState
: 设置为 ENABLE 或 DISABLE。
-
使用方法:
ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE); // 启用注入组外部触发
19. ADC_SoftwareStartInjectedConvCmd
void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
-
作用:启动注入组的软件触发转换。
-
参数:
-
ADCx
: 指定的 ADC 外设。NewState
: 设置为 ENABLE 或 DISABLE。
-
使用方法:
ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE); // 软件触发注入组转换
20. ADC_GetSoftwareStartInjectedConvCmdStatus
FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx);
-
作用:检查注入组的软件触发转换是否完成。
-
返回值:
-
SET
: 转换正在进行。RESET
: 转换已完成。
-
使用方法:
while (ADC_GetSoftwareStartInjectedConvCmdStatus(ADC1) == SET); // 等待注入组转换完成
21. ADC_InjectedChannelConfig
void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
-
作用:配置注入组的指定通道。
-
参数:
-
ADCx
: 指定的 ADC 外设。ADC_Channel
: 通道编号。Rank
: 通道在注入组中的顺序。ADC_SampleTime
: 采样时间。
-
使用方法:
ADC_InjectedChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_7Cycles5);
22. ADC_InjectedSequencerLengthConfig
void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length);
-
作用:配置注入组的通道序列长度。
-
参数:
-
ADCx
: 指定的 ADC 外设。Length
: 通道序列的长度(1 到 4)。
-
使用方法:
ADC_InjectedSequencerLengthConfig(ADC1, 2); // 设置注入组长度为 2
23. ADC_SetInjectedOffset
void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset);
-
作用:设置注入组指定通道的偏移值。
-
参数:
-
ADCx
: 指定的 ADC 外设。ADC_InjectedChannel
: 注入组通道编号。Offset
: 偏移值。
-
使用方法:
ADC_SetInjectedOffset(ADC1, 1, 0x100); // 为注入通道 1 设置偏移值
24. ADC_GetInjectedConversionValue
uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel);
- 作用:获取注入组指定通道的转换结果。
- 返回值:注入组通道的 12 位数字值。
- 使用方法:
uint16_t value = ADC_GetInjectedConversionValue(ADC1, 1); // 获取注入通道 1 的值
25. ADC_AnalogWatchdogCmd
void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);
-
作用:启用或禁用模拟看门狗。
-
参数:
-
ADCx
: 指定的 ADC 外设。ADC_AnalogWatchdog
: 看门狗模式。
-
使用方法:
ADC_AnalogWatchdogCmd(ADC1, ADC_AnalogWatchdog_SingleRegEnable);
26. ADC_AnalogWatchdogThresholdsConfig
void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold);
-
作用:配置看门狗的高、低阈值。
-
参数:
-
HighThreshold
: 高阈值。LowThreshold
: 低阈值。
-
使用方法:
ADC_AnalogWatchdogThresholdsConfig(ADC1, 3000, 1000);
27. ADC_AnalogWatchdogSingleChannelConfig
void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);
- 作用:为模拟看门狗指定监控通道。
- 使用方法:
ADC_AnalogWatchdogSingleChannelConfig(ADC1, ADC_Channel_1);
28. ADC_TempSensorVrefintCmd
void ADC_TempSensorVrefintCmd(FunctionalState NewState);
- 作用:启用或禁用温度传感器和内部参考电压测量。
- 使用方法:
ADC_TempSensorVrefintCmd(ENABLE); // 启用温度传感器和内部参考
29. ADC_GetFlagStatus
FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
- 作用:检查指定的ADC 标志状态。
- 返回值:
SET
或RESET
。 - 使用方法:
if (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == SET) {// 转换完成
}
30. ADC_ClearFlag
void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
- 作用:清除指定的 ADC 标志。
- 使用方法:
ADC_ClearFlag(ADC1, ADC_FLAG_EOC); // 清除转换完成标志
12.实验
注意
注意一定要配置ADC的时钟:RCC_ADCCLKConfig
函数,ADC的时钟好像最大不能超过14MHz
12.1 AD单通道
📎7-1 AD单通道.zip
User:
- 📎main.c
Hardware:
- 📎OLED.c📎OLED.h📎OLED_Font.h📎AD.h📎AD.c
12.2 AD多通道
📎7-2 AD多通道.zip
User:
- 📎main.c
Hardware:
- 📎OLED.c📎OLED.h📎OLED_Font.h📎AD.h📎AD.c
相关文章:
stm32之ADC
目录 1.简介2.逐次逼近型ADC3.基本结构4.输入通道5.转换模式6.触发控制7.数据对齐8.转换时间7.校准10.ADC外围电路11.api和结构体11.1 结构体11.2 api1. ADC_DeInit2. ADC_Init3. ADC_StructInit4. ADC_Cmd5. ADC_DMACmd6. ADC_ITConfig7. ADC_ResetCalibration8. ADC_GetReset…...
从电话到V信语音:一款App实现全场景社交脱身
作为一名资深社恐人士,我深知那些无法脱身的社交场合有多煎熬。上周参加一个行业聚会,面对滔滔不绝的陌生人,我如坐针毡却又找不到合适的离场理由。这时我突然想起之前朋友推荐的一款神器应用,它让我得以优雅脱身。今天就来分享这…...
conda init before conda activate
先conda init 然后退出命令窗口,再重新打开命令窗口再conda activate...
MySQL数据库高可用(MHA)详细方案与部署教程
一:MHA简介 核心功能 二:MHA工作原理 三:MHA组件 四:MHA 架构与工具 MHA架构 Manager关键工具 Node工具 五:工作原理与流程 1: 故障检测 2: 故障切换(Failover) 3 : 切换模式 六&a…...
《Python星球日记》 第44天: 线性回归与逻辑回归
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏:《Python星球日记》,限时特价订阅中ing 目录 一、引言:回归方法的重要性二、线性回归原理与损失函数1. 线性回归的数学模型2. 损失函数:衡量…...
Flutter TabBar / TabBarView 详解
目录 一、引言 二、基本用法 代码解析 三、主要属性 3.1 TabBar 3.2 TabBarView 四、进阶定制:突破默认样式 4.1 视觉样式深度定制 4.2 自定义指示器与标签 4.3 动态标签管理 五、工程实践关键技巧 5.1 性能优化方案 5.2 复杂手势处理 5.3 响应式布局…...
001 环境搭建
🦄 个人主页: 小米里的大麦-CSDN博客 🎏 所属专栏: Linux_小米里的大麦的博客-CSDN博客 🎁 GitHub主页: 小米里的大麦的 GitHub ⚙️ 操作环境: Visual Studio 2022 文章目录 Linux 环境搭建全解析:从历史到实践一、Linux 的起源与…...
Spark-core-RDD入门
RDD基本概念 Resilient Distributed Dataset 叫做弹性分布式数据集,是Spark中最基本的数据抽象,是分布式计算的实现载体,代表一个不可变,可分区,里面的元素并行计算的集合。 - Dataset: 一个数据集合&…...
在scala中,转换算子和行动算子有什么区别
在Scala结合Spark编程中,转换算子(Transformation)和行动算子(Action)有以下区别: 执行机制 **转换算子**: 具有惰性求值(延迟计算)特性 。它对RDD(弹性分布…...
六级阅读---2024.12 卷一 仔细阅读1
文章 Imagine youre an alien sent to Earth to document the behaviour of the mammals inhabiting the planet. You stumble into a movie theatre thats showing the latest Hollywood horror film. Several dozen humans are gathered together in a dark, undercoated r…...
驱动开发硬核特训 · 专题篇:Vivante GPU 与 DRM 图形显示体系全解析(i.MX8MP 平台实战)
视频教程请关注 B 站:“嵌入式Jerry”。 一、背景导读:GPU 与 DRM 到底谁负责“显示”? 在嵌入式 Linux 图形系统中,“画面怎么显示出来”的问题,表面看似简单,实则涉及多个内核子系统与用户态组件的协同&…...
智慧医疗时代下的医疗设备智能控费系统解决方案
—以科技赋能医疗控费,构建精细化管理新生态 一、行业背景与现存痛点 (一)政策驱动与行业挑战 随着DRG/DIP支付改革全面落地、医保基金监管趋严,医疗机构面临“提质增效”与“成本管控”的双重压力。国家卫健委数据显示&#x…...
软件设计师2025
笔记链接 第5章:软件工程基础知识 第6章:结构化开发方法 第10章:网络和信息安全基础知识...
Umi+React+Xrender+Hsf项目开发总结
一、菜单路由配置 1.umirc.ts 中的路由配置 .umirc.ts 文件是 UmiJS 框架中的一个配置文件,用于配置应用的全局设置,包括但不限于路由、插件、样式等。 import { defineConfig } from umi; import config from ./def/config;export default defineCon…...
【软件设计师:数据结构】1.数据结构基础(一)
一 线性表 1.线性表定义 线性表是n个元素的有限序列,通常记为(a1,a2,…,an)。 特点: 存在惟一的表头和表尾。除了表头外,表中的每一个元素均只有惟一的直接前驱。除了表尾外,表中的每一个元素均只有惟一的直接后继。2.线性表的存储结构 (1)顺序存储 是用一组地址连续…...
linux_进程地址空间(虚拟地址空间)
一、进程地址空间是什么? 先看这样一个具体的例子 #include<stdlib.h> #include <stdio.h> #include<unistd.h> int main() {int a1;pid_t idfork();while(1){if(id0){printf("i am child,pid:%d,ppid:%d,a:%d ,&a:%p\n",getpid(…...
计操第四章存储管理
地址再定位...
尚硅谷-硅谷甄选项目记录
一、Vue3 1 基础配置 1.1 路径别名 vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue// 引入path,node提供的模块,可以获取文件或文件夹的路径 import path from pathexport default defineConfig({plugins: […...
c# LINQ-Query01
文章目录 查询数据源标准查询分两类即时查询已推迟流式处理非流式处理分类表聚合Aggregate<TSource,TAccumulate,TResult>(IEnumerable<TSource>, TAccumulate, Func<TAccumulate,TSource,TAccumulate>, Func<TAccumulate,TResult>)Aggregate<TSour…...
Vue3渲染引擎:虚拟DOM与响应式原理
Vue3渲染引擎:虚拟DOM与响应式原理 在当今的前端开发中,Vue.js作为一种流行的JavaScript框架,经常被用来构建用户界面。而Vue.js 3作为其最新版本,在性能和功能上进行了许多优化和改进。其中,Vue3渲染引擎的核心原理—…...
[dify]官方模板DeepResearch工作流学习笔记
一、功能 根据用户输入的主题进行多轮搜索并生成综合报告 1、流程分析 1.1 初始阶段 Start节点:接收用户输入的"depth"参数,决定搜索的深度/轮数 参数可以不填,不填的时候取默认值3 Create Array节点:根据depth参数…...
大模型系列(四)--- GPT2: Language Models are Unsupervised Multitask Learners
论文链接: Language Models are Unsupervised Multitask Learners 点评: GPT-2采用了与GPT-1类似的架构,将参数规模增加到了15亿,并使用大规模的网页数据集WebText 进行训练。正如GPT-2 的论文所述,它旨在通过无监督语…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(15):何と どういう
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(15):何と &どういう 1、前言(1)情况说明(2)工程师的信仰 2、知识点(1)かもしれません & ~…...
基于英特尔 RealSense D455 结构光相机实现裂缝尺寸以及深度测量
目录 一,相机参数规格 二,结合YOLO实例分割实现裂缝尺寸以及深度测量 2.1 应用场景 2.2 实现流程 2.3 效果展示 2.4 精度验证 2.5 实物裂缝尺寸以及深度测量效果展示 一,相机参数规格 英特尔 RealSense D455 是英特尔 RealSense D400 系…...
利用并行处理提高LabVIEW程序执行速度
在 LabVIEW 编程中,提升程序执行速度是优化系统性能的关键,而并行处理技术则是实现这一目标的有力武器。通过合理运用并行处理,不仅能加快程序运行,还能增强系统的稳定性和响应能力。下面将结合实际案例,深入探讨如何利…...
C++并发编程完全指南:从基础到实践
在当今多核处理器普及的时代,充分利用硬件并发能力已成为高性能编程的关键。C11引入的现代并发编程支持使得开发者能够以标准化、可移植的方式编写多线程程序。本文将全面介绍C并发编程的各个方面,从基础概念到实际应用,帮助您掌握这一重要技…...
vue3 element-plus 输入框回车跳转页面问题处理
问题描述: 当页面搜索条件只有一个的情况下,输入框不管有没有值,回车后会跳转页面 解决办法,给表单添加 submit.prevent <el-form ref"ruleForm" :model"search" label-width"120px" class&qu…...
从0开始学习大模型--Day03--Agent规划与记忆
规划(planning) 规划,可以为理解观察和思考。如果用人类来类比,当我们接到一个任务,我们的思维模式可能会像下面这样: 1、首先会思考怎么完成这个任务。 2、然后会审视手头上所拥有的工具,以及如何使用这…...
DevExpressWinForms-AlertControl-使用教程
文章目录 AlertControl-使用教程一、将 AlertControl 添加到 Form二、编辑 AlertControl 的 HtmlTemplateHTML Template Editor介绍编辑HTML Template 三、使用AlertControl弹出AlertAlert中的按钮事件获取 Alert 标题等信息向Alert传递参数 总结源码 AlertControl-使用教程 一…...
配电站室智能巡检:机器人 VS 固定摄像头,谁更胜一筹?
在配电站室巡检领域,传统人工巡检正逐渐被智能化手段取代。其中,机器人巡检与固定摄像头巡检成为两大热门选择。那么,它们究竟谁更胜一筹? 一、机器人巡检与固定摄像头巡检的对比 目前人工巡检工作主要以查看表计,设…...
脑图谱:脑机接口的必由之路——技术突破与产业转化的系统性思考
一、三维发育小鼠大脑图谱框架(DevCCF) 1. 技术原理与核心创新 DevCCF框架由宾夕法尼亚州立大学团队主导开发,其技术突破体现在多模态数据融合与跨尺度分析能力的革新: 多模态成像整合:采用高分辨率MRI(空间分辨率50-100μm)捕捉全脑宏观结构动态变化,结合光片荧光显…...
【网络编程】二、UDP网络套接字编程详解
文章目录 前言Ⅰ. UDP服务端一、服务器创建流程二、创建套接字 -- socketsocket 属于什么类型的接口❓❓❓socket 是被谁调用的❓❓❓socket 底层做了什么❓❓❓和其函数返回值有没有什么关系❓❓❓三、绑定对应端口号、IP地址到套接字 -- bind四、数据的发送和接收 -- `sendto…...
缓存替换算法与存储器管理的分页、分段、段页式管理联系
缓存替换算法与存储器管理的分页、分段、段页式管理在目标和机制上存在相似性,均涉及高效资源分配和地址映射,但应用层级和具体场景不同。以下是它们的联系与区别分析: 1. 核心联系:资源管理的共性 替换策略的必要性 无论是缓存&a…...
AI大模型基础设施:NVIDIA GPU和AMD MI300系列的区别
本文将从架构设计、性能、内存、功耗、软件生态、价格与性价比、供应链与市场表现等多个维度对比英伟达的GPU(以H100为代表)和AMD的Instinct MI300系列处理器(以MI300X GPU和MI300A APU为主)。以下是详细分析: 1. 架构…...
基于Matlab实现耦合模理论仿真程序
耦合模理论(Coupled Mode Theory,简称CMT)是一种广泛应用于光子学、微波工程和电子学领域的理论框架,用于分析和理解多模系统的相互作用。 耦合模理论主要研究两个或多个模式之间的能量交换,这些模式可以是电磁波、声…...
图片文件转base64存储在数据库
以下是将文件转换为Base64编码字符串的Java代码: import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Base64;public class ImageToBase64 {/*** 将图片文件转换为Base64字符串* param filePath 图片文件路径* r…...
我的世界云端服务器具体是指什么?
我的世界云端服务器是指一种基于互联网的多人游戏服务器,将游戏服务器运行在云平台上,而不是在本地计算机中,这使用户不需要考虑自身电脑的性能和网络稳定性,只需要通过网络连接到云端服务器,就可以享受到顺畅的游戏体…...
shell脚本实现远程重启多个服务器
直接deepseek帮写脚本 remoteReboot.sh #!/bin/bash # 配置文件路径(格式:每行一个服务器地址) SERVER_FILE"servers.list" # 读取服务器列表 mapfile -t SERVERS < "$SERVER_FILE" for server in "${SERVER…...
怎样快速变换 json 串里的多层集合
有一个 2 层的 json 串,下层是多个动态的 key-value,不含集合 / 数组类型。 {"Games": {"key1": "value1", "key2": value2,"key3":value3}} 现在要把下层变换成多层的集合。 {"Games":…...
FreeCAD傻瓜教程-涡轮蜗杆的快速绘制FCGear工作台的使用方法
起因:涡轮蜗轴的组合,是一种比较简单且高效的传动结构。可以实现减速、加速、转动角度的放大、缩小等应用。 如何绘制呢?我搜索了不少教程,看起来都挺复杂的,对于小白来说有点像天书。这里介绍和记录一下利用FreeCAD 的…...
【论文阅读】HunyuanVideo: A Systematic Framework For Large Video Generative Models
HunyuanVideo: A Systematic Framework For Large Video Generative Models 原文摘要 研究背景与问题 视频生成的变革性影响:近期视频生成技术的进步深刻改变了个人生活与行业应用。 闭源模型的垄断:主流视频生成模型(如Runway Gen-3、Luma …...
Search After+PIT 解决ES深度分页问题
1.深分页和search after 原理 深分页 (from/size)search_after数据定位全局排序后跳过前 N 条基于上一页最后一条的排序值定位排序开销每次请求重新全局排序 (O(N))仅首次全局排序,后续游标跳转 (O(1))内存消耗堆内存存储完整结果集 (高风险OOM)无堆内存累积 (安全…...
c语法高阶—(联合体,枚举,位域,编译器,宏定义,条件编译,条件编译,头文件)
目录 一 联合体(重要) 特性 总结 二 枚举(重要) 特性 总结: 三 位域(了解) 定义 特性 使用场景 优缺点分析表 位域的特点和使用方法 总结: 四 编译器(linux…...
SQL Server To Paimon Demo by Flink standalone cluster mode
需求:使用 Flink CDC 测试 SQL Server 连接 Paimon 操作:启动 Flink standalone cluster 后,接着启动 Flink SQL Client,则通过 Flink SQL Client 提交 insert & select job 到该 8081 cluster Flink SQL Client 执行案例 -…...
常用设计模式在 Spring Boot 项目中的实战案例
引言 在当今的软件开发领域,Spring Boot 以其高效、便捷的特性成为构建 Java 应用程序的热门框架。而设计模式作为软件开发中的宝贵经验总结,能够显著提升代码的可维护性、可扩展性和可复用性。本文将深入探讨几种常用设计模式在 Spring Boot 项目中的…...
4、反应釜压力监控系统 - /自动化与控制组件/reaction-vessel-monitor
76个工业组件库示例汇总 反应釜压力监控组件 这是一个用于反应釜压力监控的自定义组件,专为化工厂反应釜压力监控设计。采用苹果工业风格界面,简洁优雅,功能实用,易于使用。 功能特点 实时压力可视化:直观展示反应…...
五、Hadoop集群部署:从零搭建三节点Hadoop环境(保姆级教程)
作者:IvanCodes 日期:2025年5月7日 专栏:Hadoop教程 前言: 想玩转大数据,Hadoop集群是绕不开的一道坎。很多小伙伴一看到集群部署就头大,各种配置、各种坑。别慌!这篇教程就是你的“救生圈”。 …...
详细剖析传输层协议(TCP和UDP)
详细讲解传输层的网络协议,为什么TCP是可靠连接协议,凭什么能做到不丢包,有哪些机制保证可靠呢? TCP/UDP UDPTCP**三次握手和四次挥手****滑动窗口****拥塞控制**(socket套接字)**listen的第二个参数** UD…...
ZYNQ移植FreeRTOS与OpenAMP双核开发实践指南
ZYNQ系列芯片凭借其“ARM处理器(PS)+ FPGA(PL)”的异构架构,在嵌入式系统中被广泛应用于高性能计算与实时控制场景。然而,如何高效利用其双核资源并实现实时操作系统(如FreeRTOS)的移植与双核通信,是开发者面临的关键挑战。本文将深入探讨FreeRTOS移植、双核固化启动以…...
VUE+ElementUI 使用el-input类型type=“number” 时,取消右边的上下箭头
项目场景: 提示:这里简述项目相关背景: 在项目中有时候需要输入框的type“number”,这个时候,输入框的右边就会出现两个按钮,这两个按钮可以递增/递减,但是这样输入框看上去就不太美观&#x…...