TIwilliam hill官网
直播中

莫循虎

7年用户 979经验值
私信 关注
[问答]

ADS1118采用电压返回数据恒为0,采样温度返回值固定为29700,为什么?


  • ADS1118回读配置信息正确,但采用电压返回数据恒为0,采样温度返回值固定为29700(十进制)

    代码如下:
    /************************************************************************ADS1118驱动程序头文件************************************************************/
    #include "msp430g2553.h"
    #ifndef ADS1118_H_
    #define ADS1118_H_
    #define uchar unsigned char
    #define uint unsigned int
    #define US 3
    #define Set_Bit(val, bitn) (val |= bitn) //置一
    #define Clr_Bit(val, bitn) (val &= ~bitn) //置零
    #define Get_Bit(val, bitn) (val & (1<<(bitn)) ) //获取其bitn位的数值
    //-----------------------SPI通信I/O口电定义-----------------------------
    /*ADS1118 SPI 时钟Clk*/
    /*说明:DOUT/DRDY 中数据的 MSB (bit 15) 在第一个 SCLK 上升沿随时钟移出。
    在转换结果随时钟移出 DOUT/DRDY 的同时,新配置寄存器数据在 SCLK 下降沿锁存至 DIN 中。*/
    #define ADS1118_SCLK_PIN_NUM (BIT3)
    #define ADS1118_SCLK_IO_INIT (Set_Bit(P1DIR,ADS1118_SCLK_PIN_NUM))
    #define ADS1118_SCLK_Set() (Set_Bit(P1OUT,ADS1118_SCLK_PIN_NUM))
    #define ADS1118_SCLK_Clr() (Clr_Bit(P1OUT,ADS1118_SCLK_PIN_NUM))
    /*ADS1118 SPI 数据输入SDI*/
    #define ADS1118_SDIN_PIN_NUM (BIT0)
    #define ADS1118_SDIN_IO_INIT (Set_Bit(P1DIR,ADS1118_SDIN_PIN_NUM))
    #define ADS1118_SDIN_Set() (Set_Bit(P1OUT,ADS1118_SDIN_PIN_NUM))
    #define ADS1118_SDIN_Clr() (Clr_Bit(P1OUT,ADS1118_SDIN_PIN_NUM))
    /*ADS1118 SPI 数据输出SDO*/
    /*说明:这是一个三态输出端口(430相应管脚设为输入)
    当CS为高电平时,SDO为高阻态
    当采样未完成时,SDO为高电平
    当采样完成时,SDO由高电平变为低电平
    */
    #define ADS1118_SDOUT_PIN_NUM (BIT1)
    #define ADS1118_SDOUT_IO_INIT_DIR (Clr_Bit(P1DIR,ADS1118_SDOUT_PIN_NUM)) //设为输入
    #define ADS1118_SDOUT_IO_INIT_REN (Set_Bit(P1REN,ADS1118_SDOUT_PIN_NUM)) //启用内部上下拉电阻
    #define ADS1118_SDOUT_Set() (Set_Bit(P1OUT,ADS1118_SDOUT_PIN_NUM)) //上拉电阻
    #define ADS1118_SDOUT_Clr() (Clr_Bit(P1OUT,ADS1118_SDOUT_PIN_NUM))
    /*ADS1118 SPI 片选CS*/
    #define ADS1118_CS_PIN_NUM (BIT2)
    #define ADS1118_CS_IO_INIT (Set_Bit(P1DIR,ADS1118_CS_PIN_NUM))
    #define ADS1118_CS_Set() (Set_Bit(P1OUT,ADS1118_CS_PIN_NUM))
    #define ADS1118_CS_Clr() (Clr_Bit(P1OUT,ADS1118_CS_PIN_NUM))
    //------------------------配置指令-----------------------
    /*默认之前的模式*/
    #define DEFAULT 0x0000 //默认之前的模式
    /*套餐*/
    #define MEAL1 0x040b //CH0-CH1差分输入;连续转换模式;量程:±2.048V,分辨率:62.5μV;传输速率8SPS;
    #define MEAL2 0x060b //CH0-CH1差分输入;连续转换模式;量程:±1.024V ,分辨率:31.25μV;传输速率8SPS;
    #define MEAL3 0x080b //CH0-CH1差分输入;连续转换模式;量程:±0.512V,分辨率:15.625μV;传输速率8SPS;
    #define MEAL4 0x0a0b //CH0-CH1差分输入;连续转换模式;量程:±0.256V,分辨率:7.8125μV;传输速率8SPS;
    #define MEAL5 0x348b //CH2-CH3差分输入;连续转换模式;量程:±2.048V,分辨率:62.5μV;传输速率8SPS;
    #define MEAL6 0x360b //CH2-CH3差分输入;连续转换模式;量程:±1.024V ,分辨率:31.25μV;传输速率8SPS;
    #define MEAL7 0x380b //CH2-CH3差分输入;连续转换模式;量程:±0.512V,分辨率:15.625μV;传输速率8SPS;
    #define MEAL8 0x3a0b //CH2-CH3差分输入;连续转换模式;量程:±0.256V,分辨率:7.8125μV;传输速率8SPS;
    #define MEAL9 0x04fb //开启温度传感器
    extern void ADS1118_Init(void); //--------------------初始化------------------------
    extern uint ADS1118_RE_WR(uint meal, uchar sel); //---------------------读写一体化函数-------------------
    #endif /* ADS1118_H_ */


    /*****************************************************ADS1118驱动程序***********************************************/
    #include "msp430g2553.h"
    #include "ads1118.h"
    //----------------------延时--------------------------
    void delay(unsigned int t)
    {
    while(t)
    {
    _NOP();
    t--;
    }
    return;
    }
    //--------------------初始化SPI串口------------------------
    void ADS1118_Init(void)
    {
    ADS1118_SCLK_IO_INIT;
    ADS1118_SDIN_IO_INIT;
    ADS1118_SDOUT_IO_INIT_DIR;
    ADS1118_CS_IO_INIT;
    ADS1118_CS_Set() ;
    ADS1118_SCLK_Clr();
    ADS1118_SDIN_Clr();
    // ADS1118_SDOUT_IO_INIT_REN;
    // ADS1118_SDOUT_Set();
    ADS1118_CS_Clr() ;
    }
    //---------------------读写一体化函数(SCLK上升沿更新OUT输出,下降沿读入DIN)-------------------
    uint ADS1118_RE_WR(uint meal, uchar sel)
    {
    uchar i = 0x00;
    volatile uint result = 0x0000, config = 0x0000, temp;
    config = meal;
    for(; i < 16; i++)
    {
    /*****写数据*****/
    if(meal&0x8000)
    ADS1118_SDIN_Set();
    else
    ADS1118_SDIN_Clr();
    meal<<=1;
    delay(US);
    ADS1118_SCLK_Set();
    // delay(MS);
    delay(US);
    ADS1118_SCLK_Clr();
    delay(US);
    /*****读数据*****/
    result<<=1;
    if((*(volatile unsigned char*)0x0020)&ADS1118_SDOUT_PIN_NUM)
    result |= 0x0001;
    // delay(MS);
    }
    meal = config;
    config = 0;
    for(; i < 32; i++)
    {
    /*****再次写入配置参数*****/
    if(meal&0x8000)
    ADS1118_SDIN_Set();
    else
    ADS1118_SDIN_Clr();
    meal<<=1;
    delay(US);
    ADS1118_SCLK_Set();
    // delay(MS);
    delay(US);
    ADS1118_SCLK_Clr();
    delay(US);
    /*****回读配置信息读数据*****/
    temp<<=1;
    if((*(volatile unsigned char*)0x0020)&ADS1118_SDOUT_PIN_NUM)
    temp |= 0x0001;
    // delay(MS);
    }
    if(sel == 0)
    return result;
    else
    return temp;
    }

回帖(1)

成尔秩

6 天前
从您提供的代码片段来看,您正在使用ADS1118进行数据采集,但是遇到了两个问题:电压返回数据恒为0,采样温度返回值固定为29700。以下是一些可能的原因和解决方案:

1. 检查硬件连接:
确保ADS1118与MSP430G2553之间的硬件连接正确。检查数据线、电源线和地线是否连接良好,以及是否有短路或断路的情况。

2. 检查ADS1118配置:
确保ADS1118的配置正确。根据您的代码,您已经回读了配置信息,但是请确保您设置的配置参数(如增益、采样速率等)是正确的。错误的配置可能导致数据读取异常。

3. 检查ADS1118电源:
确保ADS1118的电源电压在规定的范围内(2.0V至3.6V)。电源电压不稳定或过低可能导致ADS1118工作不正常。

4. 检查代码逻辑:
检查您的代码逻辑,确保在读取数据之前已经正确地配置了ADS1118。此外,检查您的代码是否正确地处理了ADS1118返回的数据。

5. 检查ADS1118数据手册:
查阅ADS1118的数据手册,了解其工作原理和配置参数。这有助于您更好地理解问题所在,并找到解决方案。

6. 尝试使用其他示例代码:
尝试使用其他示例代码或库,看看是否能够正常读取ADS1118的数据。这有助于确定问题是否出在您的代码上。

7. 检查MSP430G2553的配置:
确保MSP430G2553的配置正确,如时钟设置、I2C通信设置等。错误的配置可能导致与ADS1118的通信异常。

综上所述,您需要从硬件连接、配置参数、电源电压等方面入手,逐步排查问题。希望这些建议能帮助您解决问题。
举报

更多回帖

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