Load Cell für digitale Waage

OP #5834700
Lesenswert?

Hallo,
für ein Schulprojekt machen wir eine Waage.
Dazu wurde uns ein eine vorgefertigte Waage mit einer Load Cell gegeben. 
Diese hält bis 1kg.
Nun sollen wir, entweder mit HX711, oder ohne, eine Waage mit digitaler 
Ausgabe realisieren.
Als Mikrokontroller haben wir einen AT89C51 (31)

Geht es ohne den HX711 bzw. ist es ohne "leichter"?


MfG
#5834713
Lesenswert?

HX711: Wägezelle an den HX711 hängen, Mikrocontroller an den HX711 
hängen, auslesen.

Anders: Genaue Speise- und Referenzspannung erzeugen, Differenz-Signal 
aus Wägezelle ggf. filtern, ggf. verstärken, damit auf einen Verstärker 
zu Single-Ended und auf einen einfachen ADC oder das Differenzsignal auf 
einen ADC mit differentiellem Eingang. Mit einem Zooming ADC kann ggf. 
auch die Verstärkung entfallen. Und dann mit dem ADC an den Controller.


Der HX711 ist definitiv die günstigste, schnellste und einfachste 
Variante, um zu einem Ergebnis zu kommen. Dafür kann man sich dann in 
der Software ein bisschen austoben und dort ein gleitendes Filter, 
Offsetkorrektur, Nullpunktberuhigung,... Einbauen.
#5834721
Lesenswert?

Jonas A. schrieb:
> Aber wie lese ich "einfach" die Daten vom HX711 in C aus?

Genau so wie mit einem Arduino. Man kann die vorhandenen Libraries sogar 
recht einfach übernehmen.

Ansonsten:
https://cdn.sparkfun.com/datasheets/Sensors/ForceFlex/hx711_english.pdf

Dort ist das Protokoll dokumentiert und sogar ein C-Snippet angegeben.

Clock vorgeben und dazu Daten einlesen. Ist eigentlich recht einfach zu 
Fuß in C machbar. Muss ja auch nicht sonderlich schnell oder effizient 
sein, ansonsten könnte man das sicher dem HW-I2C beibringen.
OP #5834726
Lesenswert?

Sebastian R. schrieb:
> Jonas A. schrieb:
>> Aber wie lese ich "einfach" die Daten vom HX711 in C aus?
>
> Genau so wie mit einem Arduino. Man kann die vorhandenen Libraries sogar
> recht einfach übernehmen.
>
> Ansonsten:
> https://cdn.sparkfun.com/datasheets/Sensors/ForceFlex/hx711_english.pdf
>
> Dort ist das Protokoll dokumentiert und sogar ein C-Snippet angegeben.
>
> Clock vorgeben und dazu Daten einlesen. Ist eigentlich recht einfach zu
> Fuß in C machbar. Muss ja auch nicht sonderlich schnell oder effizient
> sein, ansonsten könnte man das sicher dem HW-I2C beibringen.


Einfach den Code verwenden?
ADSK ist clock und ADDO ist Daten Ausgang, verstehe ich das richtig?
Ich verstehe leider nicht ganz, was das Snippet genau macht.
Erhalte ich dann schon den richtigen Wert oder muss ich anhand von 
Kalibrierungen (mit Variablen?) diesen Wert annähern?


Liebe Grüße
#5834737
Lesenswert?

Jonas A. schrieb:
> Einfach den Code verwenden?

Nein. Die Abläufe verstehen und den Code auf deinen Controller anpassen.
Oder die Abläufe verstehen und selber umsetzen.

Jonas A. schrieb:
> ADSK ist clock und ADDO ist Daten Ausgang, verstehe ich das richtig?

Kann man so sagen.

Jonas A. schrieb:
> Ich verstehe leider nicht ganz, was das Snippet genau macht.

Spannend ist eigentlich nur die For-Schleife. Vereinfacht gesagt werden 
24bit eingelesen.

Pro Durchlauf:

- Clock High
- Daten um einen nach links shiften
- Daten-Pin high? Wenn ja, Daten um einen erhöhen
- Clock low

Jonas A. schrieb:
> Erhalte ich dann schon den richtigen Wert oder muss ich anhand von
> Kalibrierungen (mit Variablen?) diesen Wert annähern?

Du erhälst eine Zahl irgendwo zwischen 0 und 16777215. Dabei ist nichts 
kalibriert, denn sowohl HX711 als auch die Wägezelle schwanken von 
Exemplar zu Exemplar. Wenn man den Offset und die Emfpindlichkeit der 
Zelle und die Höhe der Speisespannung kennt, kann man sich grob den 
Bereich, in dem die Zahlen liegen werden, ausrechnen.

Du musst dann, sobald du Zahlen erhälst, die zum Wägebereich passen 
(Also einen ausreichend großen Bereich, ohne an die obere Grenze der 
24bit zu kommen), kalibrieren.

Dazu nimmst du den Zahlenwert, der bei 0g auf der Waage gemessen wird 
und den, der bei genau 1kg auf der Waage gemessen wird. Dazwischen 
kannst du linear skalieren. Geradengleichung, f(x)=m*x+b, zum Beispiel. 
Oder du guckst dir die map()-Funktion vom Arduino an, die kann man auch 
in normales C übernehmen.
#5835003
Lesenswert?

Jonas A. schrieb:
> Wie kann ich die letzten unteren 8 ausblenden?

Alles um 8 Bit nach rechts shiften.

Aber auf welchen Wert geht denn der Messwert unter Volllast? Bei einer 
theoretischen Auflösung von 16 Millionen Digits wären ein paar Tausend 
Rauschen völlig okay.

Die kann man mit Mittelung/gleitendem Filter gut in den Griff bekommen.

Wenn man dem Filter dann noch eine Abbruchbedingung verpasst, die bei 
großer Wertänderung die Filterung abbricht und neu beginnt, passt auch 
die Sprungantwort und als Anwender wartet man nicht ewig, bis der 
Messwert zum Ziel "gelaufen" ist.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren