AD7124-4 实测热电偶数据读取,电压精度到稳定到±1uV, 电压波动260nV, 温度精度到±0.01℃

AD7124-4 实测热电偶数据读取,电压精度到稳定到±1uV, 电压波动260nV, 温度精度到±0.01℃

  • AD7124_STM32_ADI官网例程
  • 使用stm32 和ad7124做温控调试,发现效果还是不错的,至少比ads1256的效果好多啦!
  • Chapter1 AD7124-4 实测热电偶数据读取,电压精度到稳定到±1uV, 电压波动260nV, 温度精度到±0.01℃
  • Chapter2 24Bit Σ-Δ ADC——AD7124的多通道初始化配置
    • 一、前言
    • 二、ADC寄存器介绍
      • 1. 配置寄存器
      • 2. 滤波寄存器
      • 3. 偏置寄存器
      • 4. 增益寄存器
      • 5. 诊断寄存器
    • 三、通道与CONFIG_x的映射
    • 四、实验数据
  • Chapter3 STM32的硬件SPI驱动AD7124的方法
    • 一、芯片介绍
    • 二、引脚排布
    • 三、时序图与驱动程序
      • 1. 芯片初始化
      • 2. SPI读写函数
      • 3. AD7124复位
      • AD7124读取ID
      • AD7124写入配置
      • 读取数据
    • 资料链接
  • Chapter4 AD7124的调试总结
    • AD7124芯片的调试闭坑总结
    • 1、SPI通讯速率尽量不要大于5M,但是实测,短线情况下9M通讯正常。
    • 2、SYNC引脚一定要拉高,拉低的话不转换。
    • 3、无法通过ADC_CONTROL寄存器控制内部基准
    • 4、注意选择参考电压
    • 5、REFOUT引脚,需要对地接一个0.1uF电容,否则会出问题。
    • 6、在初始化写入AD7124寄存器前,最好一定读一次状态寄存器,否则可能写入寄存器失败。
    • 7、测内部20mV信号时,请断开外部AI连接,否则可能AD芯片死机
    • 8、精度问题
    • 9、AD工作模式及校准
    • 10、REFIN(+) 与 REFIN(-)之差的范围是 1V到3.3V ,这个一定要注意,低于1V,芯片可能会不转换,这个问题折磨了我很久。
    • 11、在实际使用过程中,注意 AI通道的对AVSS的绝对电压范围
    • 12、电源问题:AVSS 与 IVSS ,最好单独供电,
    • 13、还是紧接着电源问题


AD7124_STM32_ADI官网例程

https://wiki.analog.com/resources/tools-software/product-support-software/ad7124-stm32

使用stm32 和ad7124做温控调试,发现效果还是不错的,至少比ads1256的效果好多啦!

原文链接:https://blog.csdn.net/zhengwenbang/article/details/133308700

Chapter1 AD7124-4 实测热电偶数据读取,电压精度到稳定到±1uV, 电压波动260nV, 温度精度到±0.01℃

CH0 CH1两通连续转换模式,PGA 64: SPS: 8.89 使用快速建立模式, Sinc3 + Sinc1
(偏置与增益寄存器均使用原厂默认参数,这2个寄存器未配置)
CH0(AIN0 AIN1)对应 CONFIG0 CH1(AIN2 AIN3)对应CONFIG1。 两个通道均是双极性配置,AIN0上使能了内部偏置电压。(为了热电偶应用)

当然,要让ADC运行稳定 首先硬件上ADC电路,供电电路要稳定,AD7124-4我是自己针对客户应用的做的隔离模块。AD7124 SPI通讯使用隔离SPI芯片。

ADC的电源 是这样。 ADDC+DCDC隔离模块B0505+LDO最终到3.3V, 还有其它包括不限于 共模滤波 三端滤波器 等等。高精度外部2.5V参考电压源。
ACDC:是从市电转成5V
DCDC隔离模块用的B0505。5V转成隔离5V 专供ADC模块。
LDO:RTQ2520GQW(这个不好买,建议用其它的超低噪声LDO): 隔离后5V再降压成3.3V专供AD7124

///AD7124多通道连续转换模式初始化
///1对1映射
void Ad7124_Multichannel_Continuous_Conversion_Init( void )
{///uint32_t temp_32bit=0;Ad7124_Sofe_Reset();  ///上电后一定要复位,否则ADC会运行异常。uint8_t temp[2]={0XFF,0XFF};vTaskDelay( 100 );Ad7124_Read_Regs( Ad7124Regs[AD7124_ID_REG].addr, temp, Ad7124Regs[AD7124_ID_REG].size );temp[0]&=0XF0; ///去掉低4位才是DEVICE_ID if( temp[0] == AD7124_DEVICE_ID ){DBG_PRINTF( "ad7124 read Id ok\r\n" );}else{DBG_PRINTF( "ad7124 read Id ERROR\r\n" );}vTaskDelay( 100 );Read_Ad7124_State_Reg(); ///上电后要先读取一次状态寄存器 vTaskDelay( 100 );///写AD7124 控制寄存器  ///连续转换  AD7124_ADC_CTRL_REG_DATA_STATUSAd7124Regs[AD7124_ADC_CTRL_REG].value=AD7124_ADC_CTRL_REG_DATA_STATUS |AD7124_ADC_CTRL_REG_DOUT_RDY_DEL| AD7124_ADC_CTRL_REG_REF_EN | AD7124_ADC_CTRL_REG_POWER_MODE( CTRL_FULL_POWER )\| AD7124_ADC_CTRL_REG_MODE( CTRL_CONTINUOUS_CONVERSION_MODE ) | AD7124_ADC_CTRL_REG_CLK_SEL( 0 );Ad7124_Write_Regs( AD7124_ADC_CTRL_REG, Ad7124Regs[AD7124_ADC_CTRL_REG].value,Ad7124Regs[AD7124_ADC_CTRL_REG].size );///写AD7124 通道0寄存器,0号通道开启Ad7124_Write_Regs( AD7124_CH0_MAP_REG, AD7124_CH_MAP_REG_CH_ENABLE\| AD7124_CH_MAP_REG_SETUP( CH_SETUP0 ) | AD7124_CH_MAP_REG_AINP( CH_AIN0 ) | AD7124_CH_MAP_REG_AINM( CH_AIN1 ), SIZE_BYTE2 );///写AD7124 通道1寄存器Ad7124_Write_Regs( AD7124_CH1_MAP_REG, AD7124_CH_MAP_REG_CH_ENABLE \| AD7124_CH_MAP_REG_SETUP( CH_SETUP1 ) | AD7124_CH_MAP_REG_AINP( CH_AIN2 ) | AD7124_CH_MAP_REG_AINM( CH_AIN3 ), SIZE_BYTE2 );///写AD7124 配置1寄存器   64 ±39.06 mVAd7124_Write_Regs( AD7124_CFG0_REG, AD7124_CFG_REG_BIPOLAR \| AD7124_CFG_REG_AIN_BUFP | AD7124_CFG_REG_AINN_BUFM \| AD7124_CFG_REG_REF_SEL( CFG_REF_REFIN1 ) | AD7124_CFG_REG_PGA( CFG_PGA_64 ), SIZE_BYTE2 );///写AD7124 配置2寄存器  64 ±39.06 mV///双极性 | 打开ADC+缓冲  | 打开ADC-缓冲 | REF_SEL(x) x=2 外部REF1基准 | REG_PGA(AD7124_PGA_64) 6对应增益64(±39.06mV)Ad7124_Write_Regs( AD7124_CFG1_REG, AD7124_CFG_REG_BIPOLAR| AD7124_CFG_REG_AIN_BUFP | AD7124_CFG_REG_AINN_BUFM \| AD7124_CFG_REG_REF_SEL( CFG_REF_REFIN1 ) | AD7124_CFG_REG_PGA( CFG_PGA_64 ), SIZE_BYTE2 );///写AD7124 滤波寄存器0  sinc3+SIN1 快速模式  120  8.89Hz 以16为基数计算均值)Ad7124_Write_Regs( AD7124_FILT0_REG, AD7124_FILT_REG_FILTER( FILT_FILTER_SINC3_SIN1 )\| AD7124_FILT_REG_REJ60 | AD7124_FILT_REG_POST_FILTER( 0 ) | AD7124_FILT_REG_FS( 120 ), SIZE_BYTE3 );///写AD7124 滤波寄存器1 sinc3+SIN1 快速模式 120  8.89Hz 以16为基数计算均值)Ad7124_Write_Regs( AD7124_FILT1_REG, AD7124_FILT_REG_FILTER( FILT_FILTER_SINC3_SIN1 )\| AD7124_FILT_REG_REJ60 | AD7124_FILT_REG_POST_FILTER( 0 ) | AD7124_FILT_REG_FS( 120 ), SIZE_BYTE3 );Ad7124_Write_Regs( AD7124_IO_CTRL2_REG, AD7124_IO_CTRL2_REG_GPIO_VBIAS0, Ad7124Regs[AD7124_IO_CTRL2_REG].size ); 
}

因终端客户保密,发不了全部代码头文件及宏定义(这些宏定义就是寄存器配置参数值,请自行参考手册)。AD7124寄存器读写寄存用 STM32硬件SPI读取

实测K热电偶电压读取。 uV小数点后面丢弃。电压稳定在±1uV
在这里插入图片描述
转换成K热电偶温度,温度稳定在±0.01℃
在这里插入图片描述
实测 uV小数量点后面3位 ,实测数据波动 260nV. 与手册所写Sinc3 + Sinc1滤波器 SPS8.89配置 噪声0.036(RMS)X6.6=0.2376uV 结果比较接近。(当然用ADC自行读取,比不上示波器更精准)
在这里插入图片描述
在这里插入图片描述

Chapter2 24Bit Σ-Δ ADC——AD7124的多通道初始化配置

原文链接:https://blog.csdn.net/m0_46369352/article/details/127381641

一、前言

AD7124是目前常用的一种24位ADC,在全功率模式、9.4SPS的速率、gain = 128的状态运行,均方根(rms)可达到23nV;信号误差在±10uV左右,单片价格在¥135~150,对于测控仪器中采集芯片的选型来说,该芯片价位处于中端层面,性价比较高。
AD7124的引脚排布、硬件SPI的驱动方式我已经在上一篇文章发布过,这里不再做过多赘述,链接如下:

使用stm32的硬件SPI驱动AD7124的方法

二、ADC寄存器介绍

首先介绍一下AD7124几个常用寄存器的基本功能。我们以AD7124-4BRUZ为例,它有8个独立的设置,每个设置都包含了如下寄存器:

配置寄存器(Configuration register)
滤波寄存器(Filter register)
偏置寄存器(Offset register)
增益寄存器(Gain register)

1. 配置寄存器

配置寄存器允许用户选择ADC设置为双极性或单极性模式时的输出编码。
在双极性模式下,ADC可以采集到负电压,输出编码为偏移二进制(offset binary),采集范围是-VREF/gain ~ +VREF/gain
在单极性模式下,ADC只能采集正电压,输出编码为标准二进制(straight binary),采集范围是0 ~ +VREF/gain
在这两种情况下, 输入电压必须包含AVDD和AVSS。用户可以使用这些寄存器选择参考源,四个选项都是可用的:
1个内部2.5V参考源、1个连接REFIN1(+)和REFIN1(-)的外部参考源、1个连接REFIN2(+)和REFIN2(-)的外部参考源或以AVDD-AVSS作为参考。PGA提供了1、2、4、8、16、32、64和128倍增益。模拟输入缓存(buffer)和参考输入缓存都可以用寄存器使能。
下图为滤波寄存器0的寄存器位,Bit[15:12]是保留位,默认0;Bit11 =0为单极性,为1双极性;

在这里插入图片描述

2. 滤波寄存器

是一个24bit寄存器,滤波寄存器下选为数字滤波器被用于ADC调制器的输出。滤波器型号和数据输出速率在设置寄存器位时被选择。
最高3位是滤波器组数,可以用000-111代表Filter0-7;REJ60为60Hz开启数字抑制器位,写1开启,默认为50Hz抑制器;高8位的Bit[3:1]设置前置滤波器,Bit0为1开启单循环;中8位的Bit[7:4]为保留位,默认0,FS[10:8]至FS[7:0]是过滤器寄存器中要写进去的的十进制数,可以从1到2047。
在这里插入图片描述

不同的设置会影响输出数据速率、处理时间。

3. 偏置寄存器

增益寄存器是保持ADC增益校准系数的24位寄存器。增益寄存器是读/写寄存器。在gain=1时增益系数被校准;因此,默认值因设备而异。如果一个内部或系统全范围校准被用户初始化,默认值被自动覆写。更多信息,请看偏置滤波器部分。

在这里插入图片描述

4. 增益寄存器

AD7124-4有八个增益寄存器,从GAIN_0到GAIN_7。每个增益寄存器都与一个设置相关联,GAIN_x与设置x相关联。增益寄存器是24位寄存器,并保存ADC的满量程校准系数。AD7124-4的出厂校准增益为1。增益寄存器在上电和复位后包含这个工厂生成的值。
增益寄存器是读/写寄存器。
然而,当写入寄存器时,ADC必须处于待机模式或空闲模式。如果用户发起内部或系统满量程校准,则默认值将自动覆盖
或者写入满量程寄存器。
在这里插入图片描述

5. 诊断寄存器

又叫ERROR Registers,ERROR_EN寄存器可以使能或失能AD7124的众多诊断程序。默认下,SPI_IGNORE功能是使能的,这个位可以指示写ADC时不恰当的次数(例如,在上电和复位期间)其他诊断包括:

SPI读和写检查,确保只有合法的寄存器才能被访问
SCLK计数器,确保正确的SCLK脉冲数被使用
SCLK CRC校验
内存分布 CRC校验
LDO检查
当一个诊断被使能,在错误寄存器内包含相应的标志位。所有的使能标志位在状态寄存器内被命令去控制ERR flag。因此,如果发生一个错误(例如,SPI CRC校验检测到1个错误),在错误寄存器中有关的标志位会被设置(例如SPI_CRC_ERR标志位)。在状态寄存器中ERR标志位总是被置位的。ERR位表示是否发生错误。用户可以读取错误寄存器以获得关于错误源的更多信息。
在这里插入图片描述

三、通道与CONFIG_x的映射

图70是ADC配置寄存器与滤波、增益和偏置寄存器的关系,按照逻辑来说需要一步步地去配置,且他们之间存在几种不同的对应关系,不同的配置组合会对采样造成不同的影响,首先我们需要理解配置的灵活性(Flexibility)。
在这里插入图片描述
多对1映射
图71展示了CH0~CH3的通道配置,被称为Single Setup用灰色字体显示的寄存器暂时用不上。这4个差分通道均采用同一组配置寄存器,CONFIG_0的配置被4个通道共用。
Single Setup适合单通道采集,若不同的通道均采集同一范围的信号,也适用Single Setup。
在这里插入图片描述
下列代码展示了如何配置Single Setup:

void AD7124_Multiple_INIT(uint8_t SamHz)//多通道初始化函数
{AD7124_Reset();AD_Delay(500);//写AD7124 控制寄存器AD7124_Write_Reg(AD7124_ADC_CTRL_REG,2,AD7124_ADC_CTRL_REG_REF_EN | AD7124_ADC_CTRL_REG_POWER_MODE(3) | AD7124_ADC_CTRL_REG_MODE(0) | AD7124_ADC_CTRL_REG_CLK_SEL(0) | AD7124_ADC_CTRL_REG_CS_EN);AD7124_Write_Reg(AD7124_CH0_MAP_REG,2,AD7124_CH_MAP_REG_CH_DISABLE | AD7124_CH_MAP_REG_SETUP(0) | AD7124_CH_MAP_REG_AINP(0) | AD7124_CH_MAP_REG_AINM(1));	AD7124_Write_Reg(AD7124_CH1_MAP_REG,2,AD7124_CH_MAP_REG_CH_ENABLE | AD7124_CH_MAP_REG_SETUP(0) | AD7124_CH_MAP_REG_AINP(2) | AD7124_CH_MAP_REG_AINM(3));	AD7124_Write_Reg(AD7124_CH2_MAP_REG,2,AD7124_CH_MAP_REG_CH_ENABLE | AD7124_CH_MAP_REG_SETUP(0) | AD7124_CH_MAP_REG_AINP(4) | AD7124_CH_MAP_REG_AINM(5));	AD7124_Write_Reg(AD7124_CH3_MAP_REG,2,AD7124_CH_MAP_REG_CH_ENABLE | AD7124_CH_MAP_REG_SETUP(0) | AD7124_CH_MAP_REG_AINP(6) | AD7124_CH_MAP_REG_AINM(7));	//写AD7124 配置0寄存器AD7124_Write_Reg(AD7124_CFG0_REG,2,AD7124_CFG_REG_UNIPOLAR | AD7124_CFG_REG_AIN_BUFP | AD7124_CFG_REG_AINN_BUFM | AD7124_CFG_REG_REF_SEL(2) | \AD7124_CFG_REG_PGA(7));	//单极性 | 打开ADC+缓冲  | 打开ADC-缓冲 | REF_SEL(x) x=0 REFIN1(+)/REFIN1(-) x=1 REFIN2(+)/REFIN2(-) x=2 内部基准电压源 x=3 AVDD//REG_PGA(x) 0-7对应增益1(±2.5V) 2(±1.25V) 4(± 625mV ) 8(±312.5 mV ) 16(±156.25 mV) 32(±78.125 mV) 64(±39.06mV) 128(±19.53mV)Samprate=SamHz;switch(SamHz){case Samprate_2Hz:AD7124_Write_Reg(AD7124_FILT0_REG,3,AD7124_FILT_REG_FILTER(0) | AD7124_FILT_REG_REJ60 | \AD7124_FILT_REG_POST_FILTER(0) | AD7124_FILT_REG_FS(384));break;case Samprate_5Hz:AD7124_Write_Reg(AD7124_FILT0_REG,3,AD7124_FILT_REG_FILTER(0) | AD7124_FILT_REG_REJ60 | \AD7124_FILT_REG_POST_FILTER(0) | AD7124_FILT_REG_FS(200));break;case Samprate_10Hz:AD7124_Write_Reg(AD7124_FILT0_REG,3,AD7124_FILT_REG_FILTER(0) | AD7124_FILT_REG_REJ60 | \AD7124_FILT_REG_POST_FILTER(0) | AD7124_FILT_REG_FS(100));break;case Samprate_20Hz:AD7124_Write_Reg(AD7124_FILT0_REG,3,AD7124_FILT_REG_FILTER(0) | AD7124_FILT_REG_REJ60 | \AD7124_FILT_REG_POST_FILTER(0) | AD7124_FILT_REG_FS(50));break;case Samprate_50Hz:AD7124_Write_Reg(AD7124_FILT0_REG,3,AD7124_FILT_REG_FILTER(0) | AD7124_FILT_REG_REJ60 | \AD7124_FILT_REG_POST_FILTER(0) | AD7124_FILT_REG_FS(22));break;case Samprate_100Hz:AD7124_Write_Reg(AD7124_FILT0_REG,3,AD7124_FILT_REG_FILTER(0) | AD7124_FILT_REG_REJ60 | \AD7124_FILT_REG_POST_FILTER(0) | AD7124_FILT_REG_FS(11));break;case Samprate_200Hz:AD7124_Write_Reg(AD7124_FILT0_REG,3,AD7124_FILT_REG_FILTER(0) | AD7124_FILT_REG_REJ60 | \AD7124_FILT_REG_POST_FILTER(0) | AD7124_FILT_REG_FS(5));break;case Samprate_500Hz:AD7124_Write_Reg(AD7124_FILT0_REG,3,AD7124_FILT_REG_FILTER(0) | AD7124_FILT_REG_REJ60 | \AD7124_FILT_REG_POST_FILTER(0) | AD7124_FILT_REG_FS(2));break;case Samprate_1kHz:AD7124_Write_Reg(AD7124_FILT0_REG,3,AD7124_FILT_REG_FILTER(2) | AD7124_FILT_REG_REJ60 | \AD7124_FILT_REG_POST_FILTER(0) | AD7124_FILT_REG_FS(1));break;}
}

注意观察被红框标注的部分,AD7124_CH_MAP_REG_SETUP(0)代表地址0x19;AD7124_CH_MAP_REG_SETUP(x)和AD7124_CFGx_REG之间,"x"的数字必须匹配,否则采集到的信号会是全F。
在这里插入图片描述
1对1映射
在这里插入图片描述

//函数:	多通道初始化函数,初始1号AD7124的1-3通道
//变量:	无
//返回值: 无
void AD7124_Multiple_INIT(void)//多通道初始化函数
{AD7124_Reset();AD_Delay(500);//写AD7124 控制寄存器AD7124_Write_Reg(AD7124_ADC_CTRL_REG,2,AD7124_ADC_CTRL_REG_DATA_STATUS | AD7124_ADC_CTRL_REG_REF_EN | AD7124_ADC_CTRL_REG_POWER_MODE(3) | AD7124_ADC_CTRL_REG_MODE(0) | AD7124_ADC_CTRL_REG_CLK_SEL(0) | AD7124_ADC_CTRL_REG_CS_EN);//通道指示 | 内部参考打开 | POWER_MODE(x) x=0 低功耗 x=1 中功率 x=2、3全功率 | CTRL_REG_MODE(x) x=0 连续转换模式 x=1 单次转换模式 其他模式请看手册 | CLK_SEL(x) x=0 内部 x=2 外部//写AD7124 通道0寄存器,0号通道不开启//使能通道0 | 用配置0 | AINP(x) ADC+选择 0-15对应通道0-15  | AINM(x) ADC-选择 0-15对应通道0-15 其他通道请查看手册AD7124_Write_Reg(AD7124_CH0_MAP_REG,2,AD7124_CH_MAP_REG_CH_DISABLE | AD7124_CH_MAP_REG_SETUP(0) | AD7124_CH_MAP_REG_AINP(0) | AD7124_CH_MAP_REG_AINM(1));//写AD7124 通道1寄存器//使能通道1 | 用配置1 | AINP(x) ADC+选择 0-7对应通道0-7  | AINM(x) ADC-选择 0-7对应通道0-7 其他通道请查看手册AD7124_Write_Reg(AD7124_CH1_MAP_REG,2,AD7124_CH_MAP_REG_CH_ENABLE | AD7124_CH_MAP_REG_SETUP(1) | AD7124_CH_MAP_REG_AINP(2) | AD7124_CH_MAP_REG_AINM(3));	//写AD7124 通道2寄存器//使能通道2 | 用配置2 | AINP(x) ADC+选择 0-7对应通道0-7  | AINM(x) ADC-选择 0-7对应通道0-7 其他通道请查看手册AD7124_Write_Reg(AD7124_CH2_MAP_REG,2,AD7124_CH_MAP_REG_CH_ENABLE | AD7124_CH_MAP_REG_SETUP(0) | AD7124_CH_MAP_REG_AINP(4) | AD7124_CH_MAP_REG_AINM(5));	//写AD7124 通道3寄存器//使能通道3 | 用配置3 | AINP(x) ADC+选择 0-7对应通道0-7  | AINM(x) ADC-选择 0-7对应通道0-7 其他通道请查看手册AD7124_Write_Reg(AD7124_CH3_MAP_REG,2,AD7124_CH_MAP_REG_CH_ENABLE | AD7124_CH_MAP_REG_SETUP(0) | AD7124_CH_MAP_REG_AINP(6) | AD7124_CH_MAP_REG_AINM(7));	//写AD7124 配置1寄存器AD7124_Write_Reg(AD7124_CFG1_REG,2,AD7124_CFG_REG_UNIPOLAR | AD7124_CFG_REG_AIN_BUFP | AD7124_CFG_REG_AINN_BUFM | AD7124_CFG_REG_REF_SEL(2) | \AD7124_CFG_REG_PGA(7));	//单极性 | 打开ADC+缓冲  | 打开ADC-缓冲 | REF_SEL(x) x=0 REFIN1(+)/REFIN1(-) x=1 REFIN2(+)/REFIN2(-) x=2 内部基准电压源 x=3 AVDD//REG_PGA(x) 0-7对应增益1(±2.5V) 2(±1.25V) 4(± 625mV ) 8(±312.5 mV ) 16(±156.25 mV) 32(±78.125 mV) 64(±39.06mV) 128(±19.53mV)//写AD7124 配置2寄存器//单极性 | 打开ADC+缓冲  | 打开ADC-缓冲 | REF_SEL(x) x=2 内部基准电压源 | REG_PGA(6) 6对应增益64(±39.06mV)AD7124_Write_Reg(AD7124_CFG2_REG,2,AD7124_CFG_REG_UNIPOLAR | AD7124_CFG_REG_AIN_BUFP | AD7124_CFG_REG_AINN_BUFM | AD7124_CFG_REG_REF_SEL(2) | \AD7124_CFG_REG_PGA(6));	//写AD7124 配置3寄存器//单极性 | 打开ADC+缓冲  | 打开ADC-缓冲 | REF_SEL(x) x=2 内部基准电压源 | REG_PGA(5) 5对应增益32(±78.125 mV)AD7124_Write_Reg(AD7124_CFG3_REG,2,AD7124_CFG_REG_UNIPOLAR | AD7124_CFG_REG_AIN_BUFP | AD7124_CFG_REG_AINN_BUFM | AD7124_CFG_REG_REF_SEL(2) | \AD7124_CFG_REG_PGA(5));//写AD7124 滤波寄存器1 500Hz//FILTER(x)x=0 sinc4 x=2 sinc3 x=7 后置滤波器 其他请查看手册 | 打开60Hz陷波 | POST_FILTER(x) 后置滤波器设置查看手册 | FS(x)具体滤波配置查看网址AD7124_Write_Reg(AD7124_FILT1_REG,3,AD7124_FILT_REG_FILTER(2)|AD7124_FILT_REG_REJ60|AD7124_FILT_REG_POST_FILTER(0) | AD7124_FILT_REG_FS(2));//写AD7124 滤波寄存器2 500Hz//FILTER(x)x=0 sinc4 x=2 sinc3 x=7 后置滤波器 其他请查看手册 | 打开60Hz陷波 | POST_FILTER(x) 后置滤波器设置查看手册 | FS(x)具体滤波配置查看网址AD7124_Write_Reg(AD7124_FILT2_REG,3,AD7124_FILT_REG_FILTER(2)|AD7124_FILT_REG_REJ60|AD7124_FILT_REG_POST_FILTER(0) | AD7124_FILT_REG_FS(2));//写AD7124 滤波寄存器3 500Hz//FILTER(x)x=0 sinc4 x=2 sinc3 x=7 后置滤波器 其他请查看手册 | 打开60Hz陷波 | POST_FILTER(x) 后置滤波器设置查看手册 | FS(x)具体滤波配置查看网址AD7124_Write_Reg(AD7124_FILT3_REG,3,AD7124_FILT_REG_FILTER(2)|AD7124_FILT_REG_REJ60|AD7124_FILT_REG_POST_FILTER(0) | AD7124_FILT_REG_FS(2));
}

混合映射
在这里插入图片描述
配置原理和上述相同,不同的是AIN6/AIN7可以被配置到CHANNEL2,也就是说3号通道可以被被知道通道1的寄存器上,

四、实验数据

下列是几个不同通道,设置不同组Config后采集的数据(照片拍得有点糊,见谅……),2通道使用CINFIG_1的配置,3通道使用CONFIG_2,而PT1000的通道采用CONFIG_0。
在实际应用中,不同的通道应配置不同的组数,以防配置信息代码产生耦合。
在这里插入图片描述

Chapter3 STM32的硬件SPI驱动AD7124的方法

原文链接:https://blog.csdn.net/m0_46369352/article/details/125237380

一、芯片介绍

AD7124是一款适合高精度测量应用的低功耗、低噪声、完整模拟前端。该器件内置一个低噪声24位Σ-Δ型模数转换器(ADC),可配置来提供8个差分输入或15个单端或伪差分输入。片内低噪声级确保ADC中可直接输入小信号。可用于温度测量、压力测量、工业过程控制、仪器仪表和只能发射器。

二、引脚排布

在这里插入图片描述

AD7124的接口属于标准4线SPI,DOUT是从设备输出至主设备的,连接单片机SPI模块的MISO(主输入从输出);DIN是主设备数据输出至从设备的,连接单片机SPI模块的MOSI(主输出从输入)。SYNC和CLK悬空。
本项目我们使用SPI2模块。

三、时序图与驱动程序

调试数字设备,我们需要一边查看技术手册的时序图写代码,一边挂上逻辑分析仪。

1. 芯片初始化

我们打开AD7124的DataSheet,对其时序图进行分析,如下:
下图为AD7124的单次和连续转换时序图,由图可知,SCLK在空闲状态下是高电平。

在这里插入图片描述
下图是AD7124的读&写时序图,无论是读时序还是写时序,均在第二个时钟沿进行数据转换。
在这里插入图片描述
所以AD7124初始化时,需要将SPI模式设置为时钟悬空高、数据捕获于第2个时钟沿

void AD7124_SPI_Config(void)
{SPI_InitTypeDef	SPI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;				GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);	GPIO_SetBits(GPIOB,GPIO_Pin_12);SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;SPI_InitStructure.SPI_Mode = SPI_Mode_Master;		//SPI主机SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;	//发送接收8位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;			//时钟悬空高SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;		//数据捕获于第2个时钟沿SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;			//NSS信号由软件控制SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;		//定义波特率预分频的值:波特率预分频值为256SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;	//数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 0;			//CRC值计算的多项式SPI_Init(SPI2, &SPI_InitStructure);  				//根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器SPI_Cmd(SPI2, ENABLE);AD7124_CS_H;		//片选拉高,失能AD7124
}

2. SPI读写函数

SPI读写是驱动SPI设备的基础。SPI的原理为
第一步:通过硬件或软件NSS拉低从设备片选(CS),使能从设备。
第二步:通过MOSI引脚,发送8个时钟周期,每个周期发送1个bit的数据;通过写入不同的地址,来决定对从设备的读操作/写操作。
第三步:8个倍数的时钟周期发送完毕后,拉高片选,结束“发送/接收数据”。
这里我们把读和写都放在一个函数里面,因为SPI如果只读取,都需要发送8个时钟周期和指令0XFF。

/*** @brief  AD7124的读写SPI操作* @param  Data : 需要传输的数据* @retval SPI读到的数据*/
uint8_t AD7124_SPI_ReadWrite(uint8_t Data)
{uint16_t retry=0;//超时等待while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET){retry++;if(retry>200)return 0;}SPI_I2S_SendData(SPI2, Data);		//MOSI主机发送给从机retry=0;while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET){retry++;if(retry>200)return 0;}return SPI_I2S_ReceiveData(SPI2);	//MISO接收从机数据
}

3. AD7124复位

芯片上电初始化前,必须复位才能使用。
在这里插入图片描述
CS = 0 和 DIN = 1 的 64 个 SCLK。这会复位 ADC 和所有寄存器内容。也就是说,只要在AD7124 CS拉低的期间,在64个时钟周期内MOSI不断输出高电平,即可复位。代码如下:

void AD7124_Reset(void)
{AD7124_CS_L;//提供大于64个写操作,复位AD7124for(uint8_t a=0; a<9; a++){AD7124_SPI_ReadWrite(0XFF);		//MOSI拉高}delay_us(60);AD7124_CS_H;
}

加入延时delay_us()的目的是,防止在硬件SPI还未发送完最后几个时钟周期,CS提前拉高,造成复位失败。在读写操作中,同样加入了延时处理。
逻辑分析仪采集到的波形如下:
在这里插入图片描述

AD7124读取ID

复位完成后需要读取芯片的ID号,不同封装的ID号也不同,AD7124-4通常为0x14,而AD7124-8是0x12或0x04。SPI写入命令0x40为读寄存器,读ID为0x05,故写入0x45就可以读出ID。
在这里插入图片描述
0x40是发送读取ID指令返回的字节,0x14是ID号。

AD7124写入配置

写入配置需要根据写时序图编写,读时序如下
在这里插入图片描述
我们复位后先对ADC_CTRL进行操作,以开启ADC控制寄存器,AD7124_ADC_CTRL_REG地址是0X01,如下图DIN的第一个Byte,之后再把2字节的配置信息依次写入,这个根据用户需求配置,不在赘述。
通道和内置滤波器配置方法相同。
在这里插入图片描述

读取数据

本次实验我们采用单次读取模式。在读取数据之前先要写入命令0x42,之后需要读取多少个Byte的字节,就修改形式参数byte的数量即可。读取一次单次采集到的数据,需要3次SPI读写(24个时钟周期),DIN输出全高即可读取。

uint32_t DATA=0;
uint32_t Rd_Ary[3];uint32_t AD7124_Read_Data(uint8_t byte)
{for(uint8_t i=0; i<byte; i++){Rd_Ary[i] = AD7124_SPI_ReadWrite(0xFF);}DATA = (Rd_Ary[0]<<16) + (Rd_Ary[1]<<8) + Rd_Ary[2];return DATA;
}

主函数读取代码如下:

	while(1){AD7124_CS_L;AD7124_SPI_ReadWrite(0x42);			//读操作Data = AD7124_Read_Data(3);			//Data采集结果AD7124_CS_H;data_temp = Data;data_last1 = (float)Vref/AD_Gain * (float)data_temp/(2*0X800000);	//单极性模式电压转换公式,单位mV
//		data_last1 = (float)Vref/AD_Gain * ((float)data_temp/0X800000-1);	//双极性模式电压转换公式,单位mVdata_last1 = data_last1 * 1000.0f;					//转换为uV	printf("%X\r\n", Data);				//打印原始16进制数据printf("%2f uV\r\n", data_last1);	//打印微伏delay_ms(100);}

让我们采集11mV的直流信号,下图分别为实际测量和逻辑分析仪读取到的数据,为0x928D11。
在这里插入图片描述
在这里插入图片描述
为了验证数据是否正确,我们查看此次串口读取到的值:
在这里插入图片描述
原16进制数据读取正确,万用表实际测量11.0mV,实际读取值为11.180mV,误差在±100~200uV。因为信号发生器的线过长,影响了此次的精度。在PCB Layout时,尽可能将ADC输入的线路缩短,且圆弧布线,可以有效降低误差。

资料链接

代码可以在此处下载:

链接: https://download.csdn.net/download/m0_46369352/85612772

Chapter4 AD7124的调试总结

原文链接:https://blog.csdn.net/weixin_44224303/article/details/121940545

AD7124芯片的调试闭坑总结

AD7124的评估板资料 https://www.analog.com/media/en/technical-documentation/user-guides/EVAL-AD7124-8SDZ_UG-856.pdf

1、SPI通讯速率尽量不要大于5M,但是实测,短线情况下9M通讯正常。

2、SYNC引脚一定要拉高,拉低的话不转换。

(之前我的电路,本引脚直接悬空,我本来调通了,然后运行了几天,居然停止转换了,实际读寄存器,都是正常的,检查电路也没有损坏,多放查找,这个引脚需要拉高才行,在官方的评估板资料里,也是这样接的,MGR坏得很,说明书里面并没说,如下图)。
在这里插入图片描述

3、无法通过ADC_CONTROL寄存器控制内部基准

有好多网友用官方驱动发现无法通过ADC_CONTROL寄存器控制内部基准,设置完以后,读取其他寄存器数据正常,唯独该寄存器读取为0.解决方法:寄存器写入的时候前后加10ms左右即可,太快会导致control寄存器写入失败。具体原因没有深究。所以对芯片初始化完成后务必要重新读取寄存器看是否写入成功。

4、注意选择参考电压

如果选择外部参考电压,首先保证外部连接了外部基准;如果选择内部基准,要保证ADC_CONTROL寄存器里把内部基准电压打开。否则的话转换会失败,结果出错。为了测试方便刚开始可以选择AVDD为基准。

5、REFOUT引脚,需要对地接一个0.1uF电容,否则会出问题。

(这个我也是在网上看的,出什么问题,我也忘了,但是我记得,确实必须接0.1uF电容。在官方的评估板里,也是这样接的,MGR坏得很,说明书里面并没说,如下图)
在这里插入图片描述

6、在初始化写入AD7124寄存器前,最好一定读一次状态寄存器,否则可能写入寄存器失败。

我在使用中,AD7124-8就不用读状态寄存器,每次AD重新上电,或者只是MCU重启,都能写入寄存器数据;但是同样的程序,只是芯片换成AD7124-4,就不许,后发现只要读一次状态寄存器,就正常了。实际就是读状态寄存器,清除上电复位标志。
在这里插入图片描述

7、测内部20mV信号时,请断开外部AI连接,否则可能AD芯片死机

AI引脚可以配置为读取内部20mv信号,我配置成读内部20mv信号,基准也采用内部基准2.5V(可以配置内部基准从REFOUT输出,我测量过,确实比较准),计算得出应该是18.9mv,也有网友说是就18mv,看来这一点和官方数据有点出入,不过也不算什么了,还需要注意的是,测内部20mV信号时,请断开外部AI连接,否则可能AD芯片死机。

8、精度问题

按官方文档,最高也就能到22位精度。我用本芯片做RTD测量电路,感觉也就能达到18位精度而已,这一点和官方文档说法其实还是比较吻合的了。更多精度分析,请看我另一篇文章。总体来讲,精度可达21至22位。

9、AD工作模式及校准

连续转换模式(默认):就是一直转换
单次转换模式: 当ADC_CONTROL寄存器配置为单次模式,就对当前通道进行一次转换,然后转入待机模式。我拿来做了低功耗,需要测量时,就配置成单次转换模式,然后就不用管AD芯片了,它转换完会自动进入待机模式。
待机模式: 寄存器内容会保持,具体看说明书吧,我只说一点,待机模式时,激励电流源会自动关断(不会修改IO_CONTROL_1寄存器内容,不要理解错了)。
关断模式: 全部功能关闭,寄存器会复位,退出关断模式时,所有寄存器必须重新编程。
空闲模式: 在内部零电平(失调)校准、系统零电平(失调)校准完成后,会自动进入空闲模式,(除失调寄存器外)寄存器内容不会改变。
内部满量程(增益)校、零电平(失调)校准: 这两种模式,一般都是要同时执行的,一般不会单独只执行一个。所谓内部校准,就是在芯片内部,将 AI 输入端正负,分别与基准REF正负端短接,然后得出内部的偏移值、或定值。
执行 内部满量程(增益)校、零电平(失调)校准的过程:如果是单通道模式,先把其他寄存器配置好(如果不是单通道模式,那就一个一个通道的关闭吧),设置为 中功率 --> 空闲模式 --> 对应通道失调寄存器 写入0x800000(或上电复位值本身就是) --> 设置为 内部满量程(增益)校准模式 --> 校准完成自动进入空闲模式 --> 设置为 内部零电平(失调)校准 --> 校准完成自动进入空闲模式; 应当在校准完成后,读取 失调寄存器、增益寄存器的值,保存起来,然后以后上电、重启后,应在设置为 空闲模式/待机模式 时,才准写入这二个寄存器的值。
系统校准,也就是外部校准,需要在外部手动短接零电平 或 满量程电平,不过不需要设置 空闲模式、中功率那些,按理说,外部校准应该比内部校准准确度更好。
满量程校准,会重新设置 增益寄存器的值,零电平校准,会设置 失调寄存器的值。

10、REFIN(+) 与 REFIN(-)之差的范围是 1V到3.3V ,这个一定要注意,低于1V,芯片可能会不转换,这个问题折磨了我很久。

并且就算转换,也会导致精度不稳定。。我做RTD测量时,选定过2K电阻,横流500uA,刚好1V,实际测试中,刚开始没问题,一二个小时、几小时、几十小时后,芯片会停止转换,一会行一会不行。

11、在实际使用过程中,注意 AI通道的对AVSS的绝对电压范围

在实际使用过程中,注意 AI通道的对AVSS的绝对电压范围,REFIN(+) (-) 对AVSS的绝对电压范围,恒流输出通道对对AVSS的绝对电压范围,这个请查看手册参数。

12、电源问题:AVSS 与 IVSS ,最好单独供电,

电源问题:AVSS 与 IVSS ,最好单独供电,比如用2个LDO电源分开供电, 我是直接用了2个独立的隔离电源3.3V。在我最开始使用时,采用1个3.3V给AVSS和 IVSS一起供电,直接连接在一起,并且有1mA的恒流输出,运行一段时间后(可能是几天),测电流变成了0.2mA了,好像恒流源坏掉了,重启也是0.2mA;虽然是不是AVSS和 IVSS共同供电导致,无从考证,但是可以想象,这种同时供电,又有恒流输出,极有可能会影响到内部的供电问题;并且说明书上也有建议,有条件的话,最好单独供电。并且我采用单独供电后,就没再出现过这种情况了。

13、还是紧接着电源问题

当我用2个独立电源时,最开始,我买错了电源芯片,导致用了2个3.6V给AD芯片供电,然后MCU与其通信,好像没有什么问题,然后用了1天后,就开始通信故障,经过我反复不停重复,发现居然报了ROM故障(AD7124的ERR寄存器)。重启,或者MCU重新配置后,又可以用一段时间了。后面这颗芯片就算采用3.3V供电了,还是会出问题。最后,我采用了新的芯片+2个3.3V电源,就再没出现过了。很显然,这个问题就是3.6V供电造成的。。。
综上所述,可见该芯片,并没有想象中那么NB。

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

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

相关文章

Halcon tiff 点云读取以及平面矫正

一、读取tiff 图 dev_close_window () dev_open_window (0, 0, 512, 512, black, WindowHandle)xResolution:0.0025 yResolution:0.0025 zResolution:0.001 read_image (IntputImage, C:/Users/alber/Desktop/2023-08-15_16-38-24-982_/Sta5_002.tif) zoom_image_factor (Intpu…

初创公司的技术 SEO:提示和最佳实践

初创公司总是寻求可以在几乎没有前期资金的情况下进行扩展的增长战略。搜索引擎优化就是这样一种方法。 如果操作得当&#xff0c;SEO可以产生越来越多的目标访问者&#xff0c;而无需额外费用。此外&#xff0c;它可以通过支持其他策略来影响整个营销漏斗。你已经找到了学习初…

Edge 旧版本回退

微软官网 下载策略文件 下载后&#xff0c;解压打开 cad 包&#xff0c;把里面的 Windows\ADMX\ 下 3 个 *.admx 文件解压到 C:\Windows\PolicyDefinitions Windows\ADMX\zh-CN 下 3 个 *.adlm 文件解压到 C:\Windows\PolicyDefinitions\zh-CN Windows 搜索 gpedit&#xff…

XIAO ESP32S3之SenseCraft 模型助手部署

sipeed教程&#xff1a;SenseCraft 模型助手部署 | Seeed Studio Wiki 一、安装ESP-IDF 鉴于我的电脑之前安装过esp-idf v4.3版本&#xff0c;而ESP32-S3需要v4.4及以上版本才支持&#xff0c;所以将esp-idf更新到最新5.1版本。 1、启动mingw32.exe应用 2、进入esp-idf目录 …

重要通知丨 JumpServer 开源堡垒机 V2 社区版即将停止维护

尊敬的 JumpServer 开源堡垒机用户&#xff0c;您好&#xff01; 根据《关于 JumpServer 开源堡垒机 V2 版本产品生命周期的相关说明》&#xff0c;JumpServer 开源堡垒机 V2 版本&#xff08;社区版&#xff09;将于 2023 年 12 月 31 日停止维护支持。 在过去的两年多时间里…

ELK配置记录

1. filebeat.yml配置 启动命令&#xff1a; ./filebeat -e -c filebeat.yml # 输入 filebeat.inputs: - type: logenabled: truepaths:- /soft/log/base.*#跨行日志正则&#xff0c;从有时间的开始&#xff0c;到下一个时间之前结束multiline.pattern: ^\[[0-9]{4}-[0-9]{2}…

使用纯js码2个实用功能banner图标切换和表格制作

“I can accept failure, but I cant acceptnot trying.”—— by Michael Jordan    “我可以接受失败&#xff0c;但我不能接受放弃。” ——迈克尔•乔丹   banner图标切换 js原生&#xff1a;图片地址你们自己设置位置&#xff0c;相对位置或者绝对位置即可 <!DOCTY…

蓝桥杯物联网竞赛_STM32L071_6_RTC显示

作用&#xff1a; RTC在STM32微控制器中通常由一个独立的低功耗晶振和相关的寄存器组成。它可以独立于主处理器运行&#xff0c;即使在系统电源关闭的情况下(需要备用纽扣电池)&#xff0c;也能继续计时和记录日期。注意&#xff1a;RTC是芯片内部的功能&#xff0c;并没有和G…

Eaxyx 让圆球跟随鼠标移动

如果出现2023&#xff0c;代表配置成功: 进入Eaxy官方网站&#xff0c;点击文档&#xff1a; 选择 函数->绘图函数->initgraph: 可以看见initgraph&#xff08;&#xff09;函数有如下三个参数: 现在我们想生成一个1280*720大小的窗口&#xff1a; 我们需写如下代码: 但…

数据结构算法-冒泡排序算法

引言 虽然选择排序好用 &#xff0c;但有点问题 也就是频繁找最大值下标 放到 未排序的后面 因为每次需要扫描整个未排序序列&#xff0c;找到最大值或最小值的下标&#xff0c;并将其交换到未排序序列的最后一个位置。这样做的问题在于&#xff0c;在后面的迭代中&#xff0c…

C# WPF上位机开发(计算器界面设计)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 c# wpf最大的优势就是开发业务软件比较快、效率比较高。一般来说&#xff0c;它的界面和逻辑部分可以同时开发。界面的部分用xaml编写即可&#xf…

Spring Framework详解

学习目标 能够说出Spring的体系结构 能够编写IOC入门案例 能够编写DI入门案例 能够配置setter方式注入属性值 能够配置构造方式注入属性值 能够理解什么是自动装配 一、Spring简介 1 Spring课程介绍 问题导入 我们为什么要学习Spring框架&#xff1f; 1.1 为什么要学 Spri…

Nat. Mach. Intell. | 预测人工智能的未来:在指数级增长的知识网络中使用基于机器学习的链接预测

今天为大家介绍的是来自Mario Krenn团队的一篇论文。一个能够通过从科学文献中获取洞见来建议新的个性化研究方向和想法的工具&#xff0c;可以加速科学的进步。一个可能受益于这种工具的领域是人工智能&#xff08;AI&#xff09;研究&#xff0c;近年来科学出版物的数量呈指数…

如何选择适合的光电传感器与 STM32 微控制器进行接口设计

本文介绍了如何选择适合的光电传感器与 STM32 微控制器进行接口设计的方法。首先我们将介绍一些选择光电传感器的关键因素&#xff0c;包括测量范围、响应时间、分辨率和输出类型。然后我们将介绍如何根据所选传感器的特性进行硬件连接和接口设计。最后&#xff0c;我们将提供示…

同旺科技 USB TO SPI / I2C --- 调试W5500

所需设备&#xff1a; 内附链接 1、USB转SPI_I2C适配器(专业版); 首先&#xff0c;连接W5500模块与同旺科技USB TO SPI / I2C适配器&#xff0c;如下图&#xff1a; 读取重试时间值寄存器&#xff0c;默认值0x07D0 输出结果与默认值一致&#xff0c;芯片基本功能已经调通&am…

go自定义端口监听停用-------解决端口被占用的问题

代码 package mainimport ("fmt""log""net""os/exec""strconv""strings" )func getSelect(beign int, end int) int {var num intfor {_, err : fmt.Scan(&num)if err ! nil {fmt.Println("输入错误&am…

2、RocketMQ源码分析(二)

RocketMQ的底层通信模块remoting remoting是RocketMQ的底层通信模块&#xff0c;RocketMQ底层通讯是使用Netty来实现的。本文通过对remoting源码进行分析&#xff0c;来说明remoting如何实现高性能通信的。 二、Remoting 通信模块结构 remoting 的网络通信是基于 Netty 实现&…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《市场环境下运行的光热电站子系统容量优化配比研究》

这个标题涉及到对市场环境下运行的光热电站子系统进行容量优化配比的研究。让我们逐步解读&#xff1a; 市场环境下运行的光热电站&#xff1a; 这指的是光热电站在实际市场环境中的运行&#xff0c;可能包括了市场相关的经济、政策、竞争等因素。 子系统&#xff1a; 光热电站…

十六进制数列求和

高精度数组的集大成 做的时候在和高中同学叙叙旧&#xff0c;差点寄掉 代码如下&#xff1a; #include<stdio.h> void expand(int len); const char hexadecimal[17] "0123456789ABCDEF"; int result[20], mid[20], l_result[100];int main(void) {char tm…

你好!二分查找【JAVA】

1.初次相识 二分查找又称折半查找&#xff0c;是一种在有序数组中查找特定元素的算法。二分查找的基本思想是&#xff1a;通过不断地二分数组的中间元素&#xff0c;缩小查找区间&#xff0c;直到找到目标元素或者确定目标元素不存在为止。 二分查找的时间复杂度为O(logn)&…