Software
Der Controller läuft mit dem internen 8 MHz RC-
Ein Quarz ist daher auch auf der Leiterplatte nicht vorgesehen.
Programmierung
Denken Sie daran, während der Programmierung des Controllers müssen Sie den Taster gedrückt halten da die Pins dann in Hi-Z wechseln und die Versorgung damit abgeschaltet werden würde. Der gedrückte Taster sorgt für eine permanente Versorgung der Schaltung während der Programmierung.
Timer Interrupt
Timer 0 wird benutzt um wiederkehrende Ereignisse (wie den Multiplex-
Da sich durch das Dimming die Refresh-
Timer 0 betreibt auch einen Sekunden-
Dieser ist jedoch nicht Bestandteil einer Echtzeituhr! Er wird zu verschiedenen Gelegenheiten auf 0 gesetzt, hauptsächlich um Timeouts zu realisieren.
Bin6toBCD8
Da der AD-
Ich habe diese Routine in Assembler geschrieben da sie sich hier wesentlich
effektifer realisieren lässt. In C
gibt es kein Carry-
Das gewählte Verfahren kommt mit 24 Schiebe-
Ich halte hier alle Werte in Registern. Dies beschleunigt die Ausführung,
die beträchtlich dauern kann. Ich verwende ausschließlich Register, die im
AVR-GCC als vogelfrei
gelten, also nicht auf dem Stack gesichert werden müssen.
Falls das aufrufende Programm sie benutzen würde, müsste es selbst für die
Sicherung vor und die Rücksicherung hinter dem Aufruf sorgen.
Wenn Sie einen anderen Compiler verwenden kann das möglicherweise nicht so funktionieren und Sie müssen die Register evtl. vorher sichern!
Meine Version benötigt also kein RAM und keinen Stack, lässt sich aber nicht so einfach auf größere Datentypen erweitern da nicht genug freie Register verfügbar sind.
Natürlich sabotiert diese Methode jeglichen Portabilitäts-
Power-Save-Modus
Wenn sich das Gewicht nicht wesentlich ändert wird
in den Power-
Ändert sich das Gewicht wird wieder in den Normal-
Ändern heißt hierbei mehr als 5 g Unterschied zum Gewicht vor einer Sekunde.
Abschaltung
Bei mehr als vier Minuten Inaktivität schaltet sich das Gerät selbst ab.
Erst damit ist die Zuwiegefunktion gelöscht und beim erneuten Einschalten
zeigt die Waage 0 als Start-
Wenn Sie tatsächlich mehr als vier Minuten benötigen und weiter messen wollen
können Sie durch einen kurzen Druck auf den Wägeteller oder dem Taster zum Normal-
Wenn kein nennenswertes Gewicht aufliegt (±5 g) erfolgt
die Abschaltung bereits nach 15 s. Das dient der Batterie-
Kalibrierung
Wird der Taster für mindestens 10 s gedrückt wechselt die Waage
in einen Kalibrier-
Nach Loslassen des Tasters kann der Benutzer eines der vordefinierten Referenzgewichte auswählen. Durch Tastendruck kann zum nächsten passenden gewechselt werden.
Erst wenn länger als fünf Sekunden kein Tastendruck erfolgt, gilt das aktuell angezeigte Gewicht als gewählt. Sein Wert blinkt nun für drei Sekunden schnell um die Wahl anzuzeigen.
Halten Sie nun dieses Referenzgewicht bereit, wir brauchen es bald! Wenn Sie sich hier vertan haben, trennen Sie einfach die Stromversorgung oder warten Sie eine Minute bis das Gerät sich selbst abschaltet und nichts wird sich ändern.
Das Gerät erwartet zunächst einen leeren
Wägeteller und zeigt dann don't touch
(-touch).
Daraufhin werden 128 Messungen vorgenommen um den Nullpunkt zu ermitteln.
Die Waage mittelt dazu 128 Messungen was etwa 13 s
dauert.
Ein (hexadezimaler) Count-Progress-
der Messung.
Das Display zeigt danach rEF. Warten Sie bis dahin. Berühren Sie nicht
den Wägeteller und machen sie keinen unnötigen Wind. All dies würde die Kalibrier-
Auch hier mittelt die Waage über 128 Messungen was wiederum etwa 13 s dauert. Berühren Sie in dieser Zeit nicht den Wägeteller und machen Sie keinen Wind. Drehen Sie keine Heizung auf und öffnen Sie kein Fenster!
Die Waage zeigt das gemessene Gewicht an (was natürlich dem tatsächlichen Referenzgewicht entsprechen sollte) und es kann durch Tastendruck akzeptiert werden und wird damit im EEPROM als Referenz gespeichert.
Wenn Sie hierbei einen Fehler machen trennen Sie einfach die Stromversorgung oder warten Sie eine Minute bis das Gerät sich abschaltet und alles bleibt wie es war und wiederholen Sie die Prozedur. Durch Auflegen falscher Gewichte können Sie die Genauigkeit bis zur Unbrauchbarkeit verfälschen.
Insbesondere kann durch eine falsche Wahl des Referenzgewichts (z.B. Sie wählen 5 kg, legen aber nur 2 kg auf) eine völlig unsinnige Referenz gespeichert werden.
Wenn Sie das angezeigte Gewicht bestätigen (und nur dann) wird es sofort als Referenz im EEPROM gespeichert und ist auch nach einem Neustart gültig.
Wenn an dieser Stelle keine Bestätigung erfolgt startet das Gerät nach einer Minute neu und alles ist wie vorher.
Umrechnung der Raw-Werte
Um das Gewicht aus einem 24-
Auch bei der Kalibrierung ist es so einfach möglich, die Komponenten a und b zu berechnen.
Interessant ist, dass die Berechnung in int64 zwar wesentlich kleineren Code erzeugt
aber mit 285 µs rund dreimal so lange dauert wie die Berechnung in double!
Das liegt wohl daran, dass double im AVR-
Filterung der Messwerte
Durch das Rauschen des AD-
Zum Testen habe ich drei Methoden einer digitalen Filterung implementiert:
- Gleitende Mittelwertbildung
- IIR-Filter
- FIR SINC-Filter
Gleitende Mittelwertbildung
GetAVG1 genannt in den Sourcen. Mein erster Ansatz war einen gleitenden Mittelwert über die jeweils letzten 8 Messungen zu bilden.
Diese Methode hat den Vorteil, dass sich das Ergebnis linear dem aktuellen Messwert annähert. Nachteilig ist der hohe Speicherbedarf, da wir uns die letzten acht Messwerte merken müssen.
Tatsächlich habe ich sogar noch eine erweiterte Version realisiert, die 64 Werte mittelt. Per Doppelklick (also zwei Tastendrücke innerhalb einer Sekunde) kann zwischen 8 und 64 Werten umgeschaltet werden.
Das Display zeigt nach einem Doppelklick kurz H1 oder L0 um den Hochauflösenden oder schnellen Modus anzuzeigen.
Der Nachteil dieser Methode ist der hohe Speicherbedarf. Die gleitende Mittelwertbildung benötigt etwa 100 Bytes mehr Flash und 256 Bytes mehr RAM als die nachfolgende:
IIR-Filter
Die zweite Methode, GetAVG2, berechnet das aktuelle Ergebnis lediglich aus dem letzten Messwert, der um eine Konstante stärker gewichtet wird, und dem aktuellen Messwert, also nach der Formel
Dies hat den Vorteil eines geringen Speicherbedarfs, auch für hohe Werte von c, erkauft mit dem Nachteil dass sich der Wert nur mit einer e-Funktion dem aktuellen Messwert annähert und damit, da wir hier nur mit Ganzzahlen rechnen, tatsächlich niemals. Er kommt nur auf (c-1) an den Messwert heran aber da dieser rauschbehaftet ist wird auch diese Grenze überwunden sofern das Rauschen größer als c ist.
Allerdings bewirkt genau diese e-
avgFactor
Ist die bestimmende Größe für GetAvg2(). Dies ist der Faktor, um den der letzte Wert höher gewichtet wird als der aktuelle Messwert. avgFactor wird wesentlich kleiner sein als histSize beim gleitenden Mittelwert da sich der Wert erst nach etwa 12×avgFactor Messungen stabilisiert.
Auch hier kann per Doppelklick zwischen zwei Werten umgeschaltet werden, schnell (L0) oder Präzision (H1).
Zum Kuchenbacken reicht LO (das auch nach dem Einschalten eingestellt ist) völlig aus da es hierbei nicht auf 10 oder 100 mg ankommt. Wenn Sie präzise messen wollen, schalten Sie mit dem Doppelklick um.
FIR-Filter
Der dritte Ansatz war ein FIR SINC-Filter, GetAvg3() genannt. Die endliche Impulsantwort liefert auch nach endlicher Zeit ein stabiles Signal.
Ich habe zunächst den Rechner von Tom Roelands benutzt um die Koeffizienten zu berechnen. (Cutoff-Frequency 2 Hz, Transition Bandwith 3 Hz, Hamming-Fenster) und erhielt ein Filter mit 11 Koeffizienten.
Allerdings kam mir dessen Ergebnis suspekt vor da der erste und letzte Koeffizient 0 war. Nun, ein anderer Rechner bei TFilter lieferte mir Ergebnisse bei denen das nicht so war!
Koeffizienten eintragen ist ja nicht so kompliziert so haben Sie in meinen Sourcen beide Optionen und können damit experimentieren.
Die Gretchenfrage: reichen 32 Bit für die Berechnung? Nun, nicht prinzipiell! Wenn alle Koeffizienten 127 wären und alle 24-bit-Werte 8388607 definitiv nicht. Aber die Koeffizienten sind nicht alle 127. Sie sind Konstanten sodass wir den einen Multiplikator kennen.
Die Summe der Absolutwerte ist 335 bzw. 361, so dass selbst bei knapp 6 Mio noch keinen Überlauf erzielen würden.
Der Wandler liefert nur etwa ±2 Mio Counts. Das Filter funktioniert auch mit 6 Mio noch ohne Überlauf sodass wir hier genug Reserve haben um die Berechnung mit 32 Bits zu riskieren.
Die ist meine erste Einschätzung, die auch experimentell funktionierte.
Da das FIR-
Auswahl der Filterung
Welche Methode sie bevorzugen müssen sie zur Compile-
Bildung des Anzeigewertes
Der HX liefert 10 Messwerte pro Sekunde. Selbst der gefilterte Wert rauscht erheblich und ist daher nicht direkt zur Anzeige geeignet. Die letzten zwei Digits würden nur unkoordiniert Flimmern und könnten vom Benutzer nicht erfasst werden.
Daher wird nicht jeder errechnete Wert direkt angezeigt sondern wir bilden erneut einen Mittelwert über die letzten vier gefilterten Werte und zeigen diesen 2.5 mal pro Sekunde an.
Diese Rate kann gut erfasst werden und der Wert wird dadurch deutlich ruhiger.