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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云原生环境下JAVA应用容器JVM内存如何配置?—— 筑梦之路

Docker环境下的JVM参数非定值配置 —— 筑梦之路_docker jvm设置-CSDN博客 之前简单地记录过一篇&#xff0c;这里在之前的基础上更加细化一下。 场景说明 使用Java开发且设置的JVM堆空间过小时&#xff0c;程序会出现系统内存不足OOM&#xff08;Out of Memory&#xff09;的…

词典查询工具django-mdict

什么是 django-mdict &#xff1f; django-mdict 不是词典软件&#xff0c;是词典查询的脚本工具&#xff0c;主要目的是解决词典数量多&#xff0c;手机容量不足的问题&#xff0c;是对其他词典软件局域网在线查询功能的补充&#xff0c;是用 django 实现的 mdict 词典查询工具…

微信小程序上传图片和上传视频的组件失效

微信小程序上传图片和上传视频的组件失效 今天公司的小程序展示图片和视频文字的页面上传图片组件突然失效&#xff0c;之前用的好好的&#xff0c;突然所有使用都都发现用不了&#xff0c;以为是代码出现问题&#xff0c;反复查了很久。换了一个openid居然就可以了&#xff0…

B端设计必看的9个开源组件库,值得收藏!

如果你想开发一款To B Web端产品&#xff0c;如何选择令人眼花缭乱的开源组件库&#xff1f;行业团队常用的B端开源组件库是什么&#xff1f;今天&#xff0c;我们将为您带来入门级开源组件库的介绍。你可以先有一个大致的了解&#xff0c;希望能对你有所帮助。未来&#xff0c…

MySQL 存储引擎

存储引擎&#xff1a;MySQL当中数据用各种不同的技术存储在文件中&#xff0c;每一种技术都使用的是不同的存储机制&#xff0c;索引技巧 锁定水平。以及最终提供的不同功能和能力&#xff0c;这写就是我们说的存储引擎。 功能&#xff1a; 1&#xff0c;mysql将数据存储在文…

接口自动化测试 —— 工具、请求与响应

一、工具&#xff1a; 1.工具介绍 postman &#xff1a;很主流的API测试工具&#xff0c;也是工作里面使用最广泛的研发工具。 JMeter&#xff1a; ApiPost&#xff1a; 2.安装postman&#xff1a; 安装好直接打开&#xff0c;不用注册。 二、通信模式&#xff1a; 1、…

【golang】Reflect反射整理、值修改、反射结构体、应用

Reflect 整理 反射是用程序检查其所拥有的结构&#xff0c;尤其是类型的一种能力&#xff1b;这是元编程的一种形式。反射可以在运行时检查类型和变量&#xff0c;例如&#xff1a;它的大小、它的方法以及它能“动态地”调用这些方法。这对于没有源代码的包尤其有用。这是一个强…

vite搭建vue3项目

npm init vite-app 项目名称 如果没安装vite就按照提示安装一下 运行 Done. Now run: cd smartWaterSystemnpm install (or yarn)npm run dev (or yarn dev)运行成功页面

Pytest-Allure及Allure命令使用

一、Allure介绍 Allure是Pytest用于生成测试报告的框架&#xff0c;提供丰富的测试报告功能&#xff1b; 二、Allure安装 Allure安装分为2块&#xff0c;分别是pytest-Allure库安装&#xff0c;本地生成报告并导出的命令行allure安装&#xff1b; 1、pytest-Allure库安装 …

适合女生的副业有哪些?整理了六个靠谱副业,女生必看

在这个互联网时代下&#xff0c;女生对于经济独立变得越来越看重。她们与男生一样&#xff0c;对于工作认真努力、追求进步&#xff0c;并且对于副业有着强烈的渴望和热爱。事实上&#xff0c;她们在副业领域的表现要远远超过很多男生&#xff0c;这一点不可否认。 女生在副业方…

客服管理者如何调动客服人员的积极性?

客户是企业的财富&#xff0c;良好的客户服务体验可以有效地促进企业的销售和声誉&#xff0c;因此&#xff0c;客服工作显得尤为重要。而客服人员的积极性直接影响了整个客服部门的质量和效率。如何调动客服人员的积极性&#xff0c;成为了每个客服管理者都需要面对的难题。本…

管理如何实现制度流程化 流程表单化 表单信息化 信息标准化?

业务化、流程化、信息化、数字化、自动化、智能化&#xff0c;是企业业务管理发展路径的六个必经阶段 制度业务化&#xff0c;业务表单化&#xff0c;表单流程化、流程信息化、信息标准化、标准制度华。 制度流程化、流程表单化、表单信息化、信息标准化、标准制度华。 管理…

Ubuntu 20.04设置虚拟内存 (交换内存swap)解决内存不足

数据库服务器程序在运行起来之后&#xff0c;系统内存不足。 在系统监控中发现&#xff0c;当数据库服务程序启动后&#xff0c;占用了大量内存空间&#xff0c;导致系统的剩余的内存往往只有几十MB。 在ubuntu系统中&#xff0c;swap空间就是虚拟内存&#xff0c;所以考虑在磁…

实践笔记-docker-compose安装

docker-compose 1.在线安装2.离线安装 1.在线安装 # github下载&#xff08;太慢了或者直接下载不了&#xff09; curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-uname -s-uname -m -o /usr/local/bin/docker-compose # daocloud下载 c…

SSM校园设备管信息管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

选题理由 随着计算机网络及多媒体技术的广泛应用&#xff0c;互联网已成为高校办学的基础设施和必备条件&#xff0c;基于互联网的高校信息管理越来越综合化&#xff0c;越来越多的教学管理、行政管理工作将架构在互联网上&#xff0c;互联网正在变为学校实施教学、科研和管理…

Docker dnmp 多版本php安装 php8.2

Laravel9 开发需要用到php8.1以上的版本&#xff0c;而dnmp只支持到php8.0。安装php8.2的步骤如下&#xff1a; 1. 从/services/php80目录复制一份出来&#xff0c;重命名为php82&#xff0c;extensions目录只保留 install.sh 和 install-php-extensions 这两个文件 2. 修改.en…

https原理

首先说一下几个概念&#xff1a;对称加密、非对称加密 对称加密&#xff1a; 客户端和服务端使用同一个秘钥&#xff0c;分两种情况&#xff1a; 1、所有的客户端和服务端使用同一个秘钥&#xff0c;这个秘钥被泄漏后数据不再安全 2、每个客户端生成一个秘钥&…

时序预测 | Python实现ARIMA-CNN-LSTM差分自回归移动平均模型结合卷积长短期记忆神经网络时间序列预测

时序预测 | Python实现ARIMA-CNN-LSTM差分自回归移动平均模型结合卷积长短期记忆神经网络时间序列预测 目录 时序预测 | Python实现ARIMA-CNN-LSTM差分自回归移动平均模型结合卷积长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 …

低保真原型图:如何在设计初期就把握产品方向

在设计和开发数字产品时&#xff0c;原型图是一个至关重要的工具。原型图是产品设计的蓝图&#xff0c;它帮助设计师和开发者在产品开发过程中更好地理解和沟通他们的想法。在原型图领域&#xff0c;有一个广泛使用的概念&#xff0c;那就是“低保真原型图”。本文将探讨什么是…

中国人民大学与加拿大女王大学金融硕士—重要的是,你一直在努力

人虽然生下来就分三六九等&#xff0c;不同的人过着不同的生活&#xff0c;我的生活没办法选择&#xff0c;我只能尽我所能的让自己变得优秀。中国人民大学与加拿大女王大学金融硕士是我们无论怎样都可以变优秀的优质渠道。V13146152701 那么我们为什么要读研&#xff0c;读研…