TI论坛
直播中

李骏鹏

8年用户 1287经验值
私信 关注
[问答]

关于ADS1118数据转换器疑问谁来解答一下


        求助ADS1118数据转换器
有关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;
}
测试过该时序基本没什么问题,但是所有的问题,都似乎说明是时序问题。

                                                            

回帖(3)

h1654155275.5842

2025-1-20 17:36:23
  现在也在写1118的驱动,同求解。
举报

张琪

2025-1-20 17:36:42
 我以前写的驱动。。希望对你有帮助。
#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);
    }
}
 
举报

郭大

2025-1-20 18:12:29
关于您提到的ADS1118数据转换器的疑问,我将逐一为您解答:

1. 关于ALN0与ALN1做输入时,只能测量1V以下的直流电压的问题:
   这个说法并不完全准确。ADS1118是一款16位的模数转换器(ADC),其最大输入电压范围取决于您使用的增益设置。在默认的增益设置下(增益1),最大输入电压范围为±6.144V。如果您将增益设置为4(最大增益),最大输入电压范围将变为±0.256V。因此,ALN0与ALN1作为输入时,可以测量的电压范围取决于您设置的增益值。

2. 关于ADS1118写入数据是下降沿有效,而读数据是上升沿有效的问题:
   根据ADS1118的数据手册,写入数据确实是在下降沿有效,而读数据是在上升沿有效。您提到的帖子中的说法可能是有误的。请参考官方数据手册以获取准确的信息。

3. 关于您送入配置字0X858A,2.048V=fs,ALN0与ALN1做输入,单次转换开启的问题:
   您提供的配置字0X858A表示:
   - 增益设置为1(±6.144V)
   - 数据速率为128SPS(样本/秒)
   - 单次转换模式
   - ALN0与ALN1作为输入

   您提到读回来的数据一直是一个固定值,这可能是由于以下原因:
   a. 硬件连接问题:请检查您的硬件连接是否正确,包括电源、地线、数据线等。
   b. 配置字设置问题:请确保您使用的配置字是正确的。您可以尝试使用不同的配置字,例如改变增益设置或数据速率,看看是否能够解决问题。
   c. 代码问题:请检查您的代码是否正确地初始化了ADS1118,并正确地读取数据。

   如果问题仍然存在,您可以尝试以下步骤:
   - 重新检查硬件连接和配置字设置。
   - 使用示波器或万用表检查输入信号是否正常。
   - 尝试使用不同的代码库或示例代码,以排除代码问题。

希望以上解答能够帮助您解决问题。如果还有其他疑问,请随时提问。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分