ADC模数转换器概念函数及应用

news2025/4/21 15:22:37

ADC模数转换器概念函数及应用

文章目录

  • ADC模数转换器概念函数及应用
    • 1.ADC简介
    • 2.逐次逼近型ADC
      • 2.1逐次逼近型ADC
      • 2.2stm32逐次逼近型
      • 2.3ADC基本结构
      • 2.4十六个通道
    • 3.规则组的4种转换模式
      • 3.1单次转换,非扫描模式
      • 3.2连续转换,非扫描模式
      • 3.3单次转换,扫描模式
      • 3.4连续转换,扫描模式
    • 4.触发控制
    • 5.数据对齐
    • 6.转换时间
    • 7.校准(了解)
    • 8.硬件电路
    • 9.相关函数说明
      • RCC的函数
      • ADC的函数
      • 控制校准的函数
      • 软件触发的函数
      • 获取标志位状态
      • 配置间断模式
      • ADC规则组通道配置
      • ADC获取转换值
      • ADC注入组的配置(了解)
      • 模拟看门狗的配置
      • ADC温度传感器,内部电压控制
      • 标志位相关
    • 9.实操图
    • 10.AD单通道
      • 10.1接线图
      • 10.2代码编写
        • 10.2.1主程序main.c
        • 10.2.2函数定义AD.c
        • 10.2.3函数声明AD.h
    • 11.AD多通道
      • 11.1接线图
      • 11.2代码编写
        • 11.2.1主程序main.c
        • 11.2.2函数定义AD.c
        • 11.2.3函数声明AD.h
    • n.实现步骤
      • n.1ADC配置的步骤
      • n.2校准的4个步骤
    • n.实现步骤
      • n.1ADC配置的步骤
      • n.2校准的4个步骤

1.ADC简介

  • ADC(Analog-Digital Converter)模拟-数字转换器
  • ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁
  • 12位逐次逼近型ADC,1us转换时间
  • 输入电压范围:0~3.3V,转换结果范围:0~4095
  • 18个输入通道,可测量16个外部和2个内部信号源(16个外部就是16个GPIO口,2个内部信号源是内部温度传感器内部参考电压)
  • 规则组(常规使用)和注入组(用于突发事件)两个转换单元
  • 模拟看门狗自动监测输入电压范围
  • STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道

STM32主要是数字电路,数字电路只有高低电平,没有几v电压的概念

2.逐次逼近型ADC

2.1逐次逼近型ADC

逐次逼近型

2.2stm32逐次逼近型

stm32逐次逼近型

2.3ADC基本结构

ADC基本结构

2.4十六个通道

通道ADC1ADC2ADC3
通道0PA0PA0PA0
通道1PA1PA1PA1
通道2PA2PA2PA2
通道3PA3PA3PA3
通道4PA4PA4PF6
通道5PA5PA5PF7
通道6PA6PA6PF8
通道7PA7PA7PF9
通道8PB0PB0PF10
通道9PB1PB1
通道10PC0PC0PC0
通道11PC1PC1PC1
通道12PC2PC2PC2
通道13PC3PC3PC3
通道14PC4PC4
通道15PC5PC5
通道16温度传感器
通道17内部参考电压

3.规则组的4种转换模式

EOC在规则或注入通道组结束时设置,由软件清除或由读取ADC_DR时清除

3.1单次转换,非扫描模式

单次,非扫描

3.2连续转换,非扫描模式

连续,非扫描

3.3单次转换,扫描模式

单次,扫描

3.4连续转换,扫描模式

连续扫描

4.触发控制

触发控制

5.数据对齐

  • 数据右对齐

右对齐

  • 数据左对齐

左对齐

左对齐的作用:如果不想要右对齐那么高的分辨率,0~4095数太大了,可以选择左对齐将数据的高8位取出来,舍弃后面4位的精度,将12位的ADC退化为8位的ADC

6.转换时间

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

  • STM32 ADC的总转换时间为:

    TCONV = 采样时间 + 12.5个ADC周期

  • 例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期

    TCONV = 1.5 + 12.5 = 14个ADC周期 = 1μs

量化:ADC逐次比较的过程,位数越多时间越长,

采样时间:采样保持花费的时间,采样时间越长,越能避免一些毛刺信号的干扰

12.5个ADC周期:量化编码花费的时间,因为是12位的ADC,所以需要花费12个周期

ADC周期:就是从RCC分频过来的ADCCLK

14MHz:最大,最快的转换速度

7.校准(了解)

固定过程,了解即可

  • ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差
  • 建议在每次上电后执行一次校准
  • 启动校准前, ADC必须处于关电状态超过至少两个ADC时钟周期

8.硬件电路

硬件电路

9.相关函数说明

RCC的函数

void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);
  1. void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);配置ADCCLK预分频器,可以对APB2的72MHz时钟选择2、4、6、8分频,输入到ADCCLK

ADC的函数

void ADC_DeInit(ADC_TypeDef* ADCx);
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);
  1. void ADC_DeInit(ADC_TypeDef* ADCx);恢复缺省配置
  2. void **ADC_Init (ADC_TypeDef ADCx, ADC_InitTypeDef ADC_InitStruct);初始化
  3. void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);结构体初始化
  4. void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);给ADC上电的,就是开关控制
  5. void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);用于开启DMA输出信号,使用DMA转运数据,就得调用这个函数
  6. void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);中断输出控制,控制某个中断是否能通往NVIC

控制校准的函数

void ADC_ResetCalibration(ADC_TypeDef* ADCx);
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);
void ADC_StartCalibration(ADC_TypeDef* ADCx);
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);
  1. void ADC_ResetCalibration(ADC_TypeDef* ADCx);复位校准
  2. FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);获取复位校准状态
  3. void ADC_StartCalibration(ADC_TypeDef* ADCx);开始校准
  4. FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);获取开始校准状态

在ADC初始化后依次调用即可

软件触发的函数

void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx);//一般不会用到
  1. void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);用于软件触发的函数,设置SWSTART为1
  2. FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx);返回SWSTART的状态,与转换是否结束无关

获取标志位状态

FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
  1. FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);参数给EOC的标志位判断EOC标志位是不是置1

如何判断转换是否结束:

调用ADC_GetFlagStatus函数获取标志位状态,判断EOC标志位是不是置1了,如果转换结束,EOC标志位置1,然后调用这个函数判断标志位

配置间断模式

void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number);
void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  1. void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number);每隔几个通道间断一次
  2. 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);
  1. void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);给序列的每个位置填写指定通道,参数1ADCx,参数2ADC_Channel你想指定的通道,参数三Rank:序列几的位置(规则器中的序列),参数四SampleTime指定通道的采样时间(数值小的转换快,数值大的稳定)
void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

  1. void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);ADC外部触发转换控制,就是是否允许外部触发转换

ADC获取转换值

uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
uint32_t ADC_GetDualModeConversionValue(void);
  1. uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);就是获取AD转换的数据寄存器,读取转换结果就使用该函数
  2. uint32_t ADC_GetDualModeConversionValue(void);ADC获取双模式转换值,双ADC模式读取转换结果的函数

以上所有函数都是对ADC基本功能和规则组的配置

ADC注入组的配置(了解)

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);
  1. void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);是否启动模拟看门狗
  2. void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold);配置高低阈值
  3. voidADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);配置看门的通道

ADC温度传感器,内部电压控制

void ADC_TempSensorVrefintCmd(FunctionalState NewState);
  1. 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);
  1. FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);获取标志位状态
  2. void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);清楚标志位
  3. ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT);获取中断状态
  4. void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT);清除中断挂起位

9.实操图

实操图

10.AD单通道

10.1接线图

单通道

根据引脚定义表,PA0到PB1这10个引脚是ADC的10个通道,其他的引脚不是ADC引脚,不能接模拟电压

10.2代码编写

10.2.1主程序main.c
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "KEY.h"
#include "OLED.h"
//#include "OLED_Font.h"
#include "AD.h"

uint16_t AD_Value;
float Voltage;

int main(void){
	
	OLED_Init();
	AD_Init();
	OLED_ShowString(1,1,"ADValue:");
	OLED_ShowString(2,1,"Voltage:0.00V");
	while(1){
		AD_Value = ADC_GetValue();
		Voltage = (float)AD_Value/4095*3.3;
		OLED_ShowNum(1,9,AD_Value,4);
		//ADC值为整数,直接除不准确,所以需要强制类型转换,虽然还是有偏差
		OLED_ShowNum(2,9,Voltage,1);//显示整数部分
		OLED_ShowNum(2,11,(uint16_t)(Voltage*100)%100,2);//显示小数部分
		Delay_ms(100);
	}
}

10.2.2函数定义AD.c
#include "stm32f10x.h"                  // Device header

void AD_Init(void){
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//开启ADC时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
	//配置ADCCLK
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);//ADCCLK=72MHz/6=12MHz
	
	//GPIO初始化
	GPIO_InitTypeDef GPIO_InitStructure;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//防止干扰模拟电压
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	//配置规则组输入通道(ADC通道,通道,序列,采样时间参数)
	ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);//这里的ADCCLK的采样时间就是55.5个ADCCLK周期
	
	//ADC初始化
	ADC_InitTypeDef ADC_InitStructure;
	ADC_InitStructure.ADC_ContinuousConvMode =ENABLE;//连续转换模式,选择连续或单次转换
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据对齐
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//外部触发转换选择,对应框图的左下角,None不使用外部触发,使用软件触发
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//模式选择:独立模式
	ADC_InitStructure.ADC_NbrOfChannel = 1;//通道数目,一共扫描几个通道
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;//扫描转换模式
	ADC_Init(ADC1,&ADC_InitStructure);
	
	ADC_Cmd(ADC1,ENABLE);
	
	//校准
	ADC_ResetCalibration(ADC1);//复位校准
	while(ADC_GetResetCalibrationStatus(ADC1) == SET);//复位完成后系统会自动置为0
	ADC_StartCalibration(ADC1);//开始校准
	while(ADC_GetCalibrationStatus(ADC1)==SET);
	
}

//获取ADC值
uint16_t ADC_GetValue(void){
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件触发获取ADC值的函数
	//获取标志位状态
	while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);//等待时间:采样周期55.5,转换周期固定为12.5,55.5+12.5=68,76/6=12(6分频),(1/12)*68=5.6us
	return ADC_GetConversionValue(ADC1);
}

PCLK2就是APB2时钟的意思

AIN模式下,GPIO口是无效的,断开GPIO,防止GPIO口的输入输出对模拟电压造成干扰

10.2.3函数声明AD.h
#ifndef __AD_H
#define __AD_H

void AD_Init(void);
uint16_t ADC_GetValue(void);

#endif

11.AD多通道

11.1接线图

多通道

11.2代码编写

11.2.1主程序main.c
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "KEY.h"
#include "OLED.h"
//#include "OLED_Font.h"
#include "AD.h"

uint8_t AD0;
uint8_t AD1;
uint8_t AD2;
uint8_t AD3;

int main(void){
	
	OLED_Init();
	AD_Init();
	
	OLED_ShowString(1,1,"AD0:");
	OLED_ShowString(2,1,"AD1:");
	OLED_ShowString(3,1,"AD2:");
	OLED_ShowString(4,1,"AD3:");
	while(1){
		AD0 = ADC_GetValue(ADC_Channel_0);
		AD1 = ADC_GetValue(ADC_Channel_1);
		AD2 = ADC_GetValue(ADC_Channel_2);
		AD3 = ADC_GetValue(ADC_Channel_3);
		
		OLED_ShowNum(1,5,AD0,4);
		OLED_ShowNum(2,5,AD1,4);
		OLED_ShowNum(3,5,AD2,4);
		OLED_ShowNum(4,5,AD3,4);
		
		Delay_ms(100);
	}
}

11.2.2函数定义AD.c

主要是在获取AD值时对通道进行修改,实现动态单通道获取多个通道

#include "stm32f10x.h"                  // Device header

void AD_Init(void){
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//开启ADC时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
	//配置ADCCLK
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);//ADCCLK=72MHz/6=12MHz
	
	//GPIO初始化
	GPIO_InitTypeDef GPIO_InitStructure;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	
	
	//ADC初始化
	ADC_InitTypeDef ADC_InitStructure;
	ADC_InitStructure.ADC_ContinuousConvMode =ENABLE;
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
	ADC_InitStructure.ADC_NbrOfChannel = 1;
	ADC_InitStructure.ADC_ScanConvMode = DISABLE; 
	ADC_Init(ADC1,&ADC_InitStructure);
	
	ADC_Cmd(ADC1,ENABLE);
	
	//校准
	ADC_ResetCalibration(ADC1);
	while(ADC_GetResetCalibrationStatus(ADC1) == SET);
	ADC_StartCalibration(ADC1);
	while(ADC_GetCalibrationStatus(ADC1)==SET);
	
}

//获取ADC值
uint16_t ADC_GetValue(uint8_t ADC_Channel){
	//每次都重新指定通道,来实现多通道
	ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_55Cycles5);//使用参数来修改通道
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);
	//获取标志位状态
	while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
	return ADC_GetConversionValue(ADC1);
}

11.2.3函数声明AD.h
#ifndef __AD_H
#define __AD_H

void AD_Init(void);
uint16_t ADC_GetValue(uint8_t ADC_Channel);

#endif

n.实现步骤

n.1ADC配置的步骤

  1. 开启RCC时钟,包括ADC和GPIO的时钟,另外。ADCCLK的分频器时钟
  2. 配置GPIO,把需要的GPIO配置成模拟输入的模式
  3. 选择规则组的输入通道
  4. 配置多路开关,把左边的通道接入右边的规则组列表里
  5. 配置ADC转换器
  6. 开关控制,调用ADC_Cmd函数,开启ADC

n.2校准的4个步骤

调用4个函数即可

  1. 复位校准
  2. 等待校准完成
  3. 开始校准
  4. 等待校准完成
    e(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
    return ADC_GetConversionValue(ADC1);
    }

#### 11.2.3函数声明AD.h

```c
#ifndef __AD_H
#define __AD_H

void AD_Init(void);
uint16_t ADC_GetValue(uint8_t ADC_Channel);

#endif

n.实现步骤

n.1ADC配置的步骤

  1. 开启RCC时钟,包括ADC和GPIO的时钟,另外。ADCCLK的分频器时钟
  2. 配置GPIO,把需要的GPIO配置成模拟输入的模式
  3. 选择规则组的输入通道
  4. 配置多路开关,把左边的通道接入右边的规则组列表里
  5. 配置ADC转换器
  6. 开关控制,调用ADC_Cmd函数,开启ADC

n.2校准的4个步骤

调用4个函数即可

  1. 复位校准
  2. 等待校准完成
  3. 开始校准
  4. 等待校准完

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

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

相关文章

DFX(Design for eXcellence)架构设计全解析:理论、实战、案例与面试指南*

一、什么是 DFX ?为什么重要? DFX(Design for eXcellence,卓越设计)是一种面向产品全生命周期的设计理念,旨在确保产品在设计阶段就具备**良好的制造性(DFM)、可测试性(…

【LeetCode】152、乘积最大子数组

【LeetCode】152、乘积最大子数组 文章目录 一、dp1.1 dp1.2 简化代码 二、多语言解法 一、dp 1.1 dp 从前向后遍历, 当遍历到 nums[i] 时, 有如下三种情况 能得到最大值: 只使用 nums[i], 例如 [0.1, 0.3, 0.2, 100] 则 [100] 是最大值使用 max(nums[0…i-1]) * nums[i], 例…

《云夹:让书签管理变得轻松又高效》

在当今数字化的生活与工作场景中,我们畅游于网络的浩瀚海洋,每天都会邂逅各式各样有价值的网页内容。而如何妥善管理这些如繁星般的书签,使其能在我们需要时迅速被找到,已然成为众多网络使用者关注的焦点。云夹,作为一…

Microsoft Fabric - 尝试一下在pipeline中发送请求给web api(获取数据和更新数据)

1.简单介绍 Microsoft Fabric中的Pipeline支持很多种activity,分成数据转换和控制流两种类型的activitly。 这边将尝试一下发送web请求的activity,要做成的pipeline大概如下图所示, 上图中有4个Activity,作用如下 Web - 从一个…

数据完整性与约束的分类

一、引言 为什么需要约束?为了保证数据的完整性。 (1)数据完整性 数据完整性指的是数据的精确性和可靠性。 为了保证数据的完整性,SQL对表数据进行额外的条件限制,从以下四方面考虑: ①实体完整性&…

docker安装nacos2.x

本文为单机模式,非集群教程,埋坑 nacos2.x官方强制条件 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。 64 bit JDK 1.8 Maven 3.2.x 环境介绍 centos 7 maven 3.9.9 jdk 17 nacos 2.3.1 1. 拉取docker镜像 d…

GB/T28181 开源日记[8]:国标开发速知速会

服务端源代码 github.com/gowvp/gb28181 前端源代码 github.com/gowvp/gb28181_web 介绍 go wvp 是 Go 语言实现的开源 GB28181 解决方案,基于GB28181-2022标准实现的网络视频平台,支持 rtmp/rtsp,客户端支持网页版本和安卓 App。支持rts…

6 maven工具的使用、maven项目中使用日志

文章目录 前言一、maven:一款管理和构建java项目的工具1 基本概念2 maven的安装与配置(1)maven的安装(2)IDEA集成Maven配置当前项目工程设置 maven全局设置 (3)创建一个maven项目 3 pom.xml文件…

GB/T 43698-2024 《网络安全技术 软件供应链安全要求》标准解读

一、43698-2024标准图解 https://mmbiz.qpic.cn/sz_mmbiz_png/rwcfRwCticvgeBPR8TWIPywUP8nGp4IMFwwrxAHMZ9Enfp3wibNxnfichT5zs7rh2FxTZWMxz0je9TZSqQ0lNZ7lQ/640?wx_fmtpng&fromappmsg 标准在线预览: 国家标准|GB/T 43698-2024 相关标准: &a…

CF 278A.Circle Line

题目分析 输入n个数据作为路径,求从a到b的最短距离,需要将其相成一个圆圈,既可以从小往大走又可以从大往小走 思路分析 依然将数据存为数组,通过下标进行操作,既然说了有两种方式那就计算两种方式哪个更快就输出谁 代…

本地部署deepseek简单教程

部署deepseek,首先需要知道deepseek官网地址:DeepSeek 第一步:Ollama 去ollama下载对应的版本,我的电脑是window 在这里可以看到关于deepseek相关 第二步,下载完ollama无脑下一步就可以 这样属于安装成功 第三步&…

UnityShader学习笔记——多种光源

——内容源自唐老狮的shader课程 目录 1.光源类型 2.判断光源类型 2.1.在哪判断 2.2.如何判断 3.光照衰减 3.1.基本概念 3.2.unity中的光照衰减 3.3.光源空间变换矩阵 4.点光源衰减计算 5.聚光灯衰减计算 5.1.聚光灯的cookie(灯光遮罩) 5.2.聚…

电脑右下角小喇叭没反应怎么回事,快速解决方案

当电脑右下角的小喇叭(音量图标)没有反应时,可以尝试以下快速解决方案: 一、基础检查与操作 检查键盘音量键: 按下键盘上的音量增加或减少键,或尝试Fn音量键(部分笔记本需组合键)&a…

Mysql基于binlog主从同步配置

主配置: 修改配置文件:/etc/my.cnf 添加server-id1 重启MySQL服务:systemctl restart mysqld 创建用户并授权: mysql> create user rep192.168.79.% identified with mysql_native_password by 123456; Query OK, 0 rows aff…

Docker Desktop安装到其他盘

Docker Desktop 默认安装到c盘,占用空间太大了,想给安装到其他盘,网上找了半天的都不对 正确安装命令: start /w "" "Docker Desktop Installer.exe" install --installation-dirF:\docker命令执行成功&am…

NetCore Consul动态伸缩+Ocelot 网关 缓存 自定义缓存 + 限流、熔断、超时 等服务治理

网关 OcelotGeteway 网关 Ocelot配置文件 {//单地址多实例负载均衡Consul 实现动态伸缩"Routes": [{// 上游 》》 接受的请求//上游请求方法,可以设置特定的 HTTP 方法列表或设置空列表以允许其中任何方法"UpstreamHttpMethod": [ "Get", &quo…

ubuntu 本地部署deepseek r1 蒸馏模型

本文中的文件路径或网络代理需要根据自身环境自行删改 一、交互式chat页面 1.1 open-webui 交互窗口部署:基于docker安装,且支持联网搜索 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台,旨在完全离线操作。它支持各种 LLM…

go语言中的反射

为什么会引入反射 有时我们需要写一个函数,这个函数有能力统一处理各种值类型,而这些类型可能无法共享同一个接口,也可能布局未知,也有可能这个类型在我们设计函数时还不存在,这个时候我们就可以用到反射。 空接口可…

JUC学习笔记02

文章目录 JUC笔记2练习题:手写线程池代码解释:AdvancedThreadPool 类:WorkerThread 内部类:AdvancedThreadPoolExample 类: 线程池的思考CPU密集型IO密集型 练习题:手写自动重试机练习题:手写定…

【论文翻译】DeepSeek-V3论文翻译——DeepSeek-V3 Technical Report——第一部分:引言与模型架构

论文原文链接:DeepSeek-V3/DeepSeek_V3.pdf at main deepseek-ai/DeepSeek-V3 GitHub 特别声明,本文不做任何商业用途,仅作为个人学习相关论文的翻译记录。本文对原文内容直译,一切以论文原文内容为准,对原文作者表示…