主题中讨论的其他器件: ADCPro
我尝试使用 Arduino 控制 ADS1158模块、并将 START 引脚连接到高电平、我想在"通道读取命令"和"自动扫描模式"中使用它、 但我当前面临的问题是、DRDY 在器件通电时始终保持高电平。 我使用的是默认配置中的器件。 请指导我。
谢谢
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.
您好、Harsh Gola、
打开 ADC 时、START 引脚的状态是什么? 如果 START 引脚为高电平、DRDY 引脚应以默认数据速率切换、即使在写入任何寄存器之前也是如此(假设 PWDN 和 RESET 也都保持高电平)
如果不发生这种情况、则向 ADC 提供的电源电压存在问题、或者提供给 ADC 的时钟无法正常工作。
请检查这些输入是否正确、然后再继续。
布莱恩
您好,Bryan,
这是我在 Arduino 上使用的代码:
#include
uint8_t reg1、reg2、reg3、reg4、reg5、 reg6、reg7、reg8;
void 设置(void)
{
Serial.begin(115200);//以波特率115200开始串行通信
// pinMode (7、输出);//start//使用脉冲转换器
引脚模式(9、输入);//drdy
引脚模式(8、输出);//RESET //连接至5V
引脚模式(6、输出);//pwdn //连接至5V
//digitalWrite (7、low);
SPI.begin();//开始 SPI 通信
}
void loop (void)(空)
{
for (int i = 0;i < 6;i++)
{
serial.println(i);
//////////////////////////////////////////////////////////////////////
digitalWrite (SS、low);delay (5);//切换 ss 信号以根据 ADS1158数据表复位 SPI 接口
digitalWrite (SS、HIGH);
digitalWrite (SS、low);
delayMicroseconds (1);
SPI.transfer (0x40);
字节 CONFIG0 = SPI.transfer (0);
serial.print ("config0:");serial.println (config0、hex);
digitalWrite (SS、HIGH);
延迟(1000);
digitalWrite (SS、low);delay (5);//切换 ss 信号以根据 ADS1158数据表复位 SPI 接口
digitalWrite (SS、HIGH);
digitalWrite (SS、low);
delayMicroseconds (1);
SPI.transfer (0x41);
字节 conF1 = SPI.transfer (0);
serial.print ("config1:");serial.println (conf1、hex);
digitalWrite (SS、HIGH);
延迟(1000);
digitalWrite (SS、low);delay (5);//切换 ss 信号以根据 ADS1158数据表复位 SPI 接口
digitalWrite (SS、HIGH);
digitalWrite (SS、low);
delayMicroseconds (1);
SPI.transfer (0x42);
字节 MUXSCH = SPI.transfer (0);
serial.print ("MUXSCH:");serial.println (MUXSCH、hex);
digitalWrite (SS、HIGH);
延迟(1000);
////////////////////////////////////////////////////////////////////////////////////////////
digitalWrite (SS、low);delay (5);//切换 ss 信号以根据 ADS1158数据表复位 SPI 接口
digitalWrite (SS、HIGH);
digitalWrite (SS、low);
delayMicroseconds (1);
SPI.transfer (0x43);
字节 muxdif = SPI.transfer (0);
serial.print ("muxdif:");serial.println (muxdif、hex);
digitalWrite (SS、HIGH);
延迟(1000);
//////////////////////////////////////////////////////////////////////////////////////////////////
digitalWrite (SS、low);delay (5);//切换 ss 信号以根据 ADS1158数据表复位 SPI 接口
digitalWrite (SS、HIGH);
digitalWrite (SS、low);
delayMicroseconds (1);
SPI.transfer (0x44);
字节 muxsg0 = SPI.transfer (0);
serial.print ("muxsg0:");serial.println (muxsg0、hex);
digitalWrite (SS、HIGH);
延迟(1000);
//////////////////////////////////////////////////////////////////////////////////////////////////
digitalWrite (SS、low);delay (5);//切换 ss 信号以根据 ADS1158数据表复位 SPI 接口
digitalWrite (SS、HIGH);
digitalWrite (SS、low);
delayMicroseconds (1);
SPI.transfer (0x64);
SPI.transfer (0x01);
延迟(1000);
////////////////////////////////////////////////////////////////////////////////////////////////
digitalWrite (SS、low);delay (5);//切换 ss 信号以根据 ADS1158数据表复位 SPI 接口
digitalWrite (SS、HIGH);
digitalWrite (SS、low);
delayMicroseconds (1);
SPI.transfer (0x45);
字节 muxsg1 = SPI.transfer (0);
serial.print ("muxsg1:");serial.println (muxsg1、hex);
digitalWrite (SS、HIGH);
延迟(1000);
////////////////////////////////////////////////////////////////////////////////////////////////
digitalWrite (SS、low);delay (5);//切换 ss 信号以根据 ADS1158数据表复位 SPI 接口
digitalWrite (SS、HIGH);
digitalWrite (SS、low);
delayMicroseconds (1);
SPI.transfer (0x65);
SPI.transfer (0x00);
digitalWrite (SS、HIGH);
延迟(1000);
//////////////////////////////////////////////////////////////////////////////////////////////////////////
digitalWrite (SS、low);delay (5);//切换 ss 信号以根据 ADS1158数据表复位 SPI 接口
digitalWrite (SS、HIGH);
digitalWrite (SS、low);
delayMicroseconds (1);
SPI.transfer (0x46);
字节 sysred = spi.transfer (0);
serial.print ("sysred:");serial.println (sysred、hex);
digitalWrite (SS、HIGH);
延迟(1000);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
digitalWrite (SS、low);delay (5);//切换 ss 信号以根据 ADS1158数据表复位 SPI 接口
digitalWrite (SS、HIGH);
digitalWrite (SS、low);
delayMicroseconds (1);
SPI.transfer (0x47);
字节 gpioc = spi.transfer (0);
serial.print ("gpioc:");serial.println (gpioc、hex);
digitalWrite (SS、HIGH);
延迟(1000);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
digitalWrite (SS、low);delay (5);//切换 ss 信号以根据 ADS1158数据表复位 SPI 接口
digitalWrite (SS、HIGH);
digitalWrite (SS、low);
delayMicroseconds (1);
SPI.transfer (0x48);
字节 gpiod = SPI.transfer (0);
serial.print ("gpio:");serial.println (gpiod、hex);
digitalWrite (SS、HIGH);
延迟(1000);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
digitalWrite (SS、low);delay (5);//切换 ss 信号以根据 ADS1158数据表复位 SPI 接口
digitalWrite (SS、HIGH);
digitalWrite (SS、low);
delayMicroseconds (1);
SPI.transfer (0x49);
字节 id = SPI.transfer (0);
serial.print ("id:");serial.println (id、hex);
digitalWrite (SS、HIGH);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
延迟(1000);
while (1)
{digitalWrite (SS、low);delay (5);//切换 ss 信号以根据 ADS1158数据表复位 SPI 接口
digitalWrite (SS、HIGH);
// digitalWrite (7、HIGH);//开始高电平
延迟(100);
//////// 脉冲转换命令
digitalWrite (SS、low);
// delayMicroseconds (1);
SPI.transfer (0x80);
字节脉冲= SPI.transfer (0);////////////////////////////////
serial.print ("puls=");
serial.println (pulse、hex);
digitalWrite (SS、HIGH);
// spi.transfer (0x00);
if (digitalRead (9)=low)//drdy
{
digitalWrite (SS、low);
// delayMicroseconds (1);
SPI.transfer (0x30);
reg1 = SPI.transfer (0x00);
reg2 = SPI.transfer (0x00);
reg3 = SPI.transfer (0x00);
reg4 = SPI.transfer (0x00);
// digitalWrite (2、low);
// dataF=reg2*pow(2,16)+reg3*pow(2,8)+reg4;
serial.print ("Stat=");
serial.println (reg1、十六进制);
serial.print ("MSB=");
serial.println (reg2、十六进制);
serial.print ("lsb="");
serial.println (reg3、十六进制);
serial.print ("reg4=");
serial.println (reg4、hex);
// Serial.print ("finalData=");
//Serial.println (dataF、十六进制);
//}
digitalWrite (SS、HIGH);
//延迟(1000);
}
}}}
您好、Harsh Gola、
您应该使用1.8V 或3.3V 电压、我不知道为什么您同时连接了这两个电压。 您能给我发送一些新硬件配置的图片吗? 请提供尽可能多的详细信息
您能否确保 PWDN、START 和 RESET 连接至3.3V、然后为 ADS1158 EVM 子卡上电。 您甚至可以断开控制器的连接进行此测试。 当 ADC 上电时、DRDY 应以数据速率切换。 如果 DRDY 未切换、它仅保持高电平、则电源或时钟存在问题。
告诉我发生了什么、请发送图片
布莱恩
您好 Bryan、
感谢您的持续支持、我已经附上了一些电路板图片、请检查、我已将复位、PWDN、单极/极性引脚连接到高电平(从 Arduino 获得5V 电压、我应该将它们连接到3V3吗?)、EREFP 连接到5V EREFN 连接到 GND、 由于我决定使用脉冲转换命令(因为设置 START 引脚不会导致 DRDY 引脚上的活动)、因此 START 引脚处于断开状态。 在上面的代码中,我发送0x80,然后检查 DRDY 是否处于低电平状态,然后发送0x30和额外的0x00 0x00 0x00以捕获 STAT、MSB、LSB 字节。 我更改的寄存器是 muxsg0 (设置为0x01)、muxsg1 (设置为0x00)、每个其他寄存器都设置为默认值。
您好 Bryan、
更新了:-我在 ADS1158电路板上找到了跳线,跳线 J6,它将 G0和 ST 引脚短接(在另一个论坛上发现了这一点),我现在已将其更改为短接 J6-1和 ST, 现在、DRDY 引脚发出脉冲、当其将 START 引脚设置为高电平时应发出脉冲。 现在我将 Arduino 代码更改为初始设置 START 引脚为高电平、然后检查 DRDY 是否为低电平、并发送(0x30)(0x00)(0x00)(0x00)以检索通道、我将更新有关我正在接收的通道数据的快速更新。
流量:-
1.set RESET、PWDN、单极、START 引脚高电平(5V、是否应将其连接到3V3?)
2.set 配置寄存器
回读这些寄存器
4.检查 DRDY 是否为低电平,然后发送(0x30)。 并保持该状态。
请检查我是否采取了正确的方法。
谢谢。
您好、Harsh Gola、
应将 RESET 和 PWDN 绑定在一起、然后开始连接到用于 DVDD 的任何电压。 DVDD 和用于数字通信的3.3V 电压之间有一个电平转换器、因此您不必使用与 FPGA IO 相同的电压。 但是、对于所有数字 IO 电压、使用3.3V 可能是合理的。 PWDN 和 RESET 在 EVM 上已经具有3.3V (R8和 R9)的上拉电阻。 您可能需要手动将 START 引脚连接到 DVDD、因为当您将 J3-1和 J3-3连接在一起时、此布线上会有一个下拉电阻(R14)。 因此、您需要确保将 START 设置为高电平才能开始转换、但发送的图片未连接到 J6 (J6-1)上的 START 引脚。 查看 ADS1158EVM 原理图、了解有关 EVM 设计方式的更多详细信息。
用于控制 AVDD 电源电压(单极与双极)的引脚可以保持未连接状态、在该配置中会自动拉高=设置为单极。
此外、我建议断开 ADS1158EVM 子卡与 MMB0主板的连接、并直接为 ADS1158EVM 上的 J5接头供电。 MMB0上的控制器与外部控制器之间可能存在一些竞争
如果要使用通道数据读取命令、则所概述的过程是正确的:检查 DRDY 是否为低电平、并发送(0x30)(0x00)(0x00)(0x00)(0x00)以检索通道数据。 请注意、命令后的第一个字节为状态字节、这仅在自动扫描模式下有效。
布莱恩
感谢 Bryan 为您提供指导、我已经附上了一些我所获得结果的图像、请检查并告诉我如果您需要更详细的图像、目前我正在使用一个通道(AIN0)进行测试、我希望最终使用7个通道(AIN0-AIN6)(单端)、 ADC 在默认配置下运行、我只覆写复用 sg0 (0x01)和复用 sg1 (0x00)寄存器来选择输入通道。 我使用的是 RESET、PWDN、START、DRDY、CS、MOSI、 MISO、SCLK 引脚总计,ADC 现在在没有主板的情况下通电,我提供了正弦波作为输入,结果产生噪音。 在我的当前代码中、我写入 muxsg0和 muxsg1、然后将 START 引脚从低电平变为高电平、然后开始检查 drdy 是否为低电平、然后发送(0x30000000)以检索通道数据。 请指导您如何以更低的噪声获得结果。
谢谢
您好、Harsh Gola、
我是否正确理解您现在能够成功读取和写入 ADS1158上的寄存器? 因此、执行这些功能不再有问题?
我提出这一问题是因为我没有看到 SCLK ("SCLK_0")在您发送的屏幕截图中进行切换、因此我不确定您在这些图像中执行的操作。
现在、唯一的问题是您的正弦波输入的噪声高于您的预期? 由于 Δ-Σ ADC 对输入进行采样的方式、ADS1158可能不是交流信号的最佳选择。 这可能更适合 SAR ADC、除非您测量的是极低频率正弦波(<1kHz)。 如果您可以提供有关您尝试测量的信号(振幅和频率)的更多信息、我们可以提供更好的建议
您还可以通过将输入短接在一起并测量产生的噪声来检查 ADC 的噪声性能。 您可以通过为正负 ADC 输入选择相同的通道来将输入短接在一起。 这必须在固定通道模式下使用 ADS1158完成。
此外、根据已知直流输入检查噪声性能、例如来自精密源的2.5V 电压(例如、您可以使用 ADC 的基准电压)。 假设您的系统中没有其他噪声源、测量此恒定2.5V 的噪声应与 ADC 量化噪声的顺序(假设无增益、则为2*1.0666*VREF/2^16)
布莱恩
您好 Bryan、
我能够成功读取和写入寄存器、我使用此 ADC 来测量湿度、水压、温度和水流等传感器的数据。 我附加了一些图像,其中一个显示 SPI 通信,另一个显示我正在接收的数据。 您可能会注意到,在工作表中提到,新位代表新数据,因此我将数据分成了两个,一个是收集新数据和旧数据的位置,名为 ADS_1158_interface_0_channel_n (n= 0、1、2、3、4、5、6), 其中我仅收集新数据并丢弃旧数据、名为 ADS_1158_interface_0_channel_n_new。
但在不均匀的情况下、我仍然会遇到尖峰。 当前连接的传感器有一个湿度传感器(通道1)、2个水压传感器(通道0和2)、一个5V 直流电源(通道3)、一个2V 100Hz 正弦波(通道5)。
SPI 时钟= 8MHz、只要 DRDY 变为低电平、SPI 触发。 在 ADC 上启用通道0至6,其它设置为0 (关闭),自动扫描模式,通道数据读取命令。
除 muxsg1 = 0x00外、所有寄存器都为默认值。
您好、Harsh Gola、
您能否帮助解释显示"DS_1158_interface_0_channel_n (n= 0、1、2、3、4、5、6)"? 您是否直接测量这些信号? 或者您是否在测量 DOUT 引脚上的数据、然后分别绘制每个通道?
这些尖峰看起来像噪声、可能来自耦合到 ADC 某个位置的电源或时钟线路。 如果您没有接地连接(例如接地反弹)、它们也可能是接地平面中的电压尖峰。 您应该尝试检查所有这些组件并确保它们正常工作。
布莱恩
您好 Bryan、
ADS_1158_interface_0_channel_n (其中 n 是通道编号) 表示通道编号 例如 ADS_1158_interface_0_channel_0显示 AIN0数据,ADS_1158_interface_0_channel_0_new 显示 AIN0数据,不同之处在于它每次都根据状态字节的新位丢弃旧数据,例如 AIN0通道上的旧数据显示为0x08 (StatusByte) Msbyte Lsbyte 和0x88 (MSB)新字节。
我正在收集 SPI 模块 DOUT 缓冲器上的所有数据、然后检查 STAT 字节以获取通道信息、然后单独绘制这些数据。
我当前使用的是不带主板的 ADS1158模块,我已将 J6-4接地连接到 FPGA,并将 ADS1158模块上的 AINCOM 连接到 GND 引脚。 我还将传感器的接地端连接到 ADS1158模块和 FPGA。
您好 Bryan、
我从专用电源单元为 ADC 提供5V 直流电,尽管电压降至4.9甚至4.7,但电压不会降至0v 或接近0v。
对于外部基准、我分别将 S1和 S2开关设置为 AVDD 和 GND。
我还只向一个通道提供稳定的5V 直流信号、但我仍会得到下降、其值甚至低至0 (在分析仪窗口上)。
但是、每当我运行 ADCPro 软件以双倍检查信号中是否存在噪声时、它就能完美运行。
寄存器配置:-
Config0 = 0x0a
CONFIG1 = 0x83
muxsch = 0x00
muxsg0 = 0x01
muxsg1 = 0x00
每当 DRDY 信号变低时、我都会获取通道数据。
SPI 时钟 8MHz。
您好、Harsh Gola、
如果 AVDD 降至4.7V、则低于 ADC 的建议工作条件(AVDD 必须为 AVSS+4.75V、我假设您以 AVSS 为基准测量 AVDD)。 这可能会在 ADC 内引起广泛的问题、因为 ADS1158被设计成在有效的5V AVDD 下运行。
我会确保您的电源非常稳定、不会出现压降。 这可能无法解决您眼前的问题、但很可能会导致未来的挑战
电路板上的 IO 电压是多少? 该电源也会下降吗?
布莱恩