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.

[参考译文] ADS1232:根据输入重量、ADC 输出代码并不准确

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1226616/ads1232-adc-output-code-is-not-accurate-as-per-the-input-weight

器件型号:ADS1232

您好、E2E 专家!

你好。

我在称重应用中使用 ADS1232。 ADC 输出与输入不同。 可以帮帮我吗?  

AVDD = 5V、VREF = 5V、数据速率= 10SPS

以下是我的代码。

unsigned long ADS1232_read ()

有符号长整型 adc_val = 0;
char cy_count = 0;

while (HAL_GPIO_ReadPin (GPIOB、GPIO_PIN_13));
HAL_DELAY (4);

对于(cy_count = 0;cy_count < 24;cy_count++)

adc_val = adc_val << 1;

HAL_GPIO_WritePin (GPIOB、GPIO_PIN_12、GPIO_PIN_SET);//clk 高电平
HAL_DELAY (4);//最小100ns

if (HAL_GPIO_ReadPin (GPIOB、GPIO_PIN_13))//data low /high

adc_val += 1;
}
HAL_GPIO_WritePin (GPIOB、GPIO_PIN_12、GPIO_PIN_RESET);//clk 低电平
HAL_DELAY (4);
}

HAL_GPIO_WritePin (GPIOB、GPIO_PIN_12、GPIO_PIN_SET);
HAL_DELAY (2);
HAL_GPIO_WritePin (GPIOB、GPIO_PIN_13、GPIO_PIN_SET);
HAL_DELAY (2);
HAL_GPIO_WritePin (GPIOB、GPIO_PIN_12、GPIO_PIN_RESET);
HAL_DELAY (2);

adc_val &= 0x7fffc0;
adc_val = adc_val >>6;

返回 adc_val;

}

根据输入重量、输出代码不准确。

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

    您好!

    我想你得到的结果是错误的一大笔,而不是几个百分点。  使用逻辑分析仪或示波器捕获/PDWN、/DRDY/DOUT 和 SCLK 引脚、以确认正确的时序和预期波形、这一点也很有用。

    浏览代码、看起来你正在拆裂 SPI 端口、这个端口应该运转良好。  我确实注意到、您正在发送第25个 SCLK 以在数据检索后强制/DRDY/DOUT 引脚为高电平。  但是、您要写入/DRDY/DOUT 引脚、它是 ADS1232上的数字输出引脚、只能从该引脚读取、而不能强制为高电平。  我建议将以下代码从

    HAL_GPIO_WritePin (GPIOB、GPIO_PIN_12、GPIO_PIN_SET);
    HAL_DELAY (2);
    HAL_GPIO_WritePin (GPIOB、GPIO_PIN_13、GPIO_PIN_SET);
    HAL_DELAY (2);
    HAL_GPIO_WritePin (GPIOB、GPIO_PIN_12、GPIO_PIN_RESET);
    HAL_DELAY (2);

    替换为以下内容:

    HAL_GPIO_WritePin (GPIOB、GPIO_PIN_12、GPIO_PIN_SET);
    HAL_DELAY (4);
    HAL_GPIO_WritePin (GPIOB、GPIO_PIN_12、GPIO_PIN_RESET);
    HAL_DELAY (4);

    第25个 SCLK 将在数据检索后强制/DRDY/DOUT 输出为高电平、并且仅在准备好从 ADC 检索下一个数据时才会变为低电平。

    另外、似乎你正在将 ADC_val 结果中的符号位强制为0。  如果 ADC 结果为正值、则您应该获得预期的结果、但如果结果为负值(由于偏移或噪声)、 然后、由于 ADS1232的二进制补码格式、强制符号位为0将使接近0的较小负值看起来接近满量程值。  我建议将 ADC 结果保留为长有符号整数、并将 ADC_val 左移8位。  然后、您将得到一个32b 有符号整数、8个 LSB 等于零。  您稍后可以在代码中轻松地对其进行缩放、以生成正确的重量测量值。

    更改自:

    adc_val &= 0x7fffc0;
    adc_val = adc_val >>6;

    替换为以下内容:

    adc_val = adc_val <<8;

    此致、
    Keith Nicholas
    精密 ADC 应用

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

    Keith、您好、

    你好。

    1. 对于 5V 基准电压和128增益无噪声分辨率位为18位、数据表中对此进行了说明。 因此我使用了 ADC_value =ADC_VALUE & 0x7fffc0。这是 ADC_value 是无噪声计数。 我的陈述 是正确的。 为什么需要执行左移8次?
    2. 尽管 我使用了18位无噪声计数进行计算、但计数仍然不稳定。
    3. 请为我提供用于滤除噪声的输入侧硬件电路建议。
    对于5V 基准128增益
    信号输入范围为 +/-19.5mv
    因此、对于 +19.5mv 8388607 (0x7FFFFF)
    因此、我只输入 ADC_value = 0x7FFFFF
    对于18位 ADC_VALUE = 0x7FFFE0;
    施加19.5mv 时得到的最大计数是8388544无噪声计数是否正确、我是怎么说的?
    对于0.125mv、我得到了计数53772。 并且大约有100个计数在振荡。
    如何纠正此问题?
    此致、
    CSC

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

    您好!

    1. 如果您想要一个有符号32b 整数及一个18b 无噪声结果、那么您首先需要向左移8位以保留符号位。  然后、在左移8之后、您可以右移14。  结果将是一个32b 有符号整数、表示 ADS1232至18b 的满标量程、十进制值的范围为+131、071至-1310、72。

     18个无噪声位是输入短路时 ADS1232的内部噪声。  连接外部电桥传感器时、您还将获得电桥传感器的噪声以及电缆连接的额外噪声。  电桥传感器将具有内部噪声以及任何外部噪声拾取、例如振动、空气运动等。

     您应该在 REF 输入和模拟输入上添加输入滤波器。  这将有助于过滤电缆拾取的任何噪声。  如果需要、可以将以下电容器值增加10倍、即10nF+100nF+10nF、以提高滤波器性能。  电阻器的值应该为0.1%耐受值、而电容器应该为具有1%耐受值的 C0G/NPO 陶瓷电容器。

    ADC 将具有偏移误差和增益误差。  根据符号和幅度、您可能需要施加大于19.5mV 的电压才能进入满量程。  此外、为了获得18b 的无噪声性能、您需要良好的 PCB 布局、旁路电容器应尽可能靠近电源引脚放置。  此外、引脚9和10之间的 PGA 旁路0.1uF 电容器应尽可能靠近 IC 引脚放置、这一点非常重要。  此外、该电容器需要是高质量 C0G/NPO 电容器。  按照图11-1中的电路板布局布线、在顶层下方使用实心接地层可提供最佳性能。

    我建议您查看应用手册   电桥测量基本指南 其中讨论了不同的电桥配置和偏移/增益校准问题。

    此致、
    系统工程师

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

    Keith、您好、

    你好。

    您能详细解释一下如何从24位数据中提取数字计数吗?

    此致、

    CSC

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

    您好!

    让我用数据表中表8-7的示例来解释这一点。

    如果 ADC 输入电压为正 1LSB、则输出代码为二进制00000000 00000001b、或十进制为+1。

    当您将此数据计时为预设为0的32b 有符号整数时、前8b 将为0、然后是24b 转换结果。

    00000000 00000000 00000000 00000001b

    左移8b 将导致以下结果:

    00000000 00000000 00000001 00000000b

    接下来、向右移动8b、您将得到正确的正值、在本例中、此值与移动数据之前的值相同。

    00000000 00000000 00000000 00000001b

    然而、当 ADC 输入电压为负1LSB 时、ADS1232的输出代码现在将为11111111 11111111b、它表示一个-1的十进制值。

    将此数据计时为 预设为0的32b 有符号整数、前8b 仍为0、然后是24b 转换结果。

    00000000 11111111 11111111 1111b

    如果不移动这些数据、处理器会将其解释为正数(+16777215十进制)。  要将24b 有符号整数从 ADS1232转换为32b 有符号整数、首先将左移8b、这将产生以下值:

    11111111 11111111 11111111 00000000b

    接下来、右移8b。  在这种情况下、处理器将保留 MSB 符号位、您将获得以下结果:

    11111111 11111111 11111111 1111111111111111b。

    现在这是十进制-1值的正确32b 代码。

    此致、
    系统工程师