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.

[参考译文] ADS1120:带有NodeMCU ESP12E SPI /转换问题的ADS1120

Guru**** 2605135 points
Other Parts Discussed in Thread: ADS1120

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/665569/ads1120-ads1120-with-nodemcu-esp12e-spi-conversion-problem

部件号:ADS1120

TI工程团队,您好!

我的公司正在使用ADS1120通过SPI与NODEMCU ESP12E (Lolin)通信。 我们正在使用2.048V的外部精密TI电压参考。 我附上了原理图和代码程序。 当我们读取电压时,我们获得准确的读数,但在两者之间也有准确的读数。 逻辑分析器图也附加在附件中。 请提供帮助。

以下是串行监视器捕获的代码片段和代码输出。

#include "SPI.h"

#define cs_pin 15.
#define dR_pin 0

字节reg00=0x00;
字节reg01=0x00;
字节reg02=0x00;
字节reg03=0x00;
字节dmsb;
字节dlsb;
字节emb;
字节sb;
字节缓冲区[4];

SPISettings ADS1120(4096000, MSBFIRST,409.6万 MSBFIRST, SPI_MODE1);

void setup()

// ADS1120设置

pinMode (cs_pin,输出);//我们将此用于CS选择引脚
PinMode (dr_pin,输入);//我们将此用于DR引脚
SPI.begin();
SPI.beginTransaction(ADS1120);//唤醒SPI总线。
SPI.setBitOrder(MSBFIRST);
// SPI.setDataMode(SPI_MODE1);//CPOL=0,CPHA=1此处不要使用值1 (SPI_MODE1=0x04)!

//初始化串行通信
Serial.begin(11.52万);
//等待直至串行流未打开(仅限Leonardo)
同时(!Serial);
serial.println ("Serial com ready");
//发送重置命令
digitalWrite (cs_pin,low);
SPI.transfer (0x06);
digitalWrite (cs_pin,high);
DelayMicroseconds (100);// Guard Time

//设置配置寄存器
digitalWrite (cs_pin,low);
SPI.transfer (0x43);//从配置寄存器00h开始写入四个字节

SPI.transfer (0x81);// Register 00h:读取U_Mon
SPI.transfer (0x04);//寄存器01h:20SPS,256KHz调制器时钟,单触发,禁用温度传感器,关闭电流源
SPI.transfer (0x50);//寄存器02h:外部参考电压,50Hz抑制,PSW关闭,IDAC关闭
SPI.transfer (0x00);//寄存器03h:IDAC1已禁用,IDAC2已禁用,专用DRDY
digitalWrite (cs_pin,high);

//读回配置寄存器作为健全性检查
digitalWrite (cs_pin,low);
SPI.transfer (0x23);//从配置寄存器00h开始读取四个字节
reg00=spI.transfer(0);
reg01=SPI.transfer(0);
reg02=SPI.transfer(0);
reg03=SPI.transfer(0);
digitalWrite (cs_pin,high);
serial.print ("Reg00:");
serial.println (reg00,hex);//显示Reg00
serial.print ("Reg01:");
serial.println (reg01,hex);//显示Reg01
serial.print ("Reg02:");
serial.println (reg02,hex);//显示Reg02
serial.print ("Reg03:");
serial.println (reg03,hex);//显示Reg03
}

void循环()

IF ((digitalRead (Dr_pin))== low){
digitalWrite (cs_pin,low);
//SPI.transfer (0x08);//开始转换(单触发)
DelayMicroseconds(50);
digitalWrite (cs_pin,high);
ADC_READ ();
延迟(5000);
}
//SPI.End();

}

void ADC_Read()

digitalWrite (cs_pin,low);
SPI.transfer (0x10);//发送RDATA命令
DelayMicroseconds (50);// Guard Time
长电压= SPI.transfer (0);
伏特=(伏特<< 8)| SPI.transfer (0);
浮子AIN0 =(伏特* 2.048)/3.2767万;
serial.print("AIN0=");
serial.println (AIN0);
digitalWrite (cs_pin,high);
}

Arduino草图串行监视器上的代码输出捕获:

AIN0= 1.09
AIN0= 0.51
AIN0= 1.09
AIN0= 2.05
AIN0= 1.09
AIN0= 1.09
AIN0= 1.09
AIN0= 4.03
AIN0= 1.09
AIN0= 1.09
AIN0= 1.15
AIN0= 1.09
AIN0= 1.09
AIN0= 3.19
AIN0= 3.67
AIN0= 1.09
AIN0= 1.09
AIN0= 1.09
AIN0= 1.09
AIN0= 4.08
AIN0= 1.09
AIN0= 1.09
AIN0= 1.09
AIN0= 1.09

e2e.ti.com/.../EC_5F00_PH_5F00_Temp.pdf

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Sumeet:

    我在代码片段中看不到发出初始启动命令的位置。 即使在连续模式下运行,在将寄存器写入连续模式后,也应始终发出启动命令一次,以确保设备内部同步。

    我看到的最大问题是数据与可能的结果不匹配。 设备的全刻度范围为+/- 2.048V,您将显示4.03 和3.67 的结果,两者均大于2.048V。 这可能表示存在某种计算错误。 我建议首先输出实际代码值,而不是计算值,以查看您观察到的问题是否在计算中。 此外,ADS1120的输出是二进制二进制补码。 即使您只查看大部分的正数代码(AIN0/AVSS),设备中也可能存在小的负偏移。 如果输出接近0V,您可能会看到代码变为负极。 0xFFFF为-1,您捕获数据的方式似乎是一个较大的正峰值。 因此,当使用'long int'时,您应该正确地对值进行符号扩展。

    我对逻辑分析器图解有点困惑。 最好查看整个通信事务,包括Miso,MOSI,CS,SCLK以及可能的DRDY。 显示的数据为0xFFFF。 这与您发送的任何结果数据都不匹配,因此很难解释正在发生的情况。 因此,分析器快照应包括RDATA命令和数据收集的完整过程。

    此外,我看到数据线与CS LOW和NO SCLK切换。 这种情况不应发生。 方框图显示的SPI线路仅从MCU到ADS1120,因此,如果SCLK空闲,这些信号线路上不应发生任何事情。 您可能需要仔细检查SPI线路的布线和初始化。

    另一个原因是无论CS设置如何,DRDY输出始终是活动输出。 当轮询DRDY至低转换时,无需将CS线设为低。

    此致,
    Bob B
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bob,您好!

    上述代码与Arduino Uno/Mega一起工作非常顺利,但此代码仍然不适用于NodeMCU。 原因可能是什么?

    此致,

    Sumeet Patil

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Sumeet:

    如果Arduino代码在Arduino板上工作,但在NodeMCU板上不工作,则很可能有未正确设置的内容。  NodeMCU使用不同的协议和引脚结构。  我会仔细查看Arduino草图,以确保它与NodeMCU的销结构相匹配。  我确实在Web上找到了一些使用Arduino草图对设备进行编程的信息:

    http://www.instructables.com/id/Programming-ESP8266-ESP-12E-NodeMCU-Using-Arduino-/

    由于TI不支持Arduino或NodeMCU硬件平台,我不确定还能添加什么。

    此致,

    Bob B