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.

[参考译文] ADS1198:CAN#39;t 读取 Arduino UNO 的通道输入

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/898937/ads1198-can-t-read-channel-input-with-arduino-uno

器件型号:ADS1198

您好!

我正在尝试使用通道1 ADS1198捕获信号、并在我的学校项目中通过 SPI 将其发送到 Arduino UNO。 由于隔离、我没有电极、因此我尝试使用电位器来模拟数据源。 在使用电位计移动时、我无法看到捕获的数据有任何差异。

我的接线是:

ADS1198 -> Arduino UNO

DIN ->引脚11

CS -> 引脚 A5

DOUT->Pin 12

DRDY->引脚2

SCLK->引脚13

AVDD->5V

DGND->3、3V

IN1P->电位器

IN1N->GND

我的代码是在 Arduino IDE 中编写的:

#include 

#define MOSI1 11 //MOSI
#define MISO1 12 //MISO
#define CLK1 13 //SCK

#define PIN_CS A5
#define PIN_RESET A4
#define PIN_DRDY 2

#define RREG 0x20
#define WREG 0x40

#define ID 0x00
#define SDATAC 0x11
#define RDATAC 0x10
#define RDATA 0x12

#define WAKEUP 0x02
#define STANDBY 0x04
#define RESET 0x06
#define START 0x08
#define STOP 0x0A

#define CH1 0x05
#define CH2 0x06
#define CH3 0x07
#define CH4 0x08
#define CH5 0x09
#define CH6 0x0A
#define CH7 0x0B
#define CH8 0x0C

#define setoff B10000001
#define SETPGA6 B00000000
#define SETPGA1 B00010000
#define SETPGA12 B01100000

#define SPI_SPEED 2500000
#define NOP 0x00

uint16_t chSet;
double real-val;
const int datasize = 400;
volatile int data[datasize];
volatile int DRDY_state = HIGH;
void waitforDRDY ();
void DRDY_Interrupt ();
void prepare_init ();
void packet_ADS ();
int16_t read_value ();
void send_command (uint8_t cmd);
uint8_t out1、out2、out3;
uint8_t debug_msg = 1U;
字符串 Sep =------------------------------------------------------- ";
字符串 hex_to_char (int hex_in){
int precision = 2;
char tmp[16];
char format[128];
sprintf (format、"0x%.%DX"、 Precision);
sprintf (tmp、格式、hex_in);
//Serial.print (tmp);
return (String (tmp));
}

void DRDY_Interrupt (){
DRDY_state = low;
}

void waitforDRDY (){
while (DRDY_state){
CONTINUE;
}
noInterrupts ();
DRDY_ST态=高电平;
INTERRUPTS ();
}

Int16_t READ_VALUE (){
Int16_t ADC_val = 0;
waitforDRDY ();
SPI.beginTransaction(SPISettings(SPI_CLOCK_DIV8、MSBFIRST、SPI_MODE1));
digitalWrite (PIN_CS,低电平);
delayMicroseconds (5);
spi.transfer (RDATA);
delayMicroseconds (7);
adc_val |= spi.transfer (NOP);
sery.println (adc_val);
delayMicroseconds (10);
adc_val <= 8;
adc_val |= spi.transfer (NOP);
serial.println (adc_val);
delayMicroseconds (10);
digitalWrite (PIN_CS、HIGH);
spi.endTransaction ();

返回 ADC_val;
}

uint8_t read_Byte (uint8_t reg_addr)
{
INT OUT = 0;

digitalWrite (PIN_CS、低电平);

SEND_COMMAND (RDATA);
OUT1 = SPI.transfer (0x00);
serial.println (out1);
delayMicroseconds (5);
OUT2 = SPI.transfer (0x00);
serial.println (out2);
delayMicroseconds (5);
out3 = spi.transfer (0x00);
serial.println (out3);
delayMicroseconds (1);
digitalWrite (PIN_CS、HIGH);
OUT =(OUT1 << 8)+ OUT2;
/*if (debug_msg)
{
serial.println (Sep);
serial.println ("sent:\t"+ hex_to_char (reg_addr));
serial.println ("已接收:\t"+输出);
}
*
return (out);
}

void preping_ADS (){
digitalWrite (PIN_CS、LOW);
delay (2);
SPI.setDataMode(SPI_MODE1);
SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV8);
SPI.begin();
}

void ADS_init_config(){
attachInterrupt (digitalPinToInterrupt (PIN_DRDY)、DRDY_Interrupt、Falling);
digitalWrite (PIN_CS、LOW);
SPI.transfer (WAKEUP);
SPI.transfer (SDATAC);
delay (2);

SPI.transfer (WREG | 0x01);
SPI.transfer (0x02);

//Config1
SPI.transfer (B10000110);

//Config2
SPI.transfer (0x00);

//Config3
SPI.transfer (B11101001);

SPI.transfer (WREG | 0x05);
SPI.transfer (0x07);
//CH1
SPI.transfer (B00000001);
//CH2
SPI.transfer (B00000001);
//CH3
SPI.transfer (B00000001);
//CH4
SPI.transfer (B00000001);
//CH5
SPI.transfer (B00000001);
//CH6
SPI.transfer (B00000001);
//CH7
SPI.transfer (B00000001);
//CH8
SPI.transfer (B00000001);

digitalWrite (PIN_CS、HIGH);
}


void send_command (uint8_t cmd)
{
digitalWrite (PIN_CS、低电平);
delayMicroseconds (5);// 5 = 6us (32时)
spi.transfer (cmd);
delayMicroseconds (10);
digitalWrite (PIN_CS、HIGH);
}

void set_channel (uint8_t ch、uint8_t 设置){
SPI.transfer (WREG | ch);
SPI.transfer (0x00);
spi.transfer (settings);
}

void packet_init(){
for (int i = 0;i < datasize;++I){
data[i]= 0;
}
}

void setup()
{
Serial.begin(9600);
引脚模式(CLK1、输出);
引脚模式(MISO1、输入);
引脚模式(MOSI1、输出);
引脚模式(PIN_CS、输出);
PinMode (PIN_RESET、OUTPUT);
//pinMode (PIN_START、OUTPUT);
引脚模式(PIN_DRDY、输入);
digitalWrite (PIN_CS、HIGH);
//digitalWrite (PIN_START、LOW);

preping_ads();
ads_init_config();
延迟(1000);
digitalWrite (PIN_CS、低电平);
延迟(1000);
digitalWrite (PIN_CS、HIGH);
延迟(1000);
SEND_COMMAND (SDATAC);
延迟(10);
SET_CHANNEL (CH1、SETPGA1);
}

void loop()
{
//chSet = READ_BYTE (RREG | ID);
//Serial.print ("-" ID"+ String (chSet)+"-");
//real-val =(double) 5*(double) read_value ()/(double) 65535;
read_value ();
serial.println (real_val);
延迟(1000);
} 

我很乐意提供任何建议。

此致、

Michael

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

    您好、Michael、

    我建议查看下面的 BIOS 常见问题解答: https://e2e.ti.com/support/data-converters/f/73/p/772058/2855202

    有几篇有关 SPI 通信和器件验证的文章可帮助您快速入门。  

    器件数据表以及 ADS1298ECG-PDK 用户指南也是很好的资源。

    我注意到、与您的问题无关的一点是、您的负输入应连接到中间电源、在本例中为2.5V。 将负输入直接连接到 GND 违反了可编程增益放大器(PGA)的输入共模范围。 为了使放大器正常工作、放大器需要与电源轨之间的一些净空。 更多信息可在数据表中找到。   

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

    Alex、您好!

    我已将 IN1N 重新连接至2.5V。现在我只测量零。 我将尝试在您的链接中找到解决方案、希望它能有所帮助。 我是否可以问、如果我理解正确、未使用的输入引脚应直接连接到5V? 我现在将它们悬空。

    非常感谢。

    此致、

    Michael

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

    您好、Michael、

    将未使用的模拟引脚连接到模拟电源将降低功耗。 不过、这并不是必需的、它们可以保持悬空。   

    很高兴能提供帮助! 通过这些链接工作、让我知道您的调试是如何进行的。  

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

    Alex、您好!

    我的问题主要在于代码。 我没有让 ADS1198正常启动。 我的接线也很糟糕、意外地在没有分压器的情况下将数字输入连接到了 aruduino uno。 现在、我测量通道1上的一些数据。

    非常感谢、链接非常有用。

    此致、

    Michael。

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

    您好、Michael、

    很高兴听到问题得到解决! 祝您好运、如果您有其他问题、请告知我们。