Ich wollte den HX711 24-Bit-Adc-Standalone verwenden, um den Spannungsbereich von 2 mv bis 20 mv zu messen.
Das Problem ist:
Versucht mit verschiedenen Spannungswerten (unten geteilt), und ich bin völlig verwirrt mit den Messwerten, die ich bekomme. Ich weiß nicht, wie ich diese Werte in Spannung umwandeln soll. Was ist die Logik dahinter. Bitte helfen Sie!
Lesungen:
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.
Board ist Arduino Leonardo, und ein einfacher Spannungsteiler wird zur Spannungserzeugung verwendet (nur zum Testen).
Es wird eine bogde/HX711-Bibliothek verwendet: https://github.com/bogde/HX711 Code:
/#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);
}
Ein guter Plan ist, mit dem Zeichnen eines Diagramms zu beginnen. Wenn Sie davon ausgehen, dass der ADC in Ordnung ist, zeigt Ihnen ein Diagramm, welche Art von Offset, Verstärkung und Polarität Sie haben. Wenn Sie einfach die ersten paar Zahlen, die Sie in eine Tabelle geschrieben haben, hacken und ein XY-Diagramm erstellen, erhalten Sie dies.
Die allgemeine Gleichung für eine Gerade lautet y=mx+c. Ein guter ADC hat eine geradlinige Beziehung zwischen der Eingangsspannung und dem Ausgangscode.
Die Tabelle hat zwei Spalten, eine die tatsächliche Eingangsspannung, die andere y=mx+c, wobei x der ADC-Wert ist. Ich habe m und c grob angepasst, um eine vernünftige Anpassung über einen Teil der Kurve zu erzielen. Ich habe den Versatz etwas weggelassen, damit Sie alle beiden Spuren sehen können.
Sie werden feststellen, dass Sie den ADC-Wert mit einer kleinen Gleitkommazahl multiplizieren müssen. Ob Sie dies mit Ihrem speziellen Compiler tun können und wie genau, ist eine Programmierübung für Sie.
Wie Sie sehen, passen die Punkte nicht auf eine gerade Linie. Es könnte sein, dass der ADC nicht linear ist. Möglicherweise sind Ihre Spannungsmessungen nicht linear. Sie müssen untersuchen, welche, bevor Sie diesem System vertrauen.
Ich würde vorschlagen, die Spannung in etwa einem Dutzend Schritten von -FSD auf +FSD zu schwingen (ist sie so ausgelegt, dass sie zwischen +/- 5 V liegt?) Und dann ein ähnliches Diagramm zu zeichnen. Wenn Sie sehen können, was im Großen passiert, untersuchen Sie kleinere Bereiche. Beachten Sie, wo die Enden des gültigen Bereichs sind, und sehen Sie, welcher Code ausgegeben wird, wenn er überladen wird. Versuchen Sie zu verstehen, woher Abweichungen von linear kommen.
Beachten Sie, dass das 2er-Komplement in gewissem Sinne die "normale" vorzeichenbehaftete Ganzzahldarstellung ist. Was also tatsächlich erforderlich ist, ist das 24-Bit-2er-Komplement auf 32-Bit-Ganzzahl zu erweitern, was so gemacht werden könnte (vorausgesetzt, es enthält das rohe 24-Bit-Lesen raw
von HX711):
uint32_t raw = 0 ;
... // read HX711 bits in raw
int32_t val = ((int32_t)(raw<<8))>>8;
Dies verschiebt nur das MSB nach links und verschiebt dann die singende ganze Zahl zurück, sodass das Vorzeichen erhalten bleibt.
Bitte beachten Sie auch, dass laut HX711 der Gleichtakt des Differenzeingangs zwischen AGND+1.2 und AVDD-1.3 liegen sollte. Dies bedeutet, dass beide Eingänge, dh A+/A-, in diesem Bereich liegen sollten - 1,2 V bis 3,7 V, falls AVDD 5 V beträgt (was auf einer gemeinsamen HX711-Modulplatine nicht der Fall ist). Das Herunterskalieren von A+/A- auf den Bereich von 2 mV bis 20 mV funktioniert also nicht. (Ich hatte eine harte Zeit und einige extrem seltsame nichtlineare Messwerte, bis ich den Gleichtakt in der Spezifikation fand).
Sie müssen also Ihren Eingang sowohl skalieren als auch verschieben, sodass sowohl A+/A- im Bereich von AGND+1.2 bis AVDD-1.3 liegen.
Umrechnung in mV ist dann .
Die Spannungsäquivalenz Ihres ADC-Codeausgangs hängt vom Vollbereich des ADC und seiner Auflösung ab. Zum Beispiel eine ACD mit a Eingangsbereich und eine 10-Bit-Ausgabe hat:
Die Einheiten mV/LSB
sind bei der Arbeit mit ADCs ziemlich häufig. Sie können dann die erwartete Eingangsspannung finden, indem Sie einfach die aktuelle ADC-Zählung mit ihrem äquivalenten Spannungsschritt pro Zählung multiplizieren.
Betrachtet man das HX711-Datenblatt von Sparkfun , ist der Full-Scale-Bereich variabel und hängt von der Verwendung der A- oder B-Eingänge ab. Aus dem Datenblatt:
Der Differenzeingang von Kanal A ist so konzipiert, dass er direkt mit dem Differenzausgang eines Brückensensors verbunden wird. Er kann mit einer Verstärkung von 128 oder 64 programmiert werden. Die großen Verstärkungen werden benötigt, um das kleine Ausgangssignal des Sensors aufzunehmen. Wenn eine 5-V-Versorgung am AVDD-Pin verwendet wird, entsprechen diese Verstärkungen einer differenziellen Eingangsspannung im Vollausschlag von ±20 mV bzw. ±40 mV.
Der Differenzeingang von Kanal B hat eine feste Verstärkung von 32. Der volle Eingangsspannungsbereich beträgt ±80 mV, wenn eine 5-V-Versorgung am AVDD-Pin verwendet wird.
Da die interne ADC-Auflösung 24 Bit beträgt, können Sie die LSB-Gewichtung für jede der Verstärkungen von 32, 64 und 128 berechnen. Die Sparkfun-Bibliothek auf GitHub zeigt möglicherweise, wie dies in Code implementiert werden kann.
ShivankG
Neil_DE
ShivankG
Neil_DE
Neil_DE
Benutzer2943160
Benutzer2943160
Volts
. Die meisten ADCs nicht. Sie müssen das Skalierungsverhältnis des ADC verwenden, wie ich in meiner Antwort erkläre .