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.

[参考译文] ADS1256:ADS1256未输出数据

Guru**** 2539500 points
Other Parts Discussed in Thread: ADS1256

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/707113/ads1256-ads1256-is-not-outputting-the-data

器件型号:ADS1256

您好!  

我在 ADS1256上工作了将近一个月。 我使用的是 AVR ATmega1284P 8位微控制器。 我所面临的问题是、当我对 ADS 进行编程时、它的工作时间不到5秒、并且不会再次工作、除非我断开电源并重新插回电源。 它工作几秒钟、然后输出再次消失。 请查看我的以下代码、我们非常感谢您的帮助。 fCLKIN 为8MHz、SCK 为2MHz。 我自己验证了中断功能是否正常工作。 所有内容都处于默认状态、我在默认状态下读取转换结果。 此外、请告诉我我的 T6计算结果是否正确。 我要提到的另一点是、每8个时钟周期后、SPI 时钟中就会有间隙。 这是否会影响输出?

谢谢。

e2e.ti.com/.../ADS1256.txt

/*
 * ADS1256.cpp
 *
 *创建时间:2018年6月13日下午3:47:12
 作者:Ajay
 *
#include
#include
#define MYUBRR 51
#define F_CPU 8000000UL
#include
unsigned char SPI_tranceiver (unsigned char 数据);
void USART0_Init (void);
void 传输(无符号字符数据);
INT A = 0;
unsigned long ADC_val = 0;
ISR (INT0_vect)

如果(A ==0)

 SPI_tranceiver (0x03);
 _delay_us (25);
 A = 1;
}  
ADC_val = SPI_tranceiver (0);
ADC_val <<= 8;
ADC_val = SPI_tranceiver (0);
ADC_val <<= 8;
ADC_val = SPI_tranceiver (0);  
int main (空)
{  
 DDRB |= 0b10110000;//将 MOSI、SS 和 SCK 设置为输出、将 MISO 设置为输入
 
 SPCR |=(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(1<<CPHA)|(1<<SPR0)|(0<  SPSR |=(1<<SPI2X);
 
 EIMSK |=(1<  EICRA |=(1<<ISC01)|(0<  
 SEI();//启用中断
 
   while (1)
   {
  USART0_Init();  
  Transmit ((adc_val >>16));
  Transmit ((adc_val >>8));
  传输((adc_val));
 }
unsigned char SPI_tranceiver (unsigned char 数据)

 SPDR =数据;
 while (!(SPSR &(1<<SPIF)));
 return (SPDR);
空 USART0_Init (空)

 UBRR0H =(无符号字符)(MYUBRR>>8);
 UBRR0L =(无符号字符)(MYUBRR);
 UCSR0B =(1<<RXEN0)|(1<<TXEN0);
 UCSR0C =(0<<USBS0)|(1<<UCSZ00)|(1<<UCSZ01)|(0<<UCSZ02)|(0<<UMSEL00);
空传输(无符号字符数据)

 while (!(UCSR0A 和(<UDRE0)) );
 UDR0 =数据;

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

    您好 AjayS、

    欢迎访问 TI E2E 论坛!

    您是切换/CS 引脚还是将其设置为低电平?
    /CS 会重置 SPI 接口、并在 MCU 和 ADC 碰巧不同步时帮助恢复通信、因此、如果可能、我始终建议在 SPI 命令之间切换/CS、以确保对每个命令进行干净的启动。

    我还建议将 ADS1256编程为较低的数据速率、以查看通信是否得到改善。 默认情况下、ADS1256配置为最快(30kSPS)的数据速率、对于微控制器而言、这可能太快、无法跟上读取数据的步伐并将其通过 UART 进行传输。 此外、当中断发生时、当前您可能只通过 UART 部分发送了完整的24位值(因此 UART 数据可能看起来已损坏)。


    您可能还会看到这个类似的 E2E 主题: e2e.ti.com/.../2602393。 我为解决该问题而提出的许多建议也适用于此问题;尤其是检查 SPI 总线上是否存在可能导致 ADC 停止响应命令的信号完整性问题。

    此致、
    Chris

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

    CS 引脚始终为低电平。 我也在发送 SYNC 命令、但它仍然执行相同的操作。 如果我将 SPI 频率降低到1MHz、会发生奇怪的情况。 SPI 32时钟不能在 DRDY 中放入一个周期。 这意味着 DRDY 在所有24位移出之前再次变为高电平。
    我也在尝试对其进行编程、但我遇到了问题。 WREG 命令是直接向前的、即0x50。 当 DRDY 发生时、我发送0x50、后跟寄存器地址、比如0x00 (状态寄存器)。 我不知道的是我应该在寄存器地址之后发送的 I/O 命令。 最后一个字节将是我要写入的寄存器的数据。 那么、是否可以这样写:

    SPI_transreceiver (0x50);
    SPI_transreceiver (0x00);
    SPI_transreceiver (??);
    SPI_transreceiver (0x00);

    我还查看了此 ADS1256的 Arduino 代码。 我尝试了相同的东西、但无法使其正常工作。
    谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 AjayS、

    对于 WREG 命令、命令字节(0x50)和寄存器地址应与一起进行 AND 运算... 因此、在您的示例中、从状态寄存器开始写入的命令将为"0x50"。 (要写入 MUX 寄存器的地址"0x01"、命令将为"0x51"。)

    若要写入单个寄存器、则只需发送3个命令字节: "0x50 0x00 0x??"、其中第一个字节是命令字节/地址、第二个字节是要写入的寄存器数量(-1、例如0x00写入单个寄存器、0x01写入2个寄存器等)、最后第三个字节是要编程的数据。

    向 DRATE 寄存器写入以降低 ADC 的数据速率、其内容为"0x53 0x00 0x03"、其中"0x03"对应于2.5SPS。
    尝试发送此字节序列、然后检查/DRDY 脉冲周期是否降至1/2.5SPS 或每400ms 触发一次脉冲。

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

    尊敬的 Chris:  

    我尝试提供0x50、0x00、0x03、但无论我在中给出的 SPS 值是多少、DRDY 脉冲始终相同、即64us。 这意味着代码有问题。 因此、我的实现方式如下:

    A=0;

    ISR (INT0_vect)

     如果(A ==0)
     {
     SPI_tranceiver (0x50);
     SPI_tranceiver (0x00);
     SPI_tranceiver (0x03);
     _delay_us (5);
     A = 1;   
     }
     
     其他
     {
     SPI_tranceiver (0x01);
     SPI_tranceiver (0x00);
     SPI_tranceiver (0x00);
     SPI_tranceiver (0x00);
     }

    我不确定其他方法。

    感谢您的帮助、

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

    我可能建议在尝试配置器件之前先发送 RESET 命令。 复位可能有助于缓解任何潜在的启动问题、还会将器件置于 SDATAC 模式(允许您写入器件寄存器)。

    如果这不能解决问题、您能否捕获 SPI 通信的示波器屏幕截图并在此处共享(特别是 WREG 命令字节)? ...通常情况下、您可以在示波器上发现您无法仅通过查看代码了解的通信问题。

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

    您好 Chris、

    所以、我稍微使用了 ADS1256、结果是我对它进行了编程、以2.5SPS 的速率采样。 我没有在示波器上缩小以看到400ms。 我将刻度设置为50us、这就是我缺少整个波形的原因。 此外、我已经针对不同的 SPS 尝试了不同的命令、所有这些命令都是成功的。 我遇到的下一个问题是输出位。 例如、最大负输入时的输出应为800000h、但不是800000h。 完全为0也是如此。 输出确实与输入相对应、当我更改输入时会发生变化、但它与应有的不同。 我已附上下面的波形图:

    蓝色波是 SPI 时钟、黄色波是 DRDY、绿色波是输出。 两个通道的输入均为接地。

    再次感谢  

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

    我很高兴听到您在沟通问题上取得了进展!

    ADC 的输出结果与输入信号相差多远? 您能否提供一些示例?

    您将需要检查偏移和增益误差是否可以由 ADC 或信号源的指定误差解释。 此外、查看基准电压并确保其准确无误、并且不会振荡。 基准源中的任何误差都将直接影响 ADC 输出结果。

    此致、
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我从未接触过 ADS1256的偏移或校准、我不确定这是不是这里的问题。 我配置 ADS1256连接的方式是:

    VREFP = 5.0V
    VREFN = 0.0V
    额定电压= 0.0V
    AIN0 = 0V 或5V
    AIN1 = 0.0V

    我将 AIN0用作我的正通道、将 AIN1用作负通道。 当我在 AIN0处具有0.0V 电压时、输出为0b00000000 00111000 0110100。 当我在 AIN0处有5.0V 时、我得到0b01000000 10000110 01000110。 即使我使用不同的通道、这看起来也是一样的。 对于电源、我有一个平稳的直流输入(在示波器上检查)。 我尝试执行偏移和增益校准、但没有发生任何情况。

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

    尝试将 VREFP 上的电压降低到2.5V ...

    ADS1256不应与大于2.6V 的基准电压一起使用。 这种较大的电压可能会导致一些内部泄漏或其他不良影响、从而影响转换结果。

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

    我已将 VREFP 更改为2.5V、但结果仍然相同。 您认为我是否通过向 VREFP 输入5V 电压来损坏 IC? 我已经尝试了多个东西、在0V 时无法得到确切的0。 结果中始终有一些1。 还有什么其他问题导致了这种情况吗?

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

    我认为这不会损坏器件、因为它不会超过"ABS"。 规格"。

    再说一次、您与"0"的距离有多近? 对于24位 ADC、您将获得精确的代码、这是完全不同的、因为一个代码的步长非常小。 如果您在+/- 100个代码范围内、您可能只会看到偏移。 还要记住、输出是有符号的、因此0xFFFFFF(-1)可能是大约0V 的输出。

    此致、
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ADS1256现在工作完全正常。 谢谢 Chris。 我已拔下电源插头;并已将电源插回 ADS1256、并且工作正常。 现在、当正输入为最大值时、我得到7FFFFFh;当负输入为最大值时、我得到800000h 谢谢 Chris 和 TI、我爱你们。