微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > 求助ADS1118数据转换器

求助ADS1118数据转换器

时间:10-02 整理:3721RD 点击:

有关ADS1118,有以下疑问:

1、在以前的有关该芯片的帖子中,看到说,ALN0与ALN1做输入时,只能测量1V以下的直流电压,请问是这样吗?

2、看芯片手册上说ADS1118写入数据是下降沿有效,而读数据是上升沿有效。但是看以前的帖子中有说,读写数据都是下降沿有效,请问哪种是对的。

3、我现在送入配置字是,0X858A,2.048=fs,ALN0与ALN1做输入,单次转换开启。但是读回来的数据,一直就是某个数据,不管给多少电压都是这个值,,而且一直在变化,转化后大约是0.8V左右,好像读回来一直都是这个值。但是送入的配置字不同,读回来的数据不同。读回来的寄存器的值每次也不一样。

4、关于VCC的问题,3中读回来的的数据,当芯片给3.3的电压时,和芯片给5V电压表 的数据有很大的差别。但是,不管给什么模拟输入电压,读回来的数据没有什变化。

5、在送入配置字后,延时,再判断DOUT输出低电平则说明数据准备好可以读取。但是,在程序中加入该检测语句后,程序会一直卡在这里。但是,用一个延时语句,直接延时,这样可以读OUT的值。不知道为什么Dout不会有低电平出现,一直是高电平。

6、有关ADS1118的SPI时序的读写时序如下,不知道该程序,请帮忙看一下。

1)void SPI_Write_byte(uchar data)
{
uchar i=0;
for(i=0;i<8;i++)
{
SPI_delay_us();
//SPI_delay_us();
if(data&0x80)
SPI_SIMO_HIGH;
else
SPI_SIMO_LOW;
SPI_CLK_HIGH;
SPI_delay_us();
SPI_CLK_LOW; //发送数据
data=data<<1;
}
}

2)

uchar SPI_Rec_byte() //经测试,上、下降沿都可以接收数据
{
uchar i=0;
uchar Temp=0;
for(i=0;i<8;i++)
{
Temp=Temp<<1; //向左移位,这句需放在前面
SPI_CLK_HIGH;
SPI_delay_us();
SPI_CLK_LOW; //接收数据
if(SPI_SOMI_IN) //先收高位
Temp |=BIT0; //置1
else
Temp&=~BIT0; //可省略,默认就是0
SPI_delay_us();
}
return Temp;
}

测试过该时序基本没什么问题,但是所有的问题,都似乎说明是时序问题。

 现在也在写1118的驱动,同求解。

我以前写的驱动。。希望对你有帮助。

#include "msp430x54xA.h"

void ADS1118_GPIO_Init(void)

{

    P1OUT |= 0x02;                              // Set P1.1 for CS

    P1DIR |= 0x02;                          // Set P1.1 to output direction

    P3SEL |= 0x80;                          // P3.7 option select

    P5SEL |= 0x30;                                                                  // P5.4,5 option select

   

    P5DIR |= 0x01;                                                                 // Set P5.0 to output direction

}

 

void ADS1118_SPI_Init(void)

{

    UCB1CTL1 |= UCSWRST;                    // **Put state machine in reset**

    UCB1CTL0 |= UCMST+UCSYNC+UCMSB;              // 3-pin, 8-bit SPI master

                                            // Clock polarity high, MSB

    UCB1CTL1 |= UCSSEL_2;                   // SMCLK

    UCB1BR0 = 0x05;                         // /2

    UCB1BR1 = 0;                            //

    UCB1CTL1 &= ~UCSWRST;                   // **Initialize USCI state machine**

   

    __delay_cycles(100);                    // Wait for slave to initialize

}

 

void ADS1118_ADS_Config(signed int temp_config_value)

{

    signed int Config_Value;

   

    Config_Value = temp_config_value;

   

   

    P1OUT &=~ 0x02;                                             // Set CS low

    __delay_cycles(100);                                    // Wait for slave to initialize

   

    ADS1118_WriteSPI(Config_Value,0);                                       // Write configuration to ADS1118

   

    __delay_cycles(100);                                    // Wait for slave to initialize

   

    P1OUT |= 0x02;                                                 // Set CS high

}

 

int ADS1118_ADS_Read(void)

{

    unsigned int Data, Config_Value;

    

    Config_Value = 0;

    

   

    P1OUT &=~ 0x02;                                             // Set CS low

    Data = ADS1118_WriteSPI(Config_Value,1);                        // Read data from ADS1118

    P1OUT |= 0x02;                                                 // Set CS high

   

    return Data;

}

 

/*

 * Mode 0: Only write config register to ADS1118

 * Mode 1: Write config register to ADS1118 as well as read data from ADS1118

 */

signed int ADS1118_WriteSPI(unsigned int config, unsigned char mode)

{

    signed int msb;

    unsigned int temp;

    signed int dummy;

   

    temp = config;

    if (mode==1) temp = 0;

    while(!(UCB1IFG&UCTXIFG));

    UCB1TXBUF = (temp >> 8 );                                     // Write MSB of Config

    while(!(UCB1IFG&UCRXIFG));

    msb = UCB1RXBUF;                                                   // Read MSB of Data

   

    while(!(UCB1IFG&UCTXIFG));

    UCB1TXBUF = (temp & 0xff);                                  // Write LSB of Config

    while(!(UCB1IFG&UCRXIFG));

    msb = (msb << 8) | UCB1RXBUF;                           // Read LSB of Data

   

    while(!(UCB1IFG&UCTXIFG));

    UCB1TXBUF = (temp >> 8 );                                     // Write MSB of Config

    while(!(UCB1IFG&UCRXIFG));

    dummy = UCB1RXBUF;                                             // Read MSB of Config

   

   

    while(!(UCB1IFG&UCTXIFG));

    UCB1TXBUF= (temp & 0xff);                                   // Write LSB of Config

    while(!(UCB1IFG&UCRXIFG));

    dummy = (dummy <<8) | UCB1RXBUF;                        // Read LSB of Config

   

    __delay_cycles(100);

   

    return msb;

}

 

void main(void)

{

   

    volatile int ADC_Result;

    float Voltage_ch1;

    WDTCTL = WDTPW+WDTHOLD;                                 // Stop watchdog timer

   

    ADS1118_GPIO_Init();

    ADS1118_SPI_Init();

    //ADS_Config();

    while(1)

    {

        

       

        ADS1118_ADS_Config(0xC3E3);                          //Only Select AIN1,860SPS,+-4.096V scan voltage range;

       

        ADC_Result = ADS1118_ADS_Read();                                 // Read data from ch1,the last time result

        Voltage_ch2 = ADC_Result*1.0/32768*4.096;

       

        __delay_cycles(10000);

    }

}

 

1:手册上写了,模拟量输出是VDD~GND的范围:

2:写入数据是下降沿有效,而读数据是上升沿有效。数据手册上的是最准确的。

请问这个dummy是干嘛的?貌似整个储蓄都没有用过它啊,只是给它赋值而已,还有就是

  temp = config;

    if (mode==1) temp = 0;

这两句是不是重复了?因为

  Config_Value = 0;

  Data = ADS1118_WriteSPI(Config_Value,1);                        // Read data from ADS1118

貌似当mode==1时,config就是0了,对此小弟甚是不解,求大神不吝赐教,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top