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

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

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 headervoid AD_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启ADC时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//配置ADCCLKRCC_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);//复位完成后系统会自动置为0ADC_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.6usreturn ADC_GetConversionValue(ADC1);
}

PCLK2就是APB2时钟的意思

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

10.2.3函数声明AD.h
#ifndef __AD_H
#define __AD_Hvoid 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 headervoid AD_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启ADC时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//配置ADCCLKRCC_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_Hvoid 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_Hvoid 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. 等待校准完

相关文章:

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

ADC模数转换器概念函数及应用 文章目录 ADC模数转换器概念函数及应用1.ADC简介2.逐次逼近型ADC2.1逐次逼近型ADC2.2stm32逐次逼近型2.3ADC基本结构2.4十六个通道 3.规则组的4种转换模式3.1单次转换,非扫描模式3.2连续转换,非扫描模式3.3单次转换&#xf…...

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], 例…...

Doris更新某一列数据完整教程

在Doris,要更新数据,并不像mysql等关系型数据库那样方便,可以用update set来直接更新某个列。在Doris只能进行有限的更新,官方文档如下: UPDATE - Apache Doris 1、使用Doris自带的Update功能 描述​ 该语句是为进行对数据进行更新的操作,UPDATE 语句目前仅支持 UNIQUE…...

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

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

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

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

Ruby:从宝石到编程语言的奇妙联系(中英双语)

Ruby:从宝石到编程语言的奇妙联系 在珠宝世界中,红宝石(Ruby)是一种象征热情、力量和高贵的珍贵宝石;而在编程世界中,Ruby则是一门灵活、优雅且富有创造力的编程语言。那么,这两者究竟有何联系…...

如何对java 源码进行分析, 统计出每个方法被引用的次数

使用 JavaParser 统计源码中每个方法的引用次数是一个可行且有效的方法。JavaParser 是一个用于解析 Java 源代码并生成抽象语法树(AST)的库,它提供了丰富的 API 来遍历和操作 AST。下面是一个详细的指南,说明如何使用 JavaParser…...

数据完整性与约束的分类

一、引言 为什么需要约束?为了保证数据的完整性。 (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…...

git代理设置

在 Git 中,可以通过以下命令查看当前设置的代理配置: 查看 HTTP 代理 git config --get http.proxy查看 HTTPS 代理 git config --get https.proxy查看全局代理设置 如果你设置了全局代理,可以通过以下命令查看: git config …...

python编程-内置函数bin(),bool(),abs() ,all(),any(),ascii(),max(),min() 详解

1、bin()函数用于将整数转换为其二进制字符串表示。并返回一个以0b开头的字符串,表示该整数的二进制形式。 # 十进制数转换为二进制字符串 decimal_number 42 binary_string bin(decimal_number) print(f"Decimal {decimal_number} is {binary_string} in b…...

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文件…...

js滚动到页面最底部

setTimeout(()> { //延后执行,等页面渲染结束let container document.querySelector(.raise-flag-content); //找到当前divif (container) {container.scrollTop container.scrollHeight - (container.clientHeight - 400 );}})container.scrollTop container…...

Node.js包管理工具npm

目录 什么是 npm npm 主要功能 安装配置 npm 环境 package.json 版本范围规则 使用 npm npm 版本和帮助命令 npm 包相关命令 安装包 卸载包 升级第三方包 升级自己开发的包 查看已安装的包 清除缓存和修复 package.json 相关 运行命令脚本 全局配置 npm 包发布…...

基本数据结构--平衡二叉搜索树之红黑树示例代码

红黑树的规则。红黑树的每个节点有颜色(红或黑),满足以下性质: 每个节点是红或黑。根节点是黑的。叶子节点(NIL节点)是黑的。红节点的子节点必须是黑的。从任一节点到其所有后代叶子节点的路径包含相同数量…...

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

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

Python内置函数map(), list(), len(), iter(), hex(), hash()的详细解析,包括功能、语法、示例及注意事项

1. map(function, iterable, ...) 功能:对可迭代对象中的每个元素应用指定函数,返回一个迭代器。 参数: function:要执行的函数(可以是lambda表达式)。 iterable:一个或多个可迭代对象&#x…...

CF 278A.Circle Line

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

DeepSeek模型构建与训练

在完成数据预处理之后,下一步就是构建和训练深度学习模型。DeepSeek提供了简洁而强大的API,使得模型构建和训练变得非常直观。无论是简单的全连接网络,还是复杂的卷积神经网络(CNN)或循环神经网络(RNN),DeepSeek都能轻松应对。本文将带你一步步构建一个深度学习模型,并…...

本地部署deepseek简单教程

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

3.1 可视化算子编程语言

HuggingFists的VO编程语言与常见的其它编程语言有一定的区别。其语言由两种不同的语法特征构成。一部分以可视化算子作为语法基础(简称:VO-O),辅助使用者可视化的完成数据处理/分析流程的编写;一部分采用表达式语法(简称:VO-E)&am…...

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…...

chrome-base 如何实现一个BindOnce

考虑一个问题: worker_thread.task_runner()->PostDelayedTask(FROM_HERE, base::BindOnce(&Ref::Foo, ref, 1), base::Milliseconds(1000)); BindOnce 是如何实现的呢? 翻看源码:base\functional\bind.h 写的 非常简洁 // Bind a…...

HTML学习之CSS三种引入方式

HTML学习之CSS三种引入方式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>…...

Mysql基于binlog主从同步配置

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

Docker Desktop安装到其他盘

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

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

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