在“线程: 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之间的对应关系。 SPI接口计时, 图85。 同步计时(SPI接口)和 图91。 SPI保持时间(TKO)? 是否要同时解释? 图91中的DIN命令在哪里起作用? 对我来说,图91意味着您根本不需要发送任何读取命令,因为您只需不断检查DRDY行。
- 每次转换后是否必须将起始销升高到高位?
- 如果我想连续采样输入电压,我是否只发出一个起动命令,然后按照图91操作? 目前,我正在每次循环迭代时发送start命令。
我们最终将使用Raspberry Pi作为ADC的最终用途,因为我们需要以512ksps的速度使用它(而Arduino串行写入速度限制了我们)。 我们的首要任务就是了解如何与设备正确通信并获得预期结果。
非常感谢您的帮助。
Rohan Nuttall
加拿大温哥华
