关于ADS1120数据采集通道问题?

2020-03-15 21:28发布

使用STM32单片机硬件(SPI),ADS1120芯片程序是出现通道之间数据相串(将信号输入IN0,其余的两个通道(IN1、IN2)出现ADC值一样);电路图如下:

ADS1120图 ADS1120图 STM32连接图 STM32连接图 AD通道值一直 AD通道值一直 输入值 输入值

在程序上我是使用硬件的SPI程序:


#include "ADS1120.h"




unsigned char channel0[8],channel1[8],Init_Config[4];





void SPI3_Init(void)


{


        GPIO_InitTypeDef GPIO_InitStructure;


        SPI_InitTypeDef  SPI_InitStructure;


        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);//PORTB时钟使能


        RCC_APB1PeriphClockCmd(        RCC_APB1Periph_SPI3,  ENABLE );//SPI3时钟使能        


        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_2;


        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB3/4/5复用推挽输出


        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB


                
        GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);  //PB3/4/5上拉


        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//



        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工


        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI


        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //设置SPI的数据大小:SPI发送接收8位帧结构


        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //串行同步时钟的空闲状态为高电平


        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //串行同步时钟的第二个跳变沿(上升或下降)数据被采样


        SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;//SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制


        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //定义波特率预分频的值:波特率预分频值为256


        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始


        SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式


        SPI_Init(SPI3, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器



        SPI_Cmd(SPI3, ENABLE); //使能SPI外设



        SPI3_ReadWriteByte(0xFF);//启动传输                 



}   


/***************************************************************************


* Function Name:  SPI3_SetSpeed(u8 SPI_BaudRatePrescaler)


* Purpose:                           SPI velocity


* Params :        1.SPI_BaudRatePrescaler:速率


*


*************************************************************************/  


//SPI 速度设置函数


//SpeedSet:


//SPI_BaudRatePrescaler_2   2分频   


//SPI_BaudRatePrescaler_8   8分频   


//SPI_BaudRatePrescaler_16  16分频  


//SPI_BaudRatePrescaler_256 256分频


void SPI3_SetSpeed(u8 SPI_BaudRatePrescaler)


{


  assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));


        SPI3->CR1&=0XFFC7;


        SPI3->CR1|=SPI_BaudRatePrescaler;        //设置SPI3速度


        SPI_Cmd(SPI3,ENABLE);



}


//SPIx 读写一个字节


//TxData:要写入的字节


//返回值:读取到的字节


u8 SPI3_ReadWriteByte(u8 TxData)


{                       


        u8 retry=0;               


        ADS11XX_CS = 0;       


        while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位


                {


                retry++;


                if(retry>200)return 0;


                }                          


        SPI_I2S_SendData(SPI3, TxData); //通过外设SPIx发送一个数据


        retry=0;



        while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位


                {


                retry++;


                if(retry>200)return 0;


                }          


        ADS11XX_CS = 1;


        return SPI_I2S_ReceiveData(SPI3); //返回通过SPIx最近接收的数据                                            


}


/****************************************************************


  *

@brief

  ADS1120_WriteRead.


  * @param  None


  * @retval None


  */


void ADS1120_WriteRead(uint8_t Byte, uint8_t *RxBuffer,uint16_t RxLenth)


{


        int i;


        SPI3_ReadWriteByte(Byte);


        for(i=0; i

        {
                        *RxBuffer = SPI3_ReadWriteByte(0xFF);
                        RxBuffer++;
        }
}

/***************************************************************************
* Function Name:  void ADS1120_RESET(void)        
* Purpose:                           reset ADS1120
* Params :        
*
*************************************************************************/
void ADS1120_RESET(void)
{
        SPI3_ReadWriteByte(ADS1220_RESET_CMD);        //ADS1120复位
}
//
void ADS1120_START()
{
        SPI3_ReadWriteByte(ADS1220_START_CMD);        //ADS1120复位
}
/***************************************************************************
* Function Name:  ReadData()        
* Purpose:           read data from ADS1120
* Params :        result 0~65535
*
*************************************************************************/
unsigned int ReadData(void)
{
    unsigned int result;
                uint8_t buf[3];
                ADS1120_WriteRead(ADS1220_RDATA_CMD,buf,3);
    result = buf[0];
                result = result*256+buf[1];
                result = result*256+buf[2];
                result = result/256;
    return result;
}
/***************************************************************************
* Function Name:  ADPowerDown()        
* Purpose:           
* Params :        
*
*************************************************************************/
void ADPowerDown(void)
{
    SPI3_ReadWriteByte(ADS1220_POWERDOWN_CMD);
}
/***************************************************************************
* Function Name:  ADStartConversion()        
* Purpose:           start conversion
* Params :        
*
*************************************************************************/
void ADStartConversion(void)
{
    SPI3_ReadWriteByte(ADS1220_START_CMD);
}
/***************************************************************************
* Function Name:  ReadRegister()        
* Purpose:           read data from register
* Params :        data 
*
*************************************************************************/
void ReadRegister(void)
{
    unsigned char i;
    unsigned long Data;
    SPI3_ReadWriteByte(ADS1220_RREG_CMD|0x03);
        // get the register content
                for (i=0; i< 4; i++)
                {
                         Data += SPI3_ReadWriteByte(0xFF);
                }

                return;
}
/***************************************************************************
* Function Name:  WriteRegister(unsigned char StartAddress, unsigned char NumRegs, unsigned char * pData)        
* Purpose:           write data to register
* steps:          1.write address  2.write data  
* Params          NumRegs-----the numbers of register
*************************************************************************/
void WriteRegister(unsigned char StartAddress, unsigned char NumRegs, unsigned char * pData)
{
    unsigned char i;
    // send the command byte
    SPI3_ReadWriteByte(ADS1220_WREG_CMD | (((StartAddress<<2) & 0x0c) |((NumRegs-1)&0x03)));
    // send the data bytes
    for (i=0; i< NumRegs; i++)
    {
      SPI3_ReadWriteByte(*pData);
      pData++;
    }
    return;
}
/***************************************************************************
* Function Name:  CofigAD(unsigned char channel)        
* Purpose:           set the sampling channel
* Params :        
*
*************************************************************************/
void CofigAD(unsigned char channel)
{
                switch(channel)
    {
    case 0: Init_Config[0] = 0x81;
//                                                Init_Config[3] = 0x30;
            break;
    case 1: Init_Config[0] = 0x91;
//                                                Init_Config[3] = 0x50;
            break;
    case 2: Init_Config[0] = 0xA1;
//                                                Init_Config[3] = 0x70;
                                                break;

                case 3: Init_Config[0] = 0xB1;
                    
            break;
    }
    Init_Config[1] = 0X00;//Init_Config[1] = 0XC0;
    Init_Config[2] = 0X40;//0X50;//Init_Config[2] = 0X40;
    Init_Config[3] = 0X00;
    WriteRegister(0x00,0x04,Init_Config);
    ReadRegister();
}
/***************************************************************************
* Function Name:  SetChannelPGA(uchar channel, uchar gain)        
* Purpose:           set the sampling channel  and  the gain
* Params :        
*
*************************************************************************/
void SetChannelPGA(u8 channel, u8 gain)
{
        
  switch(channel)
    {
    case 0: 
      if(gain==1)
        channel0[0] = 0x81;

      if(gain==2)
        channel0[1] = 0x83;
      if(gain==4)
        channel0[2] = 0x85;
      if(gain==8)
        channel0[3] = 0x87;
      if(gain==16)
        channel0[4] = 0x89;
      if(gain==32)
        channel0[5] = 0x8B;
      if(gain==64)
        channel0[6] = 0x8D;
      if(gain==128)
        channel0[7] = 0x8F;
      break;
    case 1: 
      if(gain==1)
        channel1[0] = 0x91;
      if(gain==2)
        channel1[1] = 0x93;
      if(gain==4)
        channel1[2] = 0x95;
      if(gain==8)
        channel1[3] = 0x97;
      if(gain==16)
        channel1[4] = 0x99;
      if(gain==32)
        channel1[5] = 0x9B;
      if(gain==64)
        channel1[6] = 0x9D;
      if(gain==128)
        channel0[7] = 0x9F;
            break;
    case 2: Init_Config[0] = 0xA1;
            break;
    case 3: Init_Config[0] = 0xB1;
            break;
    }
}
/***************************************************************************
* Function Name:  GetAD(unsigned char channel)        
* Purpose:           get the result 
* Params :        Result 0~65535
*
*************************************************************************/
unsigned int GetAD(unsigned char channel)
{
    unsigned int Result;
    CofigAD(channel);
    ADStartConversion();
//    while(DRDY_IN);
    Result = ReadData();
    ADPowerDown();
    return Result;
}
//初始化ADS1120
void ADS1120_Init(void)
{
        SPI3_Init();
        SPI3_SetSpeed(SPI_BaudRatePrescaler_8);//设置为18M时钟,高速模式
        ADS1120_RESET();
}












使用STM32单片机硬件(SPI),ADS1120芯片程序是出现通道之间数据相串(将信号输入IN0,其余的两个通道(IN1、IN2)出现ADC值一样);电路图如下:

ADS1120图 ADS1120图 STM32连接图 STM32连接图 AD通道值一直 AD通道值一直 输入值 输入值

在程序上我是使用硬件的SPI程序:


#include "ADS1120.h"




unsigned char channel0[8],channel1[8],Init_Config[4];





void SPI3_Init(void)


{


        GPIO_InitTypeDef GPIO_InitStructure;


        SPI_InitTypeDef  SPI_InitStructure;


        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);//PORTB时钟使能


        RCC_APB1PeriphClockCmd(        RCC_APB1Periph_SPI3,  ENABLE );//SPI3时钟使能        


        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_2;


        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB3/4/5复用推挽输出


        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB


                
        GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);  //PB3/4/5上拉


        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//



        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工


        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI


        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //设置SPI的数据大小:SPI发送接收8位帧结构


        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //串行同步时钟的空闲状态为高电平


        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //串行同步时钟的第二个跳变沿(上升或下降)数据被采样


        SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;//SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制


        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //定义波特率预分频的值:波特率预分频值为256


        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始


        SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式


        SPI_Init(SPI3, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器



        SPI_Cmd(SPI3, ENABLE); //使能SPI外设



        SPI3_ReadWriteByte(0xFF);//启动传输                 



}   


/***************************************************************************


* Function Name:  SPI3_SetSpeed(u8 SPI_BaudRatePrescaler)


* Purpose:                           SPI velocity


* Params :        1.SPI_BaudRatePrescaler:速率


*


*************************************************************************/  


//SPI 速度设置函数


//SpeedSet:


//SPI_BaudRatePrescaler_2   2分频   


//SPI_BaudRatePrescaler_8   8分频   


//SPI_BaudRatePrescaler_16  16分频  


//SPI_BaudRatePrescaler_256 256分频


void SPI3_SetSpeed(u8 SPI_BaudRatePrescaler)


{


  assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));


        SPI3->CR1&=0XFFC7;


        SPI3->CR1|=SPI_BaudRatePrescaler;        //设置SPI3速度


        SPI_Cmd(SPI3,ENABLE);



}


//SPIx 读写一个字节


//TxData:要写入的字节


//返回值:读取到的字节


u8 SPI3_ReadWriteByte(u8 TxData)


{                       


        u8 retry=0;               


        ADS11XX_CS = 0;       


        while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位


                {


                retry++;


                if(retry>200)return 0;


                }                          


        SPI_I2S_SendData(SPI3, TxData); //通过外设SPIx发送一个数据


        retry=0;



        while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位


                {


                retry++;


                if(retry>200)return 0;


                }          


        ADS11XX_CS = 1;


        return SPI_I2S_ReceiveData(SPI3); //返回通过SPIx最近接收的数据                                            


}


/****************************************************************


  *

@brief

  ADS1120_WriteRead.


  * @param  None


  * @retval None


  */


void ADS1120_WriteRead(uint8_t Byte, uint8_t *RxBuffer,uint16_t RxLenth)


{


        int i;


        SPI3_ReadWriteByte(Byte);


        for(i=0; i

        {
                        *RxBuffer = SPI3_ReadWriteByte(0xFF);
                        RxBuffer++;
        }
}

/***************************************************************************
* Function Name:  void ADS1120_RESET(void)        
* Purpose:                           reset ADS1120
* Params :        
*
*************************************************************************/
void ADS1120_RESET(void)
{
        SPI3_ReadWriteByte(ADS1220_RESET_CMD);        //ADS1120复位
}
//
void ADS1120_START()
{
        SPI3_ReadWriteByte(ADS1220_START_CMD);        //ADS1120复位
}
/***************************************************************************
* Function Name:  ReadData()        
* Purpose:           read data from ADS1120
* Params :        result 0~65535
*
*************************************************************************/
unsigned int ReadData(void)
{
    unsigned int result;
                uint8_t buf[3];
                ADS1120_WriteRead(ADS1220_RDATA_CMD,buf,3);
    result = buf[0];
                result = result*256+buf[1];
                result = result*256+buf[2];
                result = result/256;
    return result;
}
/***************************************************************************
* Function Name:  ADPowerDown()        
* Purpose:           
* Params :        
*
*************************************************************************/
void ADPowerDown(void)
{
    SPI3_ReadWriteByte(ADS1220_POWERDOWN_CMD);
}
/***************************************************************************
* Function Name:  ADStartConversion()        
* Purpose:           start conversion
* Params :        
*
*************************************************************************/
void ADStartConversion(void)
{
    SPI3_ReadWriteByte(ADS1220_START_CMD);
}
/***************************************************************************
* Function Name:  ReadRegister()        
* Purpose:           read data from register
* Params :        data 
*
*************************************************************************/
void ReadRegister(void)
{
    unsigned char i;
    unsigned long Data;
    SPI3_ReadWriteByte(ADS1220_RREG_CMD|0x03);
        // get the register content
                for (i=0; i< 4; i++)
                {
                         Data += SPI3_ReadWriteByte(0xFF);
                }

                return;
}
/***************************************************************************
* Function Name:  WriteRegister(unsigned char StartAddress, unsigned char NumRegs, unsigned char * pData)        
* Purpose:           write data to register
* steps:          1.write address  2.write data  
* Params          NumRegs-----the numbers of register
*************************************************************************/
void WriteRegister(unsigned char StartAddress, unsigned char NumRegs, unsigned char * pData)
{
    unsigned char i;
    // send the command byte
    SPI3_ReadWriteByte(ADS1220_WREG_CMD | (((StartAddress<<2) & 0x0c) |((NumRegs-1)&0x03)));
    // send the data bytes
    for (i=0; i< NumRegs; i++)
    {
      SPI3_ReadWriteByte(*pData);
      pData++;
    }
    return;
}
/***************************************************************************
* Function Name:  CofigAD(unsigned char channel)        
* Purpose:           set the sampling channel
* Params :        
*
*************************************************************************/
void CofigAD(unsigned char channel)
{
                switch(channel)
    {
    case 0: Init_Config[0] = 0x81;
//                                                Init_Config[3] = 0x30;
            break;
    case 1: Init_Config[0] = 0x91;
//                                                Init_Config[3] = 0x50;
            break;
    case 2: Init_Config[0] = 0xA1;
//                                                Init_Config[3] = 0x70;
                                                break;

                case 3: Init_Config[0] = 0xB1;
                    
            break;
    }
    Init_Config[1] = 0X00;//Init_Config[1] = 0XC0;
    Init_Config[2] = 0X40;//0X50;//Init_Config[2] = 0X40;
    Init_Config[3] = 0X00;
    WriteRegister(0x00,0x04,Init_Config);
    ReadRegister();
}
/***************************************************************************
* Function Name:  SetChannelPGA(uchar channel, uchar gain)        
* Purpose:           set the sampling channel  and  the gain
* Params :        
*
*************************************************************************/
void SetChannelPGA(u8 channel, u8 gain)
{
        
  switch(channel)
    {
    case 0: 
      if(gain==1)
        channel0[0] = 0x81;

      if(gain==2)
        channel0[1] = 0x83;
      if(gain==4)
        channel0[2] = 0x85;
      if(gain==8)
        channel0[3] = 0x87;
      if(gain==16)
        channel0[4] = 0x89;
      if(gain==32)
        channel0[5] = 0x8B;
      if(gain==64)
        channel0[6] = 0x8D;
      if(gain==128)
        channel0[7] = 0x8F;
      break;
    case 1: 
      if(gain==1)
        channel1[0] = 0x91;
      if(gain==2)
        channel1[1] = 0x93;
      if(gain==4)
        channel1[2] = 0x95;
      if(gain==8)
        channel1[3] = 0x97;
      if(gain==16)
        channel1[4] = 0x99;
      if(gain==32)
        channel1[5] = 0x9B;
      if(gain==64)
        channel1[6] = 0x9D;
      if(gain==128)
        channel0[7] = 0x9F;
            break;
    case 2: Init_Config[0] = 0xA1;
            break;
    case 3: Init_Config[0] = 0xB1;
            break;
    }
}
/***************************************************************************
* Function Name:  GetAD(unsigned char channel)        
* Purpose:           get the result 
* Params :        Result 0~65535
*
*************************************************************************/
unsigned int GetAD(unsigned char channel)
{
    unsigned int Result;
    CofigAD(channel);
    ADStartConversion();
//    while(DRDY_IN);
    Result = ReadData();
    ADPowerDown();
    return Result;
}
//初始化ADS1120
void ADS1120_Init(void)
{
        SPI3_Init();
        SPI3_SetSpeed(SPI_BaudRatePrescaler_8);//设置为18M时钟,高速模式
        ADS1120_RESET();
}












9条回答
 精彩回答 2  声望值 偷偷看……
查看更多
xu0801hua   
  • 67  
  • 43  技术员
    2楼-- · 2020-03-16 04:05
    xyz549040622 发表于 2018-4-20 09:04
    1.要么是你软件读取错误了,也就是驱动错了,检查办法,分别给三个IO不同的电平,分别拉高或者拉低,检查驱 ...

    谢谢回复,你所说的问题我检查了,没出现你提醒的问题,这程序取得我也使用C51模拟的SPI总线尝试了,出现的问题一样,读数都一致;
    查看更多
    xu0801hua 发表于 2018-4-22 23:58
    谢谢回复,你所说的问题我检查了,没出现你提醒的问题,这程序取得我也使用C51模拟的SPI总线尝试了,出现 ...

    那就怀疑硬件方面的问题吧,首先,你换一片好的ADS1120试试。
    查看更多
    您的ADS1120的问题解决了么?我遇到了和你相同的问题,求教
    查看更多
    HQing1   
  • 54  
  • 164  技术员
    5楼-- · 2020-03-16 16:05
    本帖最后由 HQing1 于 2019-2-27 18:51 编辑

    怎么解决的啊,能给个完整点的代码?
    查看更多
    mmmario   
  • 208  
  • 571  技术员
    6楼-- · 2020-03-16 20:43
     精彩回答 2  声望值 偷偷看……
    查看更多
    xu0801hua   
  • 67  
  • 43  技术员
    7楼-- · 2020-03-16 23:35
    mmmario 发表于 2019-11-6 13:43
    大哥,我用的ads120和stm32f103c8t6,采集数据然后用蓝牙发送到手机,用你的陈旭修改的一直没用。麻烦救一下 ...

    关于代码是没问题的,我想大概是芯片不正规导致的,我后来使用正规的问题有改善
    查看更多
    xu0801hua   
  • 67  
  • 43  技术员
    8楼-- · 2020-03-17 04:06
     精彩回答 2  声望值 偷偷看……
    查看更多

    一周热门 更多>