Quería usar HX711 adc de 24 bits independiente para medir el rango de voltaje de 2mv - 20mv.
El problema es:
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);
}
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.
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.
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 raw
de 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 .
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 rango de entrada y una salida de 10 bits tiene:
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.
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.
ShivankG
Neil_ES
ShivankG
Neil_ES
Neil_ES
usuario2943160
usuario2943160
Volts
. La mayoría de los ADC no lo hacen. Debe usar la relación de escala del ADC como explico en mi respuesta .