hx711 mediciones de voltaje

2

quería utilizar HX711 adc independiente de 24 bits para medir el rango de voltaje de 2mv - 20mv. El problema es:

  1. No puedo interpretar las lecturas de adc ya que están en el complemento de 2.

  2. ¿Qué debo hacer en mi código (código a continuación) para que imprima voltajes no valores decimales?

Probé con diferentes valores de voltajes (compartidos a continuación), y estoy totalmente confundido con las lecturas que recibo. No sé cómo convertir estos valores en voltaje. ¿Cuál es la lógica detrás? ¡Por favor ayuda!

Lecturas:

   0mv  ---  5219,
 1.1mv  ---  5095,
 2.3mv  ---  4981,
 2.5mv  ---  4960,
 2.9mv  ---  4918,
   5mv  ---  4693,
10.6mv  ---  4075,
15.1mv  ---  3597,
22.7mv  ---  2700,
40.7mv  ---   562,
5volts  --- -8388608,
-5volts --- -8388607.

La placa es arduino leonardo, y se utiliza un divisor de voltaje simple para la generación de voltaje (solo para pruebas).

Se utiliza una biblioteca bogde / HX711: enlace Código:

/#include "HX711.h"
/#define DOUT  3
/#define CLK  2

HX711 scale(DOUT, CLK);

void setup() {
  Serial.begin(115200);
}

void loop() {
  long avg = scale.get_value(60);
  Serial.print("Digital Code = ");
  Serial.println(avg);
}

    
pregunta ShivankG

3 respuestas

1

Un buen plan es comenzar por dibujar un gráfico. Si comienza suponiendo que el ADC está bien, entonces un gráfico le dirá qué tipo de desplazamiento, ganancia, polaridad tiene. Con solo golpear los primeros números que publicaste en una hoja de cálculo y hacer un gráfico XY, obtienes esto.

La ecuación general para una línea recta es y = mx + c. Un buen ADC tendrá una relación de línea recta entre el voltaje de entrada y el código de salida.

La hoja de cálculo tiene dos columnas, una con el voltaje de entrada real, la otra y = mx + c, donde x es la lectura del ADC. Aproximadamente he ajustado m y c para obtener un ajuste razonable en parte de la curva. He dejado el desplazamiento desactivado un poco para que pueda ver todas las dos trazas.

Notará que necesita multiplicar la lectura de ADC por un pequeño número de punto flotante. Si puede hacer esto con su compilador particular, y exactamente cómo, es un ejercicio de programación para usted.

Como ves, los puntos no se ajustan a una línea recta. Puede ser que el ADC no sea lineal. Podría ser que sus mediciones de voltaje no sean lineales. Tendrá que investigar cuál de ellos confía en este sistema.

Yo sugeriría cambiar el voltaje de -FSD a + FSD (¿está diseñado para ir entre +/- 5v?) en una docena de pasos, y luego dibujar un gráfico similar. Cuando pueda ver lo que sucede a gran escala, examine los rangos más pequeños. Observe dónde están los extremos del rango válido y vea qué código genera cuando se sobrecarga. Trate de comprender de dónde provienen las discrepancias lineales.

    
respondido por el Neil_UK
0

La equivalencia de voltaje de la salida de su código ADC depende del rango de escala completa del ADC y su resolución. Por ejemplo, una ACD con un rango de entrada \ $ \ pm 5 \ mathrm {V} \ $ y una salida de 10 bits tiene:

\ $ \ frac {V_ {max} -V_ {min}} {2 ^ N \ mathrm {bits}} = \ frac {5 \ mathrm {V} - (-5 \ mathrm {V})} { 2 ^ {10} \ mathrm {bits}} = 9.765625 \ frac {\ mathrm {mV}} {\ mathrm {LSB}} \ $

Las unidades mV/LSB son bastante comunes cuando se trabaja con ADC. Luego puede encontrar el voltaje de entrada esperado simplemente multiplicando el conteo actual de ADC por su paso de voltaje equivalente por conteo.

Consulte la hoja de datos HX711 en Sparkfun , el rango de escala completa es variable y depende del uso de las entradas A o B. De la hoja de datos:

  

La entrada diferencial del canal A está diseñada para interactuar directamente con la salida diferencial del sensor de puente. Puede programarse con una ganancia de 128 o 64. Las grandes ganancias son necesarias para acomodar la pequeña señal de salida del sensor. Cuando se utiliza una fuente de 5 V en el pin AVDD, estas ganancias corresponden a un voltaje de entrada diferencial a escala completa de ± 20mV o ± 40mV respectivamente.

     

La entrada diferencial del canal B tiene una ganancia fija de 32. El rango de voltaje de entrada de escala completa es de ± 80 mV, cuando se usa una fuente de 5 V en el pin AVDD.

Con una resolución interna de ADC de 24 bits, puede calcular el peso de LSB para cada una de las ganancias de 32, 64 y 128. La Biblioteca Sparkfun en GitHub puede demostrar cómo implementar esto en el código.

    
respondido por el user2943160
0

Tenga en cuenta que los complementos de 2 son, en cierto sentido, la representación de enteros con signo "normal", por lo que lo que realmente se requiere es extender el complemento de 2 bits de 24 bits a int de 32 bits, lo que se podría hacer así (suponiendo que raw contiene la lectura cruda de 24 bits de HX711):

uint32_t raw = 0 ;
... // read HX711 bits in raw
int32_t val = ((int32_t)(raw<<8))>>8;

Esto es solo desplazar el MSB a la izquierda y luego desplazar el entero cantado hacia atrás, por lo que se conserva el signo.

Tenga en cuenta también que, según HX711, el modo común de la entrada diferencial debe estar entre AGND + 1.2 y AVDD-1.3. Esto significa que ambas entradas, es decir, A + / A- deben estar en este rango: 1.2V a 3.7V, en el caso de que AVDD sea 5V (que no se encuentra en una placa de módulo HX711 común). Por lo tanto, la escala A + / A- hasta el rango de 2mV-20mV no funcionará. (Tuve un momento difícil, y algunas lecturas no lineales extremadamente extrañas hasta que encontré el modo común en la especificación).

Por lo tanto, tendrá que escalar y cambiar su entrada, por lo que tanto A + / A- están en el rango AGND + 1.2 a AVDD-1.3.

La conversión a mV es mayor que \ $ \ frac {AVDD} {2 ^ {24}} \ frac {1000} {ganancia} val \ $.

    
respondido por el siddhadev

Lea otras preguntas en las etiquetas