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.

[参考译文] ADS127L01EVM:和Arduino SPI接口

Guru**** 2561760 points
Other Parts Discussed in Thread: ADS127L01EVM, ADS127L01

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/617510/ads127l01evm-and-arduino-spi-interfacing

部件号:ADS127L01EVM
在“线程: ADS127L01”中讨论的其他部件

您好,

我一直在努力使用外部微控制器从ADS127L01EVM获取合理的读数。  由于我们能够使用TI Δ-Σ ADC评估 软件对其进行测试,因此该板本身运行良好(我们对性能特性非常满意)。  

现在,我们尝试使用Arduino通过SPI与设备通信并读取电压。  

我们的硬件设置如下所示(引脚X指Arduino连接):  

  • 通过在J6[1]上安装跳线,CS将被绑定到较低的位置。
  • 连接到DVDD的起始引脚通过TP21连接到引脚8 (设置为输出)(未安装JP11)。  
  • 安装JP5以关闭Y1电源,并且JP6[3]连接到引脚5 (设置为输出)。 根据 数据表中的第5.6 部分,Arduino将引脚5配置为向EVM板提供8MHz时钟信号
  • 外部5V电源连接到JP3[2](由Arduino 5V引脚提供)。
  • 外部电源接地通过其中一个GND测试点与EVM接地共享。
  • 在S3上,HR=1,格式= 0,OSR[1:0]= 00,FSMODE = 0, 根据数据表中的表2,Filter[0:1]=01。  
  • SPI端口连接到Arduino (Miso,MOSI,SCLK)上的相应SPI引脚。  
  • DRDY引脚连接到引脚4 (设置为输入)。

完成此设置且Arduino连接到电源后,ADS127L01EVM将亮起(因此似乎已正确连接设备)。  

当我上传我的程序以读取转换结果时,就会遇到困难。 我将3.3V直流电压连接到接线板,并获得以下输出:  

好的方面是,我似乎正在从设备中计时数据,但坏的方面是没有意义。 "峰值"的周期性看起来问题可能来自Arduino程序中的void loop()函数,但我不确定。 我正在返回未格式化的数据(不转换为电压,因此使用y轴刻度)。  

下面是我的Arduino草图:  

#include <SPI.h>
#include <avr/io.h>
#include <util/delay.h>

//定义常量
const int DRDY_pin = 4;
const int start_pin = 8;
表 19中的const byte readCommand = 0b1.001万;//RDATA命令。 命令定义
const byte blank = 0b0万;  
SPISettings settingsA(1600万, MSBFIRST, SPI_MODE1);//1.6MHz SCLK,CPOL =0, CPHA = 1)

void setup(){

引脚模式(3,输出);// OCR2B计时器的输出引脚
引脚模式(5,输出);// OCR0B计时器的输出引脚
//设置8 MHz输出
TCCR0A =位(COM0A1)|位(COM0B1)|位(WGM01)|位(WGM00);
TCCR0B =位(WGM02)|位(CS00);
OCR0A = 1;
OCR0B = 0;

//设置SPI设备
Serial.begin(11.52万);
PinMode (插针模式)(DRDY_Pin,输入);
PinMode (起始引脚,输出);
//同步计时(SPI接口)如图85所示。
DigitalWrite (DRDY_Pin,低);
digitalWrite (start_pin,high);
DigitalWrite (start_pin,low);//在SPI接口模式下,DRDY在低电平启动时会变高(它是低电平活性引脚)
delayMicroseconds (4);//t_w (STL)
SPI.begin();

}

void loop(){

digitalWrite (start_pin,high);//启动返回高电平后,DRDY将保持高电平,而数字滤波器完成重置和设置
如果(digitalRead (DRDY_pin)== low){//在有效数据准备好进行检索后,检查DRDY是否变为LOW
serial.println (readADC (readCommand),10);//发送readADC命令,具有10个有效数字的输出。
//delayMicroseconds (10);
}

}

浮点readADC (字节优先配置){

noInterrupts();//禁用中断
SPI.beginTransaction(settingsA);//设置A
DelayMicroseconds(5);
SPI.transfer (primaryConfig);// send read byte命令
bytes firstByte = SPI.transfer (0x00);//读取第一个字节
Byte secondByte = SPI.transfer (0x00);//读取第二个字节
字节第三字节= SPI.transfer(0x00);//读取第三个字节  
interrupts();//启用中断  
int firstSixteenBits =(firstByte << 8)| secondByte;
int lastTwentyFourBits =(firstSixteenBits << 8)| thirdByte;
浮点值DEC =(浮点(lastTwenty FourBits)* 5.0万)/ 1677.7216万.0000000</xmt-block>0万 ;//使用5.0000V的参考电压转换为电压
float值NOFORMAT = float (lastTwenty Fourbits);
//返回值DEC;
返回值NOFORMAT;  
SPI.endTransaction();
//delayMicroseconds (3);

}

这是DIN/MOSI (1)和SCLK (2)线路的示波器轨迹。 可以看出,当Arduino读取DOUT行(未显示在示波器轨迹中)时,将发送RDATA命令,然后发送3个空字节命令。

我有几个关于这一切的问题:  

  1.  图1之间的对应关系。 SPI接口计时, 图85。 同步计时(SPI接口)和 图91。 SPI保持时间(TKO)? 是否要同时解释? 图91中的DIN命令在哪里起作用? 对我来说,图91意味着您根本不需要发送任何读取命令,因为您只需不断检查DRDY行。
  2. 每次转换后是否必须将起始销升高到高位?  
  3. 如果我想连续采样输入电压,我是否只发出一个起动命令,然后按照图91操作? 目前,我正在每次循环迭代时发送start命令。  

我们最终将使用Raspberry Pi作为ADC的最终用途,因为我们需要以512ksps的速度使用它(而Arduino串行写入速度限制了我们)。 我们的首要任务就是了解如何与设备正确通信并获得预期结果。

非常感谢您的帮助。

Rohan Nuttall

加拿大温哥华

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

    您好,Rohan,

    感谢您对ADS127L01的提问和关注!

    在我们走得太远之前,我想确认一些有关您的设置的详细信息:

    1. 如果您希望使用Arduino控制起始针脚,则需要从R67的低端(连接到起始针脚),而不是从DVDD测试点(TP21)制作跳线。 此电阻器将起始引脚拉高至DVDD,使ADS127L01保持连续转换。
    2. 如果已卸载JP11,则ADS127L01的数字电源没有连接。 您的外部电源是否与JP11[2]短路? 事实上,由于您将TP21与Arduino绑定在一起,因此每次尝试拉低或高启动时,您都可以有效地切换数字电源。 我认为这可能是主要问题。
    3. 您的平均值是FILTER[1:0]=01 (宽带2过滤器)还是FILTER[1:0]=10 (低延迟过滤器)。 我假设您使用的是宽带2过滤器,因为您提到了以512kSPS的速率运行ADC。
    4. 应该安装JP1,其余跳线应该位于其默认位置。

    模拟电源(AVDD)连接至3V。 因此,您不应将3.3 -V DC输入应用到J8。 3.3V在绝对最大额定值下是正确的,以避免设备损坏,但这超出了推荐的工作条件。 此外,EVM上ADS127L01的参考电压(VREF)为2.5V,因此ADC无论如何都无法转换大于该电压的差动输入。

    其他问题:

    1. 是的,应遵循所有正时规格。 在图1中,您可以找到一般通信所需的大多数时间规格。 如果您需要在任何点(例如启动时或重新同步多个ADC等)触发起始引脚,图85说明了在看到有效数据之前应等待多长时间。 您只能控制起始边缘和CLK上升边缘之间的脉冲宽度和时间。 最后,图91说明了允许您发送SCLK的/DRDY下降沿的距离。 从理论上讲,当您在DIN上发送命令时,以及当您在DOUT上读取数据时,这种情况适用,但主要适用于后者。
    2. 否,在数据采集过程中,起点可以保持在高位。 实际上,不建议在转换之间切换高/低起点。 这样做会重置数字筛选器,并在每次您希望读取数据时产生明显的延迟。 对于宽带滤波器,数字滤波器需要84个转换才能完全确定输出数据。
    3. 如果起始引脚已高,则无需发送启动命令。 仅当用户将启动引脚低电阻连接到电阻器时,才需要启动命令。 在这种情况下,MCU可以通过SPI控制转换。

    如果你还有困难,请告诉我,我们将从那里出发。

    此致,