打印
[STM32]

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

[复制链接]
4238|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
使用STM32单片机硬件(SPI),ADS1120芯片程序是出现通道之间数据相串(将信号输入IN0,其余的两个通道(IN1、IN2)出现ADC值一样);电路图如下:
在程序上我是使用硬件的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<RxLenth; 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();
}









file:///C:\Users\Administrator\Documents\Tencent Files\414941286\Image\C2C\Z756CXS]$ZS@A8W(WQPO)ER.png

file:///C:\Users\Administrator\Documents\Tencent Files\414941286\Image\C2C\Z756CXS]$ZS@A8W(WQPO)ER.png



相关帖子

沙发
xyz549040622| | 2018-4-20 09:04 | 只看该作者
1.要么是你软件读取错误了,也就是驱动错了,检查办法,分别给三个IO不同的电平,分别拉高或者拉低,检查驱动是否OK
2.要么是你硬件焊接连在了一起。

使用特权

评论回复
板凳
xu0801hua|  楼主 | 2018-4-22 23:58 | 只看该作者
xyz549040622 发表于 2018-4-20 09:04
1.要么是你软件读取错误了,也就是驱动错了,检查办法,分别给三个IO不同的电平,分别拉高或者拉低,检查驱 ...

谢谢回复,你所说的问题我检查了,没出现你提醒的问题,这程序取得我也使用C51模拟的SPI总线尝试了,出现的问题一样,读数都一致;

使用特权

评论回复
地板
xyz549040622| | 2018-4-23 07:04 | 只看该作者
xu0801hua 发表于 2018-4-22 23:58
谢谢回复,你所说的问题我检查了,没出现你提醒的问题,这程序取得我也使用C51模拟的SPI总线尝试了,出现 ...

那就怀疑硬件方面的问题吧,首先,你换一片好的ADS1120试试。

使用特权

评论回复
5
chg0823chg| | 2019-2-19 10:48 | 只看该作者
您的ADS1120的问题解决了么?我遇到了和你相同的问题,求教

使用特权

评论回复
6
HQing1| | 2019-2-27 18:50 | 只看该作者
本帖最后由 HQing1 于 2019-2-27 18:51 编辑

怎么解决的啊,能给个完整点的代码?

使用特权

评论回复
7
mmmario| | 2019-11-6 13:43 | 只看该作者
大哥,我用的ads120和stm32f103c8t6,采集数据然后用蓝牙发送到手机,用你的陈旭修改的一直没用。麻烦救一下吧

使用特权

评论回复
8
xu0801hua|  楼主 | 2019-11-13 10:03 | 只看该作者
mmmario 发表于 2019-11-6 13:43
大哥,我用的ads120和stm32f103c8t6,采集数据然后用蓝牙发送到手机,用你的陈旭修改的一直没用。麻烦救一下 ...

关于代码是没问题的,我想大概是芯片不正规导致的,我后来使用正规的问题有改善

使用特权

评论回复
9
xu0801hua|  楼主 | 2019-11-13 10:03 | 只看该作者
HQing1 发表于 2019-2-27 18:50
怎么解决的啊,能给个完整点的代码?

代码是没问题的,大概是芯片有问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

81

帖子

1

粉丝