This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

ADS1115通道之间轮流转换采样时出来的都是其中一路的结果

Other Parts Discussed in Thread: ADS1115, MSP430F149

ADS1115通道之间轮流转换采样时,出来的都是其中一路的结果,但是单独使用一个通道时工作都正常,采样的模式是单端连续采样模式,是不是自己设置ADS1115有问题?

  • 能否上传原理图和代码以便分析

  • 注明:在实际使用中只使用SCL和SDA引脚与MSP430连接,未使用ALERT引脚。

    下面程序为IIC程序和ADS1115程序

    ********************************************************IIC程序************************************************************************************

    #include <msp430f149.h>
    #include"ADS1115.h"
    #include "I2C.h"
    typedef unsigned char uchar;
    typedef unsigned int uint;
    unsigned int Initdata[4]={0};
    /**************起始信号***************/
    void start()
    {
    SDA_Out;
    SDA_L;
    SCL_Out;
    SCL_H;
    SDA_H;
    SDA_L;
    SCL_L;
    }
    /*************终止信号*************/
    void stop()
    { SDA_Out;
    SDA_L;
    SCL_H;
    SDA_H;
    }
    /*************向I2C总线发送一个字节************/
    void Send1byte(uint byte)
    {
    uint i;
    SDA_Out;
    for(i=0;i<8;i++)
    {
    if((byte<<i) & 0x80)
    SDA_H;
    else
    SDA_L;
    SCL_H;
    SCL_L;
    }
    SDA_H;
    SCL_H;
    SCL_L;
    }
    /**************读取一个字节**************/
    uint Read1byte()
    {
    uint temp=0,i;
    SDA_In;
    for(i=0;i<8;i++)
    {
    temp=temp<<1;
    SCL_L;
    SCL_H;
    if(P2IN&0x02)
    {
    temp|=0x01;
    }

    }
    SDA_Out;
    SCL_L;
    SDA_L;
    SCL_H;
    SCL_L;
    SDA_H;
    return temp;
    }

    *****************************************************************************************************************************************************

    ****************************************************************ADS1115程序**********************************************************************

    #include <msp430f149.h>
    #include "I2C.h"
    typedef unsigned char uchar;
    typedef unsigned int uint;
    extern unsigned int Initdata[4];
    uint result_gd=0;
    /*******************Config寄存器*********************/
    void Confige_1115(uchar channel )
    {
    uchar i=0;
    switch(channel) //通道选择
    {
    case 0: Initdata[2] = 0x42; break;
    case 1: Initdata[2] = 0x52; break;
    case 2: Initdata[2] = 0x62; break;
    case 3: Initdata[2] = 0x72; break;
    }
    Initdata[0] =0x90; // 启动配置命令
    Initdata[1] =0x01; // 指向配置寄存器
    Initdata[3] =0x83; // 配置字低字节
    SCL_H;
    start();
    for(i=0;i<4;i++)
    {
    Send1byte(Initdata[i]);
    _NOP();
    }
    stop();
    }
    /************指向转换结果寄存器***************/
    void Point_reg(void)
    {
    uchar i=0;
    Initdata[0] =0x90; // 地址 + 写命令
    Initdata[1] =0x00; // 指向转换结果寄存器
    SDA_Out;
    SCL_H;
    start();
    for(i=0;i<2;i++)
    {
    Send1byte(Initdata[i]);
    }
    stop();
    }
    /**************读取转换结果***************/
    uint Read_1115(void)
    {
    uchar ResultL,ResultH;
    uint Result;
    SCL_H;
    start();
    Send1byte(0x91);
    ResultH=Read1byte();
    _NOP();
    ResultL=Read1byte();
    stop();
    Result=ResultH*256+ResultL;
    return Result;
    }

    uint Get_AD(uchar channel)
    {
    Confige_1115(channel);
    Point_reg();
    return Read_1115();
    }

    *********************************************************************************************************************************************************

    在主函数中使用Get_AD(uchar channel)连续调用两个通道,使用仿真器单步执行两通道的结果都正确,液晶显示也正确,但是全速执行后发现两通道的值互相有影响,两通道采样出来的结果是其中一通道的值,这是否跟ADS1115内部只是使用同一个数据转换寄存器有关?

  • 是不是多通道轮流采样只能使用单次转换模式而不能使用连续转换模式?

  • 急需解决这一问题,请问能否提供邮箱进行交流 我的邮箱liukaimark@163.com

  • 如果单步执行,每个通道都正常的话,那有可能是你轮流采样时,通道间的时间间隔留的不够。

    ADS1115的最高采样率只有860.  建议你尝试把通道间切换的延时加长。

  • 你好,你的问题解决了吗 ?你能 把你的程序发一份给我吗  太需要了   真的非常感谢你  416908607@qq.com    谢谢

  • 你好 ,我急需这个ADS1115的程序,请你发一份给我好吗?谢谢你  416908607@qq.com 

  • 您好,仁兄。最近我也打算多通道进行测试,还没遇到您说的问题,不知您解决的怎么样?

  •  您好!我也遇到了这个问题,两个通道交替采样时出来的数据是一样的,我也尝试加了比较大的延时,结果还是一样,请问怎么解决,谢谢!

    if(i==7)              //ADS1115的1#ADC值
    {
    ads1115_start_convert(0xC4); //#####
    ads1115_read_adc_val(7);
    }
    
    
    if(i==8)             //ADS1115的2#ADC值
    {
    ads1115_start_convert(0xE4);
    ads1115_read_adc_val(8);
    }
    
    /******************************
    往ADS1115写入一个字节
    *******************************/
    
    void write_ads1115(unsigned char configreg)
    {
        TwiStart();                      //产生启动信号
        TwiWriteByte(ADS1115_WRITE);     // #define ADS1115_WRITE	0x90 =10010000  地址寄存器  最后那个0标识 写
        TwiWriteByte(0x01);              //  0x01=00000001   写入指针寄存器指向配置寄存器
        TwiWriteByte(configreg);        //Config reg的前8位,改变AD通道  1#0xC5  2#0xE5
        TwiWriteByte(0x83);             //Config reg的后8位,不变
        TwiStop();                       //产生停止信号
        twi_delay_bus(); 
        twi_delay_bus(); 
        twi_delay_bus();
    
    
        TwiStart();                      //产生启动信号
        TwiWriteByte(ADS1115_WRITE);     // #define ADS1115_WRITE	0x90 =10010000  地址寄存器  最后那个0标识 写
        TwiWriteByte(0x00);              //  0x00=00000000   写入指针寄存器指向转换寄存器
        TwiStop();                       //产生停止信号
        twi_delay_bus(); 
        twi_delay_bus();
        twi_delay_bus();
    	
    }
    
    /******************************
    从ADS1115读取ADC值
    *******************************/
    
    void ads1115_read_adc_val(int k)
    {   
        unsigned char DH,DL;
    
    	TwiStart();                   //产生启动信号
    	TwiWriteByte(ADS1115_READ);   //#define ADS1115_READ	0x91=10010001 最后那个1标识 读
    	DH=TwiReadByte(1);           //读一字节数据 ack: 1时应答,0时不应答
    	DL=TwiReadByte(1);          //读一字节数据
    	TwiStop();                  //产生停止信号
            twi_delay_bus();  
    	
    	ADCResult[k][1]=DL;
    	ADCResult[k][0]=DH; 
    	DH=0;
            DL=0;
    
    	twi_delay_bus();
    	twi_delay_bus();
    	twi_delay_bus();
    	twi_delay_bus();
    	twi_delay_bus();
    	twi_delay_bus();
    	twi_delay_bus();
    	//////////////////////////////	
    	
    }
    
    //开始一次转换
    
    void ads1115_start_convert(unsigned char configreg)
    {
    	TwiInit();  
            SPI_MasterInit();
    	write_ads1115(configreg);        //SDA写入 指针寄存器指向配置寄存器
    }