TI中文支持网
TI专业的中文技术问题搜集分享网站

请教ADS1256单道通读取时前面AD0~AD3读取数据准确,AD4~AD7读取异常

在使用ADS1256读取数据时,前面AD0~AD3读取的数据都正确。但是AD4~AD7不管有没有电压,其读取的数据大概是1953600。我使用的基准电压是2.5V的,其芯片的18及19接晶振是8M的。下面贴了代码,麻烦帮分析一下原因,谢谢!

调用的方法类似下面,前面0~3通道的调用都正常,4~7通道不管是只采集其中一个通道,还是几个都按下面的方法采集出来的数据就是不对。调用方法如下:

ADS_sum(ADS1256_MUXP_AIN0|ADS1256_MUXN_AINCOM);

ADS_sum(ADS1256_MUXP_AIN1|ADS1256_MUXN_AINCOM);

ADS_sum(ADS1256_MUXP_AIN2|ADS1256_MUXN_AINCOM);

ADS_sum(ADS1256_MUXP_AIN3|ADS1256_MUXN_AINCOM);

ADS_sum(ADS1256_MUXP_AIN4|ADS1256_MUXN_AINCOM);

ADS_sum(ADS1256_MUXP_AIN5|ADS1256_MUXN_AINCOM);

ADS_sum(ADS1256_MUXP_AIN6|ADS1256_MUXN_AINCOM);

ADS_sum(ADS1256_MUXP_AIN7|ADS1256_MUXN_AINCOM);

#ifndef __ADS1247_h
#define __ADS1247_h
/*****************************头文件包含*****************************************/
#include "stm32f10x.h"
/********************************************************************************/
/******************ads1248寄存器地址*******************/
// define commands 
#define ADS1256_CMD_WAKEUP   0x00     //完成SYNC和退出待机模式
#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     //同步AD转换 
#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
/******************ads1256引脚设置*******************/
#define ADS_DRDY ((GPIOB->IDR)&(1<<0))
#define RESET_HIGH()        1
#define RESET_LOW()         0
#define ADS_CS              GPIO_Pin_4
#define ADS_CS_LOW()        GPIO_ResetBits(GPIOC, ADS_CS)
#define ADS_CS_HIGH()       GPIO_SetBits(GPIOC, ADS_CS)
void SPI_ADS1256_Init(void);
void ADS1256_GPIO_init(void);
void ADS1256_Init(void);
//void ADS_sum(unsigned char road);
unsigned long ADS_sum(unsigned char road);
u8 SPI_SendByte(u8 byte);
unsigned long ADS1256ReadData(void);
void ADS1256WREG(unsigned char regaddr,unsigned char databyte);
#endif

下面是.C文件

#include "ads1256.h"
#include "delay.h"
/*******************************************************************************
* Function Name  : SPI_FLASH_Init
* Description    : Initializes the peripherals used by the SPI FLASH driver.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void SPI_ADS1256_Init(void)
{
    SPI_InitTypeDef  SPI_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    /* Enable SPI1 and GPIO clocks */
    /*!< SPI_FLASH_SPI_CS_GPIO, SPI_FLASH_SPI_MOSI_GPIO, 
    SPI_FLASH_SPI_MISO_GPIO, SPI_FLASH_SPI_DETECT_GPIO 
    and SPI_FLASH_SPI_SCK_GPIO Periph clock enable */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
    /*!< SPI_FLASH_SPI Periph clock enable */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
    /*!< AFIO Periph clock enable */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;                    //
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推免输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    /*!< Configure SPI_FLASH_SPI pins: DOUT */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;                    //
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    /* Deselect the FLASH: Chip Select high */
    /* SPI1 configuration */
    // 在SCLK下降沿,系统通过DIN向1256发送数据 
    // 在SCLK上升沿,系统通过DOUT 读取1256数据
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;   //两线全双工
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;   //主机模式
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;   //8位模式
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;   //SCLK空闲时位低电平
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;   //SCLK的下降沿采集数据
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;   //从机选择信号,软件模式,就是用GPIO选择从机
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;   //APB2或者APB1总线频率的1/2~1/256分频
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;   //数据传输从MSB位开始
    SPI_InitStructure.SPI_CRCPolynomial = 7;   //CRC值计算的多项式
    SPI_Init(SPI1, &SPI_InitStructure);
    /* Enable SPI1  */
    SPI_Cmd(SPI1, ENABLE);
}
/*******************************************************************************
* Function Name  : SPI_FLASH_SendByte
* Description    : Sends a byte through the SPI interface and return the byte
*                  received from the SPI bus.
* Input          : byte : byte to send.
* Output         : None
* Return         : The value of the received byte.
*******************************************************************************/
u8 SPI_SendByte(u8 byte)
{
  /* Loop while DR register in not emplty */
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
  /* Send byte through the SPI1 peripheral */
  SPI_I2S_SendData(SPI1, byte);
  /* Wait to receive a byte */
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
  /* Return the byte read from the SPI bus */
  return SPI_I2S_ReceiveData(SPI1);
}
/*******************************************************************
函数名:初始化DAC接口
函数原型:void ADC_gpio_init()
参数说明:无
返回:  无
********************************************************************/
void ADS1256_GPIO_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/////////CS  reset 引脚设置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_4;// | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP; //–推免输出模式
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_10MHz; //–GPIO翻转速度为50MHz
GPIO_Init(GPIOC , &GPIO_InitStructure); //–将配置写入对应的GPIO寄存器中
// GPIO_InitTypeDef GPIO_InitStructure;
    ///////// DRDY引脚设置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//GPIO_InitStructure.GPIO_Pin= GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN_FLOATING; //–浮点输入模式
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz; //–GPIO翻转速度为50MHz
//GPIO_Init(GPIOA , &GPIO_InitStructure); //–将配置写入对应的GPIO寄存器中
    GPIO_Init(GPIOB , &GPIO_InitStructure); //–将配置写入对应的GPIO寄存器中
}
//—————————————————————–//
// 功    能:ADS1256 写数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备    注: 向ADS1256中地址为regaddr的寄存器写入一个字节databyte
//—————————————————————–//
void ADS1256WREG(unsigned char regaddr,unsigned char databyte)
{
    ADS_CS_LOW();
while(ADS_DRDY);//当ADS1256_DRDY为低时才能写寄存器
//向寄存器写入数据地址
    SPI_SendByte(ADS1256_CMD_WREG | (regaddr & 0xF));
    //写入数据的个数n-1
    SPI_SendByte(0);
    //向regaddr地址指向的寄存器写入数据databyte
  delay_us(5);
    SPI_SendByte(databyte);
ADS_CS_HIGH();
}
//—————————————————————–//
// 功    能:ADS1256 读寄存器数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备    注: 从ADS1256中地址为regaddr的寄存器读出一个字节databyte
//—————————————————————–//
unsigned char ADS1256RREG(unsigned char regaddr)
{
    //从ADS1256中地址为regaddr的寄存器读出一个字节
    unsigned char r=0;
    ADS_CS_LOW();
while(ADS_DRDY);//当ADS1256_DRDY为低时才能写寄存器
//写入地址
    SPI_SendByte(ADS1256_CMD_RREG | (regaddr & 0xF));
    //写入读取数据的个数n-1
    SPI_SendByte(0);
  delay_us(10);  //min=50*(1/fCLKIN)=50*(1/7.68MHZ)=6500ns;max=whatever
    //读出regaddr地址指向的寄存器的数据
    r=SPI_SendByte(0);
  ADS_CS_HIGH();
    return r;//返回数据
}
//—————————————————————–//
// 功    能:ADS1256初始化子程序
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备    注: /
//—————————————————————–//
void ADS1256_Init(void)
{     
ADS_CS_LOW();
delay_us(100);
SPI_SendByte(ADS1256_CMD_REST);
delay_ms(10);
while(ADS_DRDY);                                //当ADS1256_DRDY为低时才能写寄存器
SPI_SendByte(ADS1256_CMD_SYNC);                 //同步命令
SPI_SendByte(ADS1256_CMD_WAKEUP);               //同步唤醒
while(ADS_DRDY);
SPI_SendByte(ADS1256_CMD_WREG | ADS1256_STATUS);//连续写入5个寄存器
SPI_SendByte(4);
SPI_SendByte(0x04);                             //高位在前,使用内部校准,不使用缓存
SPI_SendByte(ADS1256_MUXN_AIN0|ADS1256_MUXN_AINCOM);//端口输入A2为正,A3位负
SPI_SendByte(ADS1256_GAIN_1);                   //放大倍数设置
SPI_SendByte(ADS1256_DRATE_10SPS);             //采集速度设置
SPI_SendByte(0x00);                            //IO设置0
   
    delay_us(100);
while(ADS_DRDY);                                //当ADS1256_DRDY为低时才能写寄存器
SPI_SendByte(ADS1256_CMD_SELFCAL);              //偏移和增益自动校准
    ADS_CS_HIGH();
delay_ms(100);
 
}
//—————————————————————–//
// 功    能:
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备    注:
//—————————————————————–//
unsigned long ADS1256ReadData(void)  
{
    unsigned long sum=0;
    ADS_CS_LOW();
    while(ADS_DRDY);               //当ADS1256_DRDY为低时才能写寄存器 
    
    SPI_SendByte(ADS1256_CMD_SYNC);
    SPI_SendByte(ADS1256_CMD_WAKEUP);
    SPI_SendByte(ADS1256_CMD_RDATA);//ADS1256_CMD_RDATAC–连续读 ADS1256_CMD_SDATAC–停止连续读 
    delay_us(10);                  //min=50*(1/fCLKIN)=50*(1/7.68MHZ)=6500ns;max=whatever
    sum |= (SPI_SendByte(0x0) << 16);
    sum |= (SPI_SendByte(0x0) << 8);
    sum |= SPI_SendByte(0x0);
    ADS_CS_HIGH();  
    return sum;
}
//—————————————————————–//
// 功    能:读取ADS1256单路数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备    注: /
//—————————————————————–//
unsigned long ADS_sum(unsigned char road)
{
unsigned long Result_sum=0;
ADS1256WREG(ADS1256_MUX,road); //设置通道
Result_sum = ADS1256ReadData();//读取AD值,返回24位数据。
return Result_sum;
}
user151383853:

前面AD0~AD3读取的数据都正确。但是AD4~AD7不管有没有电压,其读取的数据大概是1953600。

应该是个配置问题.

user5347872:

回复 user151383853:

代码已经帖上了, 麻烦能不能帮我看下,具体是那个地方有问题。谢谢

赞(0)
未经允许不得转载:TI中文支持网 » 请教ADS1256单道通读取时前面AD0~AD3读取数据准确,AD4~AD7读取异常
分享到: 更多 (0)