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.

[参考译文] ADS124S08:对 CH1进行采样时出现问题

Guru**** 2589280 points
Other Parts Discussed in Thread: ADS124S08

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1009602/ads124s08-trouble-sampling-ch1

器件型号:ADS124S08

我正在使用 ADS124S08。  我能够读写寄存器设置、访问了内部温度传感器、并能够显示数据。

尝试访问 CH1转换数据时出现问题。   

如果我将 CH1+和 CH1-短接在一起、则读取三个片段的 FF Ex 会得到 FF FF。  我在5V 时使用 REF0。

我的设置寄存器如下所示

output_low (CS_ADC);
DELAY_us (ADC_DELAY);

SPI_Xfer_124S08 (ADS124S08_WAKE_UP);// WAKEUP 命令
SPI_Xfer_124S08 (ADS124S08_RESET);//重置命令
DELAY_us (ADC_DELAY);
SPI_Xfer_124S08 (ADS124S08_WREG | ADS124S08_STATUS);// WREG 寄存器从状态寄存器0x43H 开始
//只写状态寄存器
SPI_Xfer_124S08 (0x00);// 1-1 = 0


SPI_Xfer_124S08 (0x00);//清除状态寄存器上的 POL 位
DELAY_us (ADC_DELAY);
SPI_Xfer_124S08 (0x42);//WREN REG 从0x02处的 MUX 寄存器开始
SPI_Xfer_124S08 (0x03);//写入四个寄存器的 MUX PGA 速率和 REF

SPI_Xfer_124S08 (0x01);// MUX 寄存器
//选择 CH 1

SPI_Xfer_124S08 (0x08);// PGA 寄存器
//增益= 1.

SPI_Xfer_124S08 (0x09);//采样率寄存器

SPI_Xfer_124S08 (0x30);// REF 寄存器

然后、我为数据循环以下代码:

delay_ms (100);

OUTPUT 高电平(START_ADC);//开始线路高电平
//转换从此处开始

OUTPUT 高电平(CS_ADC);
delay_us (ADC_delay);//此处只是一个小延迟

//DRDY_TICKs = 0;//在轮询前初始化安全计数器


DRDY_FLG = 0;//清除转换标志

while (!DRDY_flg){
//在此处挂起等待 ADS124S08转换

delay_ms (100);
output_toggle (G0_select); //由作用域用于检查代码运行的位置。

}//结束转换等待循环

output_low (CS_ADC);
delay_ms (ADC_delay);

if (DRDY_flg){//发生转换

SPI_Xfer_124S08 (0x12);// RDATA 寄存器


DATA_1 = SPI_Xfer_124S08 (0);
DATA_2 = SPI_Xfer_124S08 (0);
DATA_3 = SPI_Xfer_124S08 (0);


output_low (start_adc);
//output_high (CS_ADC);//禁用 ADC 通信

DRDY_FLG = 0;

ADC_DELAY 为100

我相信我的设置正确、它确实运行、只是读取了我感觉的正确值。  如果我打开 CH+和 CH1-行使其处于浮动状态、那么我会降低数据、如00 0A 23、它会发生浮动。

如果您需要、我可以发布更多信息。   

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

    您好、Greg、

    ADS124S08以二进制补码输出转换结果。  负满量程为0x800000、0xFFFFFF实际上 为-1十进制。  因此返回的值略为负、这可能是由于 ADC 偏移为负值。

    ADC 输入是差分测量、这意味着输出代码基于 AINP 和 AINN 输入值。  如果 AINP 电压大于 AINN、则输出代码将为正、如果 AINP 小于 AINN、则输出代码将为负。  您正在使用的多路复用器配置是 AIN0是 AINP、AIN1是 AINN。  如果让输入悬空、它们可以悬空到任何值。  如果您将 AIN0保持开路(或悬空)并且仅连接 AIN1、则输入处于未确定状态。  AIN0和 AIN1应连接到 ADC 输入范围内的有效输入电压。

    启用 PGA 后、您所使用的 PGA 寄存器设置的增益为1。  启用 PGA 后、您无法进行接地基准测量、因为它将超出 PGA 的输入范围。  由于基准电压为5V、我假设您正在尝试进行相对于 AGND 的测量。  如果是、AINN 输入应连接到 AGND、待测量的电压应连接到 AIN0 (AINP 输入)。  您还需要将 PGA 设置为禁用和旁路。

    对于数据速率寄存器设置、您使用的是 Sinc3滤波器和400sps 数据输出速率。  START 引脚变为高电平后的第一次转换将在数字滤波器完全稳定之前进行3次完整的转换。  当 START 引脚变为高电平时、DRDY 引脚将变为高电平、并且在 DRDY 变为低电平之前不会提供转换数据。  您在 while 循环中执行的操作似乎相反、但这可能是正常的、具体取决于您如何确定 DRDY 的状态、因为代码的该部分未显示。

    此致、

    Bob B

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

    感谢 Bob、是的、二进制补码令人困惑。  CH1的正负端子短接应读数接近零、而在二进制补码世界中、查看数据表 FF FF FF FF 近零。  我已将代码更改为使用有符号 int32变量、因为我使用的是无符号 int32。  明天、我将把一个电桥连接到 CH1输入、看看它是如何工作的。  至于 DRDY、当 DRDY 变为低电平时、我会在中断中将其设置为"1"。  因此、有一点向后、但当事件(DRDY 低电平)发生时、我的标志设置为"1"。  明天下午6点到办公室12小时。

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

    您好、Greg、

    还有一个想法。  使用 Int32时 、必须正确地将24位值扩展为32位格式。  有许多方法可以实现这一点。  一种方法是汇编数据、然后将左移8位、然后 将右移8位。  这样做的是强制一个值进入符号位(MSB)、当右移回正确的值时、符号位(MSB)将跟随该位返回。  您还可以监视24位值的最高有效位、如果该位为高电平、则只需'OR' 0xFF000000即可设置适当的位来设置符号。

    此致、

    Bob B

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

    感谢 Bob、我现在就在这里。  我将 SPS 设置为1000并使用低延迟滤波器、因此速率寄存器为0x1B。

    当我将 CH1+和 CH1-线路短接在一起时、我会得到这种输出:

    CA 19 19美元19#
    CA 17 17美元17#
    CA 17 17美元17#
    $CA 7 7#
    CA 16777180 16777180美元#
    CA 16777198 16777198美元#
    CA 16777196 16777196美元#
    $CA 9 9#
    Ca 54 54 54美元#
    $CA 31 31
    CA 16777206 16777206美元#
    CA 16777212 16777212美元#
    CA 16777187 16777187#美元
    CA 16777209 16777209美元#
    CA 16777200 16777200#美元
    CA 16777183 16777183#美元
    CA 16777169 16777169美元#
    CA 16777193 16777193#
    $CA 70 70#

    可以忽略字符串中的第二个数字、因为它是我的滤波器算法输出、现在它被绕过、 我希望值较低(接近零个数字)、但不希望值较大的16777206数字。

    以下是我在 C 语言中的转换:

    signed Int32 convert_2s_f늹 돤(signed Int32 number){
    //将数字从二进制补码转换为十进制数
    //第24位针对 SET 进行了测试。

    int32 bit_test = 0x00800000;//第24位设置为1
    int32值= 0;

    值=数字和 bit_test;

    如果(值> 0){//24位设置编号为负

    number =~number + 1;
    number = number *(-1);


    退货编号;


    }//结束 convert_2s_补 码()

    我欢迎你的想法。   

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

    另一件事是、这里是我的 fprintf 语句、也许我刚才对 signed Int32进行了错误的格式化

    fprintf (OOK_serial、"$ca\t%ld、t%ld、\n\r\n "、DATA_1_32、ADC_NUM);    //使用 CE 命令测试 ADC

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

    您好、Greg、

    您在实际数字转换中发生了错误、因为您反相的值最初未正确地符号扩展到32位。  因此、请尝试以下更改:

    如果(值> 0){//24位设置编号为负

    Number |= 0xFF000000; //这会将24位符号扩展到32位

    您不需要通过乘法将数字设为负值、因为该值将通过整数的符号位的值进行调整。 例如、当被放置在32位整数中时、24位的0xFFFFFFF 值将由0x00FFFFFF 表示。  通过'OR'到值0xFF000000、该值现在将被符号扩展到0xFFFFFFFF、这将被解释为-1十进制。

    此致、

    Bob B

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

    感谢 Bob 的帮助。  我相信、在我启动 ADS124S08时、我们将讨论更多内容。