medidas de voltaje hx711

Quería usar HX711 adc de 24 bits independiente para medir el rango de voltaje de 2mv - 20mv.

El problema es:

  1. No puedo interpretar las lecturas de adc como están en el cumplido 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 obtengo. 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 usa un divisor de voltaje simple para generar voltaje (solo para pruebas).

Se utiliza una biblioteca bogde/HX711: https://github.com/bogde/HX711 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);
}

Diagrama de circuito

Respuestas (3)

Un buen plan es comenzar dibujando un gráfico. Si comienza suponiendo que el ADC está bien, un gráfico le dirá qué tipo de compensación, ganancia y polaridad tiene. Simplemente metiendo los primeros números que publicaste en una hoja de cálculo y haciendo un gráfico XY, se obtiene esto.

La ecuación general de 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 el voltaje de entrada real, la otra y=mx+c, donde x es la lectura del ADC. Ajusté m y c aproximadamente para dar un ajuste razonable sobre parte de la curva. He dejado un poco fuera de lugar el desplazamiento para que puedas ver todos los rastros.

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

ingrese la descripción de la imagen aquí

Como ves, los puntos no encajan en una línea recta. Puede ser que el ADC no sea lineal. Puede ser que sus medidas de voltaje no sean lineales. Deberá investigar cuál antes de confiar en este sistema.

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 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 entender de dónde provienen las discrepancias de lineal.

Eres Neil, pero cómo estos valores (5219,5095,4981,4960,4918,4693,4075,3597,2700,562, -8388608, -8388607) se pueden convertir en voltaje, cómo se relacionan. hx711 es un adc diferencial con codificación de complemento a 2. Estoy obteniendo valores decimales (proporcionados arriba). Calculé el voltaje con un multímetro, pero quería que este adc diera un voltaje equivalente a estas lecturas.
Lo siento, pero si no puedes ver en un gráfico lineal cómo relacionar uno con el otro, no te voy a enseñar los fundamentos de las sumas. Bien, una gran pista. Escriba Vout = mx+c (la ecuación de una línea recta de las sumas 101), donde x es la lectura del ADC, m y c son constantes, que pueden ser negativas. Aunque puede resolver m y c con solo dos pares de lectura/salida usando ecuaciones simultáneas, podría ser más fácil para usted ponerlas en una hoja de cálculo y jugar con los valores de m y c hasta que la curva se ajuste. Sugerencia, m será negativo, porque la pendiente del gráfico lo es.
Ok, no quiero las ecuaciones de línea, ya las sé, debe haber alguna relación entre el conteo diferencial de ADC y el voltaje. Para que pueda implementar en el código y da voltajes, no estos valores.
La ecuación de línea es la relación. ¿Estás diciendo que no sabes cómo multiplicar y agregar flotantes en tu código?
@ShivankG OK, hice las sumas 101 para usted en la respuesta, ¿algún problema ahora?
Esto va realmente adelante en el proceso del sistema para la calibración de algún tipo. Se puede llegar a una respuesta inicial directamente desde la hoja de datos basada en la resolución y el rango de escala completa.
@ShivankG, este ADC nunca proporcionará datos con unidades de Volts. La mayoría de los ADC no lo hacen. Debe usar la relación de escala del ADC como explico en mi respuesta .

Tenga en cuenta que los complementos a 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 a 2 de 24 bits a int de 32 bits, lo que podría hacerse así (suponiendo que contiene la lectura sin procesar de 24 bits rawde HX711):

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

Esto es simplemente desplazar el MSB hacia la izquierda y luego desplazar el entero chamuscado hacia atrás, de modo que se conserve 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,2 V a 3,7 V, en el caso de que AVDD sea de 5 V (que no está en una placa de módulo común HX711). Por lo tanto, reducir A+/A- al rango de 2 mV-20 mV no funcionará. (Tuve dificultades y algunas lecturas no lineales extremadamente extrañas hasta que encontré el modo común en la especificación).

Por lo tanto, deberá escalar y cambiar su entrada, de modo que ambos A+/A- estén en el rango AGND+1.2 a AVDD-1.3.

Convirtiendo a mV ist que A V D D 2 24 1000 gramo a i norte v a yo .

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

V metro a X V metro i norte 2 norte b i t s = 5 V ( 5 V ) 2 10 b i t s = 9.765625 metro V L S B

Las unidades mV/LSBson 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.

Mirando la hoja de datos HX711 de 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 de un sensor de puente. Se puede programar con una ganancia de 128 o 64. Las ganancias grandes son necesarias para acomodar la pequeña señal de salida del sensor. Cuando se usa suministro de 5V en el pin AVDD, estas ganancias corresponden a un voltaje de entrada diferencial de 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 un suministro de 5 V en el pin AVDD.

Dado que la resolución interna del ADC es de 24 bits, puede calcular el peso 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.

Hola, usuario 2943160, tienes mi problema, en realidad solo estoy usando esta fórmula, cuando multiplico mi recuento de ADC a LSB, no da los valores correspondientes, por ejemplo: LSB = 4.8 nV, LSB * 562! = 40 mV.
Además, estoy usando ChannelA con AVDD de 5 voltios, un divisor de potencial simple para reducir el voltaje de 2 mV a 40 mV. Como puede ver en lo dado, ya estoy usando la biblioteca sparkfun, también me las arreglaré para publicar mi diagrama de circuito.
Publique un esquema de su configuración de prueba en su pregunta (además del diagrama de cableado). Simplemente muestre las conexiones para la creación de la señal mV y el conector Ain o Bin para el HX711. Debe asegurarse de que sus señales de entrada también estén dentro del rango de entrada válido de las entradas analógicas.