AD1255/AD1256硬件SPI开发实战与跳坑过程

news2024/11/25 13:52:11

AD1255/AD1256硬件SPI开发实战与跳坑过程

以上图片我们可以知道在t17阶段,数据是不能被读取的。另外最小是16个τCLKIN,具体是多少这个跟你配置的DATA_rate的设置有关系。

1.6 同步SYNC的时序

要同步SYNC,要么采用管脚SYNC,要么发出SYNC的命令。这里我们打算采用的是发出SYNC命令。

2、分立部件
2.1 INPUT MULTIPLEXER输入通道选择器
同一时刻,只能有一个通道输入,所以输入通道的选择控制由 MULTIPLEXER 寄存器控制。AINp是正,如果采用单端输
入,那么AINN则接地。
提醒:

2.2 OPEN/SHORT SENSOR DETECTION 开路/短路的传感器检测
传感器检测电流源(SDCS)提供了一种方法来验证连接到ADS1255/6的外部传感器的完整性。(说实话,我没看懂,尴尬)
没关系,我们采用关闭这个传感器检测。我个人猜的话,可能就是用于判断是否给模拟输入端输入了信号,是否是开路还是短路状态。
当SDCS使能的时候,ADS1256将会自动的打开模拟输入端的buffer,无视buffer的bit位设置。这样做可以防止输入信号从SDCS中加载信号。
总而言之,模拟的部分,我没看太懂,但是我们可以知道的是开了SDCS的话,就可以防止在开路短路的时候测量。

2.3 PGA(可编程的增益放大器)

上述表格的意义就很有意思了,PGA的设置也不是随便设置的,当要测量特别小的信号时候,PGA就非常有用了,这一点要根据满量程最大的输入电压选择合适的PGA。PGA的设置在ADCON寄存器中。
重要:

在改变PGA的设置后,需要重新校准A/D转换器

2.4 DIGITAL FILTER(数字滤波器)
可以权衡数据速率(采样率)和分辨率。
数据速率的配置在DRATE里面设置。

以下是幅频响应

3 模式
首先要说一下在AD1256这款芯片里面,有SETTLING TIME这个概念。
The settling time指的是从模拟输入端到数字滤波器的传播延时,对于不同的数据速率,The SETTLING TIME对应不同。使用不同的模式,会产生不同的setting time。

这个都没关系DRDY_n作为输入信号,ADS1256会发出低电平指示我们可以开始读取数据了。

以下都是基于buffer、PGA、datarate的初始化设置完毕后。采取的模式选择。

3.1 单通道同步模式

在初始化完毕后,发送同步命令、或者通过SYNC/PWND的管脚发出的同步命令后,进入setting time (t18)。
然后在DRDY_n在低电平的时候后发出RDATA命令,接着读取即可。
这种模式也是十分简单的。

3.2 使用输入选择器切换通道
最有效的切换(cycle through)改变输入通道的方式就是使用WREG 命令给MUX寄存器,在DRDY_n变低后,发出WREG命令,然后改变通道,通过发出SYNC和WAKEUP的命令重新启动转换,并且以RDATA发出命令后读取数据。并且这里我们要注意了,当输入通道切换时,我们完全没有必要丢弃数据,因为ADS1256在DRDY_n走低前,就可以完全获得稳定的数据指示读取数据已经准备好了。不过读取数据,是读取的上一个通道的数据。当DRDY_n再次走低的时候吧,通过更新多通道寄存器重复循环。

3.3 使用单触发模式(节能模式)
使用STANDBY 命令可以让功耗大量的减小,通过发出wakeup命令可以从待机模式到单触发转换。使用这种模式,会有一个额外的延时需要用于ADC的调制器的启动和稳定。

3.4 连续转换模式(RDATAC)
这种模式的意思就是说,转换只需要一RDATAC,而不需要发送一个rdata,读取一个DOUT。
使用这种连续转换的读取方式,是在同步、输入寄存器改变后,或者从待机模式下唤醒后,都可以使用这种连续读取的方式。这种方式其他都一样,只不过读取不再是使用发送一个rdata,然后读取数据。而是只需要发送一次rdatac后,以后就在drdy_n的低电平,直接读取数据,即可。不过这个取决于DRDY_n的周期个数。下图是不同的SPS对应的DRDY_n的周期。如果不按照周期读取,那么可能读到旧数据和新数据的混合物。
所以,这种连续读取的模式,我不太建议,这里我们不做实现。就算实现,我觉得也只能在单通道的采集的情况下实现好点。

4、校准
OFC校准:offset calibration
FSC校准: full-scale calibration

DRDY_n goes high when calibration begins and remains so until settled data is ready afterwards.
DRDY_n会一直走高,当校准开始时,直到数据准备完毕。
下面这段话就很关键了,在reset复位后、上电后、buffer改变、数据率改变、PGA改变后都要执行自校验。

以下是在不同数据率下理想的OFC和FSC,但是这点都不重要,我们交给系统自动校验即可,不用专门通过寄存器的方式写入。

4.1自校准 self-calibration

以上官方建议,强烈推荐上电后使用SELFCAL命令。虽然配置了自动自校验。

使用SELFOCAL、SELFGCAL、SELFCAL这三个命令

/*
*********************************************************************************************************
*
*	模块名称 : ADS125X 驱动模块(8通道带PGA的24位ADC)
*	文件名称 : bsp_ADS125X.h
*
*	Copyright (C), 2013-2014, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/

#ifndef _BSP_ADS125X_H
#define _BSP_ADS125X_H

#include "main.h"



#define ADC_DEBUG		0


// define commands
#define ADS1256_CMD_WAKEUP   0x00
#define ADS1256_CMD_RDATA    0x01
#define ADS1256_CMD_RDATAC   0x03
#define ADS1256_CMD_SDATAC   0x0f
#define ADS1256_CMD_RREG     0x10
#define ADS1256_CMD_WREG     0x50
#define ADS1256_CMD_SELFCAL  0xf0
#define ADS1256_CMD_SELFOCAL 0xf1
#define ADS1256_CMD_SELFGCAL 0xf2
#define ADS1256_CMD_SYSOCAL  0xf3
#define ADS1256_CMD_SYSGCAL  0xf4
#define ADS1256_CMD_SYNC     0xfc
#define ADS1256_CMD_STANDBY  0xfd
#define ADS1256_CMD_REST    0xfe

// define the ADS1256 register values
#define ADS1256_STATUS       0x00
#define ADS1256_MUX          0x01
#define ADS1256_ADCON        0x02
#define ADS1256_DRATE        0x03
#define ADS1256_IO           0x04
#define ADS1256_OFC0         0x05
#define ADS1256_OFC1         0x06
#define ADS1256_OFC2         0x07
#define ADS1256_FSC0         0x08
#define ADS1256_FSC1         0x09
#define ADS1256_FSC2         0x0A


// define multiplexer codes
#define ADS1256_MUXP_AIN0   0x00
#define ADS1256_MUXP_AIN1   0x10
#define ADS1256_MUXP_AIN2   0x20
#define ADS1256_MUXP_AIN3   0x30
#define ADS1256_MUXP_AIN4   0x40
#define ADS1256_MUXP_AIN5   0x50
#define ADS1256_MUXP_AIN6   0x60
#define ADS1256_MUXP_AIN7   0x70
#define ADS1256_MUXP_AINCOM 0x80

#define ADS1256_MUXN_AIN0   0x00
#define ADS1256_MUXN_AIN1   0x01
#define ADS1256_MUXN_AIN2   0x02
#define ADS1256_MUXN_AIN3   0x03
#define ADS1256_MUXN_AIN4   0x04
#define ADS1256_MUXN_AIN5   0x05
#define ADS1256_MUXN_AIN6   0x06
#define ADS1256_MUXN_AIN7   0x07
#define ADS1256_MUXN_AINCOM 0x08


// define gain codes
#define ADS1256_GAIN_1      0x00
#define ADS1256_GAIN_2      0x01
#define ADS1256_GAIN_4      0x02
#define ADS1256_GAIN_8      0x03
#define ADS1256_GAIN_16     0x04
#define ADS1256_GAIN_32     0x05
#define ADS1256_GAIN_64     0x06
//#define ADS1256_GAIN_64     0x07

//define drate codes
#define ADS1256_DRATE_30000SPS   0xF0
#define ADS1256_DRATE_15000SPS   0xE0
#define ADS1256_DRATE_7500SPS   0xD0
#define ADS1256_DRATE_3750SPS   0xC0
#define ADS1256_DRATE_2000SPS   0xB0
#define ADS1256_DRATE_1000SPS   0xA1
#define ADS1256_DRATE_500SPS    0x92
#define ADS1256_DRATE_100SPS    0x82
#define ADS1256_DRATE_60SPS     0x72
#define ADS1256_DRATE_50SPS     0x63
#define ADS1256_DRATE_30SPS     0x53
#define ADS1256_DRATE_25SPS     0x43
#define ADS1256_DRATE_15SPS     0x33
#define ADS1256_DRATE_10SPS     0x23
#define ADS1256_DRATE_5SPS      0x13
#define ADS1256_DRATE_2_5SPS    0x03

//void Init_ADS1256_GPIO(void);
//void Delay(unsigned int dal);
void ADS1256_Init(uint8_t PGA);   //初始化ADS1256

int32_t ADS1256ReadData(void);
int32_t ADS_sum(unsigned char road);
int32_t ADS_Diff(unsigned char channel);
#endif

/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/

#include "bsp_ads125x.h"
#include "main.h"

/*
	ADS125X基本特性:
	1、模拟部分供电5V;
	2、SPI数字接口电平:3.3V
	3、PGA设置范围: 1、2、4、8、16、32、64、
	4、参考电压2.5V (推荐缺省的,外置的)
	5、输入电压范围:PGA = 1 时, 可输入正负5V
	6. 自动校准 (当设置了PGA,BUF使能、数据采样率时,会启动自校准)
	7. 输入的缓冲器可设置启用和关闭(一般选启用)


	外部晶振频率 = 7.68MHz,
		时钟频率 tCLK = 1/7.68M = 0.13uS
		输出数据周期 tDATA =  1 / 30K = 0.033mS  (按30Ksps计算)

	对SPI的时钟速度要求: (ADS125X.pdf page 6)
		最快 4个tCLK = 0.52uS
		最慢 10个tDATA = 0.3mS (按 30Ksps 计算)

		SCL高电平和低电平持续时间最小 200ns

	RREG, WREG, RDATA 命令之后,需要延迟 4 * tCLK = 0.52uS;
	RDATAC, RESET, SYNC 命令之后,需要延迟 24 * tCLK = 3.12uS;

	实际测试,在3.3V上电后, 及时不做任何配置,ADS125的DRDY 口线即开始输出脉冲信号(2.6us高,33.4低,频率30KHz)
*/

/*
	调试记录
	(1) 设置寄存器时,SCK过快导致芯片不能每次都收到数据。原因: 发送的相邻的字节之间需要延迟一小段时间.
	(2) 连续复位CPU时,偶尔出现芯片输出采样率异常。
*/


/* 定义口线置0和置1的宏 */

#define RESET_0()	HAL_GPIO_WritePin(SPI2_RST_GPIO_Port, SPI2_RST_Pin,GPIO_PIN_RESET);//GPIO_ResetBits(SPI2_RST_GPIO_Port, SPI2_RST_Pin)
#define RESET_1()	HAL_GPIO_WritePin(SPI2_RST_GPIO_Port, SPI2_RST_Pin,GPIO_PIN_SET);

#define CS_0()		HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin,GPIO_PIN_RESET);
#define CS_1()		HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin,GPIO_PIN_SET);

#define SCK_0()		HAL_GPIO_WritePin(SPI2_CLK_GPIO_Port, SPI2_CLK_Pin,GPIO_PIN_RESET);
#define SCK_1()		HAL_GPIO_WritePin(SPI2_CLK_GPIO_Port, SPI2_CLK_Pin,GPIO_PIN_SET);

#define DI_0()		HAL_GPIO_WritePin(SPI2_DIN_GPIO_Port, SPI2_DIN_Pin,GPIO_PIN_RESET);
#define DI_1()		HAL_GPIO_WritePin(SPI2_DIN_GPIO_Port, SPI2_DIN_Pin,GPIO_PIN_SET);

#define DO_IS_HIGH()	(HAL_GPIO_ReadPin(SPI2_DOUT_GPIO_Port, SPI2_DOUT_Pin) == GPIO_PIN_SET)

#define DRDY_IS_LOW()	(HAL_GPIO_ReadPin(SPI2_NDY_GPIO_Port, SPI2_NDY_Pin ) == GPIO_PIN_RESET)


void ADS1255_SELFCAL(void);
void ADS1255_SELFOCAL(void);
void ADS1255_SELFGCAL(void);
void ADS1255_SYSOCAL(void);
void ADS1255_WAKEUP(void);
void ADS1255_RESET(void);
void ADS1255_SYNC(void);
void ADS1255_RDATAC(void);

uint8_t choice_flag=0; 
/*
*********************************************************************************************************
*	函 数 名: delay_us
*	功能说明: 配置STM32的GPIO和SPI接口,用于连接 ADS125X
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void delay_us(uint32_t udelay)
{
	uint32_t Delay = udelay * 120/4;
	do
	{
		__NOP();
	}
	while (Delay --);
}

/*
*********************************************************************************************************
*	函 数 名: bsp_InitADS125X
*	功能说明: 配置STM32的GPIO和SPI接口,用于连接 ADS125X
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitADS125X(void)
{
    RESET_1();
    CS_1();
    SCK_0();		/* SPI总线空闲时,钟线是低电平 */
    DI_1();
	
    HAL_Delay(100);
    RESET_0();
    HAL_Delay(100);
    RESET_1();
    HAL_Delay(100);
    CS_1();
    HAL_Delay(1);
    SCK_0();		/* SPI总线空闲时,钟线是低电平 */
    HAL_Delay(1);
    CS_0();
    HAL_Delay(1);
}

//几个延时
static void ADS125X_DelaySCLK(void)//F103 72M
{
    uint16_t i;
    for(i = 0; i < 5; i++);//0.5us
}
void ADS125X_Delay_1us(uint16_t t)//F103 72M
{
    uint16_t i, j;

    for(j = 0; j < t; j++)
    {
        for(i = 0; i < 10; i++);//1us
    }
}
static void ADS1256_DelayDATA(void)
{
    /*
    	Delay from last SCLK edge for DIN to first SCLK rising edge for DOUT: RDATA, RDATAC,RREG Commands
    	最小 50 个tCLK = 50 * 0.13uS = 6.5uS
    */
    ADS125X_Delay_1us(10);	/* 最小延迟 6.5uS, 此处取10us */

}



/*
*********************************************************************************************************
*	函 数 名: ADS125X_Send8Bit
*	功能说明: 向SPI总线发送8个bit数据。 不带CS控制。
*	形    参: _data : 数据
*	返 回 值: 无
*********************************************************************************************************
*/
static void ADS125X_Send8Bit(uint8_t _data)
{
    uint8_t i;

    /* 连续发送多个字节时,需要延迟一下 */
    ADS125X_DelaySCLK();
    ADS125X_DelaySCLK();

    /* ADS125X 要求 SCL高电平和低电平持续时间最小 200ns  */
    for(i = 0; i < 8; i++)
    {
        if(_data & 0x80)
        {
            DI_1();
        }
        else
        {
            DI_0();
        }
        SCK_1();
        ADS125X_DelaySCLK();
        _data <<= 1;
        SCK_0();			/* <----  ADS125X 是在SCK下降沿采样DIN数据, 数据必须维持 50nS */
        ADS125X_DelaySCLK();
    }
}

/*
*********************************************************************************************************
*	函 数 名: ADS125X_Recive8Bit
*	功能说明: 从SPI总线接收8个bit数据。 不带CS控制。
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
static uint8_t ADS125X_Recive8Bit(void)
{
    uint8_t i;
    uint8_t read = 0;

    ADS125X_DelaySCLK();
    /* ADS125X 要求 SCL高电平和低电平持续时间最小 200ns  */
    for(i = 0; i < 8; i++)
    {
        SCK_1();
        ADS125X_DelaySCLK();
        read = read << 1;
        SCK_0();
        if(DO_IS_HIGH())
        {
            read++;
        }
        ADS125X_DelaySCLK();
    }
    return read;
}
//ADS1256 写数据
//向ADS1256中地址为regaddr的寄存器写入一个字节databyte
void ADS1256WREG(unsigned char regaddr, unsigned char databyte)
{
    CS_0();
    //向寄存器写入数据地址
    ADS125X_Send8Bit(ADS1256_CMD_WREG | (regaddr & 0x0F));
    //写入数据的个数n-1
    ADS125X_Send8Bit(0x00);
    //向regaddr地址指向的寄存器写入数据databyte
    ADS125X_Send8Bit(databyte);
    CS_1();
}


//ADS1255读寄存器
//说明:根据要求写入寄存器地址
unsigned char ADS1256RREG(unsigned char regaddr)
{
    unsigned char reg_date;
    CS_0();
    //向寄存器写入数据地址
    ADS125X_Send8Bit(regaddr | ADS1256_CMD_RREG);
    //写入数据的个数n-1
    ADS125X_Send8Bit(0x00);
    reg_date = ADS125X_Recive8Bit();
    CS_1();
    return reg_date;
}

//ADS1255写寄存器
void ADS1256_WriteCmd(unsigned char _cmd)
{
    CS_0();
    ADS125X_Send8Bit(_cmd);
    CS_1();
}

//设置单端采集通道
void ADS1256_SetChannal(uint8_t _ch)
{
    /*
    Bits 7-4 PSEL3, PSEL2, PSEL1, PSEL0: Positive Input Channel (AINP) Select
    	0000 = AIN0 (default)
    	0001 = AIN1
    	0010 = AIN2 (ADS1256 only)
    	0011 = AIN3 (ADS1256 only)
    	0100 = AIN4 (ADS1256 only)
    	0101 = AIN5 (ADS1256 only)
    	0110 = AIN6 (ADS1256 only)
    	0111 = AIN7 (ADS1256 only)
    	1xxx = AINCOM (when PSEL3 = 1, PSEL2, PSEL1, PSEL0 are ?°don?ˉt care?±)

    	NOTE: When using an ADS1255 make sure to only select the available inputs.

    Bits 3-0 NSEL3, NSEL2, NSEL1, NSEL0: Negative Input Channel (AINN)Select
    	0000 = AIN0
    	0001 = AIN1 (default)
    	0010 = AIN2 (ADS1256 only)
    	0011 = AIN3 (ADS1256 only)
    	0100 = AIN4 (ADS1256 only)
    	0101 = AIN5 (ADS1256 only)
    	0110 = AIN6 (ADS1256 only)
    	0111 = AIN7 (ADS1256 only)
    	1xxx = AINCOM (when NSEL3 = 1, NSEL2, NSEL1, NSEL0 are ?°don?ˉt care?±)
    */
    if(_ch > 2)
    {
        return;
    }
    ADS1256WREG(ADS1256_MUX, (_ch << 4) | (1 << 3));	/* Bit3 = 1, AINN 1ì?¨?ó AINCOM */
}

// 设置差分采集通道
void ADS1256_SetDiffChannal(uint8_t _ch)
{
    /*
    Bits 7-4 PSEL3, PSEL2, PSEL1, PSEL0: Positive Input Channel (AINP) Select
    	0000 = AIN0 (default)
    	0001 = AIN1
    	0010 = AIN2 (ADS1256 only)
    	0011 = AIN3 (ADS1256 only)
    	0100 = AIN4 (ADS1256 only)
    	0101 = AIN5 (ADS1256 only)
    	0110 = AIN6 (ADS1256 only)
    	0111 = AIN7 (ADS1256 only)
    	1xxx = AINCOM (when PSEL3 = 1, PSEL2, PSEL1, PSEL0 are ?°don?ˉt care?±)

    	NOTE: When using an ADS1255 make sure to only select the available inputs.

    Bits 3-0 NSEL3, NSEL2, NSEL1, NSEL0: Negative Input Channel (AINN)Select
    	0000 = AIN0
    	0001 = AIN1 (default)
    	0010 = AIN2 (ADS1256 only)
    	0011 = AIN3 (ADS1256 only)
    	0100 = AIN4 (ADS1256 only)
    	0101 = AIN5 (ADS1256 only)
    	0110 = AIN6 (ADS1256 only)
    	0111 = AIN7 (ADS1256 only)
    	1xxx = AINCOM (when NSEL3 = 1, NSEL2, NSEL1, NSEL0 are ?°don?ˉt care?±)
    */
    if(_ch == 0)
    {
        ADS1256WREG(ADS1256_MUX, (0 << 4) | 1);	/* 差分输入 AIN0, AIN1 */
    }
    else if(_ch == 1)
    {
        ADS1256WREG(ADS1256_MUX, (2 << 4) | 3);	/* 差分输入 AIN2, AIN3 */
    }
    else if(_ch == 2)
    {
        ADS1256WREG(ADS1256_MUX, (4 << 4) | 5);	/* 差分输入 AIN4, AIN5 */
    }
    else if(_ch == 3)
    {
        ADS1256WREG(ADS1256_MUX, (6 << 4) | 7);	/* 差分输入 AIN6, AIN7 */
    }
}

//等
void ADS1256_WaitDRDY(void)
{
    uint32_t i;

    for(i = 0; i < 40000000; i++)
    {
        if(DRDY_IS_LOW())
        {
            break;
        }
    }
    if(i >= 40000000)
    {
#if ADC_DEBUG
        printf("ADS1256_WaitDRDY() Time Out ...\r\n");		/* 调试语句. 用语排错 */
#endif
    }
}

//初始化ADS1256
void ADS1256_Init(uint8_t PGA)
{
    /* 初始化 */
    bsp_InitADS125X();
    HAL_Delay(10);
    /* 配置 */
    ADS1256_WriteCmd(ADS1256_CMD_REST);
    HAL_Delay(100);
    ADS1256_WriteCmd(ADS1256_CMD_SYNC);
    HAL_Delay(10);
    ADS1256_WriteCmd(ADS1256_CMD_WAKEUP);
    HAL_Delay(10);
    /* AD配置 */
//   ADS1256WREG(ADS1256_STATUS, 0x04);              // 高位在前、自校准、不使用缓冲
    ADS1256WREG(ADS1256_STATUS, 0x06);              // 高位在前、自校准、使用缓冲测量低于3.5V
    HAL_Delay(10);
    ADS1256WREG(ADS1256_MUX, 0x08);                 // 初始化端口A0为‘+’,AINCOM位‘-’
//    ADS1256WREG(ADS1256_MUX, 0x01);                 // 初始化端口A0为‘+’,A1位‘-’差分
    HAL_Delay(10);
    ADS1256WREG(ADS1256_ADCON, 0x00); 	//
    ADS1256WREG(ADS1256_ADCON, PGA);               // PGA设置增益倍  关闭 CLKOUT 引脚输出,关闭传感器检测,设置增益倍数1
		HAL_Delay(10);
    ADS1256WREG(ADS1256_DRATE, ADS1256_DRATE_50SPS); // 数据50sps
    HAL_Delay(10);
    ADS1256WREG(ADS1256_IO, 0x00);
    HAL_Delay(10);

    /* 校准 */
    ADS125X_Send8Bit(0xF0);
    HAL_Delay(100);
		choice_flag=PGA;
}

//读取AD值
int32_t ADS1256ReadData(void)
{
    uint32_t read = 0;
    /* SPI片选 = 0 */
    CS_0();

    /* 读数据的命令 */
    ADS125X_Send8Bit(ADS1256_CMD_RDATA);

    /* 必须延迟才能读取芯片返回数据 */
    ADS1256_DelayDATA();

    /* 读采样结果,3个字节,高字节在前 */
    read = ADS125X_Recive8Bit() << 16;
    read += (ADS125X_Recive8Bit() << 8);
    read += ADS125X_Recive8Bit();
	
    /* SPI片选 = 1 */
    CS_1();

    /* 负数进行扩展。24位有符号数扩展为32位有符号数 */
    if(read & 0x800000)
    {
        read += 0xFF000000;
    }

    return (int32_t)read;
}


uint8_t ADS1255_ReadID(void)
{
//	uint8_t id=0;
//	uint8_t buff;
//	/*SPI??=0*/
//  CS_0();
//	/* 配置 */
//	ADS1256_WriteCmd(ADS1256_CMD_RREG);
//	HAL_Delay(100);
//	ADS1256_WriteCmd(ADS1256_CMD_SYNC);
//	HAL_Delay(10);
//	ADS1256_WriteCmd(ADS1256_CMD_WAKEUP);
//	HAL_Delay(10);
//	
//	
	
//	buff=CMD_RREG|REG_STATUS;
//	HAL_SPI_Transmit(&hspi2,&buff,1,SPIx_TIMEoUT_MAX);//SPI??
//	buff=0x00;
//	HAL_SPI_Transmit(&hspi2,&buff,1,SPIx_TIMEoUT_MAX);//SPI??
//	while(HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
//	HAL_Delay(1);
//	HAL_SPI_Receive(&hspi2,&id,1,SPIx_TIMEoUT_MAX);
//	/*SPI??=1*/
//	HAL_GPIO_WritePin(SPI2_NSS_GPIO_Port,SPI2_NSS_Pin,GPIO_PIN_SET);
//	return (id>>4);
		return  0;
}


//读取ADS1256单路数据
int32_t ADS_sum(unsigned char channel)
{
    /* 等 */
//    ADS1256_WaitDRDY();
    /* 切换模拟通道 */
    ADS1256_SetChannal(channel);//单端
//    ADS1256_SetDiffChannal(0);//差分
    ADS125X_Delay_1us(5);
    /* 同步 */
    ADS1256_WriteCmd(ADS1256_CMD_SYNC);
    ADS125X_Delay_1us(5);
    /* 唤醒 */
    ADS1256_WriteCmd(ADS1256_CMD_WAKEUP);
    ADS125X_Delay_1us(25);
    /* 读取AD值,返回24位数据 */
    return (int32_t)ADS1256ReadData();
}
//读取ADS1256差分数据
int32_t ADS_Diff(unsigned char channel)
{
    /* 等 */
//    ADS1256_WaitDRDY();
    /* 切换模拟通道 */
//    ADS1256_SetChannal(channel);//单端
    ADS1256_SetDiffChannal(0);//差分
//    ADS125X_Delay_1us(5);
    /* 同步 */
    ADS1256_WriteCmd(ADS1256_CMD_SYNC);
//    ADS125X_Delay_1us(5);
    /* 唤醒 */
    ADS1256_WriteCmd(ADS1256_CMD_WAKEUP);
//    ADS125X_Delay_1us(25);
    /* 读取AD值,返回24位数据 */
    return (int32_t)ADS1256ReadData();
}



在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

![

](https://img-blog.csdnimg.cn/8c7d9be2773a4301a2435a995bc3408e.png)

当DRDY变为低电平时,可以读取AD值。

在这里插入图片描述

CS使能必须为低电平才能向ADC中读取数据。

在这里插入图片描述

在这里插入图片描述

山东博奥斯
https://www.bos-power.com/product/751.html

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

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

相关文章

Android 复杂UI界面分模块解耦的一次实践

一、复杂UI页面开发的问题 常见的比较复杂的UI界面&#xff0c;比如电商首页&#xff0c;我们看看某电商的首页部分UI&#xff1a; 上面是截取的首页部分&#xff0c;如果这个首页如果不分模块开发会遇到哪些问题&#xff1f; 开发任务不方便分割&#xff0c;一个人开发的话周…

毅速丨3D打印结合拓扑优化让轻量化制造更容易

轻量化可以减少产品的重量&#xff0c;提高产品的性能和效率&#xff0c;同时减少能源消耗和排放。尤其在航空航天、汽车制造造等行业对轻量化追求更高。当前&#xff0c;随着制造技术的发展&#xff0c;拓扑优化结合3D打印为轻量化制造带来的显著的优势正在逐渐凸显。 首先&am…

寻找更好的发展机会

一个员工离开一家公司的原因无外乎下面几个原因&#xff1a; 第一&#xff0c;对薪资不满意。 第二&#xff0c;在公司没前途。 第三&#xff0c;工作干的不爽。 从题主的叙述来看&#xff0c;上面三条都被题主占全了。 第一条&#xff0c;题主从日本母公司回国后&#xf…

数据库概述 -- 数据模型知识点要点详解

数据模型 概述概念数据特征组成要素分类概念层数据模型逻辑层数据模型物理层数据模型 主页传送门&#xff1a;&#x1f4c0; 传送 概述 数据模型是对现实世界数据特征的抽象&#xff0c;它描述了数据的结构、操作和约束条件&#xff0c;为数据库系统的信息表示与操作提供一个抽…

【文生图】Stable Diffusion XL 1.0模型Full Fine-tuning指南(U-Net全参微调)

文章目录 前言重要教程链接以海报生成微调为例总体流程数据获取POSTER-TEXTAutoPosterCGL-DatasetPKU PosterLayoutPosterT80KMovie & TV Series & Anime Posters 数据清洗与标注模型训练模型评估生成图片样例宠物包商品海报护肤精华商品海报 一些TipsMata&#xff1a;…

第6章_多表查询

文章目录 多表查询概述1 一个案例引发的多表连接1.1 案例说明1.2 笛卡尔积理解演示代码 2 多表查询分类讲解2.1 等值连接 & 非等值连接2.1.1 等值连接2.1.2 非等值连接 自连接 & 非自连接内连接与外连接演示代码 3 SQL99语法实现多表查询3.1 基本语法3.2 内连接&#x…

kubernetes集群编排——service微服务

service微服务 创建测试示例 vim myapp.yml apiVersion: apps/v1kind: Deploymentmetadata:labels:app: myappname: myappspec:replicas: 6selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- image: myapp:v1name: myapp---apiVersion: v1…

趋势:实时的stable diffusion

视频中使用了实时模型&#xff1a;只需2~4 个步骤甚至一步即可生成768 x 768分辨率图像。 这项技术可以把任意的stable diffusion模型转为实时模型。 潜在一致性模型 LCM LCM 只需 4,000 个训练步骤&#xff08;约 32 个 A100 GPU 一小时&#xff09;即可从任何预训练的SD模型中…

每个程序员都应该知道的六种负载均衡算法

一个大型网络平台能轻松面对数百万请求而不产生崩溃&#xff0c;负载均衡器&#xff08;Load Balancer&#xff09;是绝对的关键组件。 负载均衡器会在多个服务器之间分配工作流&#xff0c;也就是将用户请求转发到不同的机器上&#xff0c;可以确保服务的高可用性、响应速度和…

揭秘重生奇迹mu中的幻术园

幻术园可以说是重生奇迹mu游戏进化中的一个里程碑&#xff0c;因为一个重要的地图区域就此开发出来&#xff0c;同时它还是继勇者大陆、仙踪林后的第三个新人出生地&#xff0c;所以这种象征性的意义更为重要&#xff0c;今天小编就带领大家进入到重生奇迹mu发布网下的幻术园中…

10+ Web3 新锐联合放送知识与奖励,一起瓜分 2000 美金!

Web3 时代&#xff0c;链接更多的参与者&#xff0c;激发共创活跃度&#xff0c;是一个成熟繁荣的项目和社区生态所必备的要素。深度协作与互动&#xff0c;始终是打破无形壁垒&#xff0c;构建高度融合和包容的社区生态的重要路径&#xff0c;也是培养用户和开发者参与建设的热…

浅谈低压无功补偿在分布式光伏现场中的应用-安科瑞 蒋静

摘要&#xff1a;分布式光伏电站由于建设时间短、技术成熟、收益明显而发展迅速&#xff0c;但光伏并网引起用户功率因数异常的问题也逐渐凸显。针对分布式光伏电站接入配电网后功率因数降低的问题&#xff0c;本文分析了低压无功补偿装置补偿失效的原因&#xff0c;并提出了一…

Seata入门系列【19】分布式事务之CAP、BASE理论

1 CAP理论 CAP是以下三个词语的缩写&#xff1a; Consistency&#xff1a;一致性Availability&#xff1a;可用性Partition tolerance&#xff1a;分区容忍性 CAP理论的基础概念就是在分布式系统中&#xff0c;无法同时满足以上三点。 下面我们以一个简单的分布式系统&…

如何减少自动化测试的误差?

自动化测试是一种利用软件工具或者硬件设备来代替人工执行测试用例的方法&#xff0c;它可以提高测试效率和质量&#xff0c;但也可能存在一些误差&#xff0c;影响测试结果的准确性和可信度。 造成自动化测试结果有误差的原因主要有以下两类&#xff1a; 系统误差&#xff1a…

服务器黑洞,如何秒解

想必这样的短信大家都应该见过吧&#xff0c;这其实是阿里云服务器被攻击后触发的黑洞机制的短信通知。还有很多朋友不知道&#xff0c;为什么要这么做。原因其实很简单啊&#xff0c;当同一个机房的ip段&#xff0c;如果说有一台服务器遭受低道攻击&#xff0c;那么很可能会造…

手机知识:手机“飞行模式”你真的会用吗,看完你就懂了

目录 “飞行模式”的实用技能 关于手机的谣言 回想一下&#xff0c;当你第一次知道手机上的“飞行模式”时&#xff0c;你认为这是一个怎样的功能&#xff1f; 普通青年&#xff1a;在飞机上要使用的模式。 文艺青年&#xff1a;手机终日忙忙碌碌&#xff0c;偶尔也需要放飞…

香港高端人才通行证计划申请攻略:条件+材料清单+流程!

香港高端人才通行证计划申请攻略&#xff1a;条件材料清单流程&#xff01; 香港高才通计划希望吸引世界各地具备丰富工作经验及高学历的人才到香港探索机遇&#xff0c;这些高端人才包括高收入人士和在世界顶尖大学毕业的学生。 此计划并不适用于阿富汗、古巴、老挝、朝鲜、尼…

视觉问答(VQA)12篇顶会精选论文合集,附常用数据集下载

今天来聊聊计算机视觉和自然语言处理交叉的一个热门研究方向&#xff1a;视觉问答&#xff08;VQA&#xff09;。 视觉问答的任务是&#xff1a;给出一张图片和一个关于这张图片的自然语言问题&#xff0c;计算机需要根据图片的内容自动回答这个问题。这样的任务考验了计算机在…

ucgui 画圆弧时圆弧有缺口

一、问题描述 使用抗锯齿的方式画圆弧&#xff0c;在画到90的位置时&#xff0c;那个位置刚好没画上&#xff0c;留了个缺口&#xff0c;其他位置一切绘制正常。 使用非抗锯齿的方式画圆弧&#xff0c;没出现缺口。 二、问题原因 当初在移植ucgui 时&#xff0c;底层函数 …

【2021研电赛】基于图像处理的物体识别与分类系统

本作品介绍参与极术社区的有奖征集|分享研电赛作品扩大影响力&#xff0c;更有重磅电子产品免费领取! 团队介绍 学校名称&#xff1a;北京理工大学 队伍名称&#xff1a;BIT铁头帮 指导教师&#xff1a;冯云鹏 队伍成员&#xff1a;余佳桐 孙雨婷 朱翊铭 获奖情况&#xff1a…