Hallo, ich brauche mal bitte einen Denkansatz. In der Arduino-IDE (ich hoffe in der richtigen Rubrik zu sein) erfasse ich einen Wert über einen ADC und via Serial. Der ADC-Wert wird immer ein wenig schwanken, der über Serial bleibt so, wie er übertragen wurde (liegt halt in der Natur der Dinge) Nun möchte ich aber immer den zuletzt geänderten Wert für eine Regelung übernehmen. Entweder stelle ich am Poti etwas ein oder sende einen anderen Wert über RXD. Wie (es muss nicht der Programm-Code sein, die logische Beschreibung würde mir reichen) erkenne ich was zuletzt geändert wurde und wie verhindere ich das kleine Spannungsschwankungen am ADC als neuer Wert gewertet werden? Danke für eure Hilfe!!!
Gerdi68 schrieb: > Wie (es muss nicht der Programm-Code sein, die logische Beschreibung > würde mir reichen) erkenne ich was zuletzt geändert wurde und wie > verhindere ich das kleine Spannungsschwankungen am ADC als neuer Wert > gewertet werden? Du speicherst den Werte im EEPROM, sofern dein Arduino sowas hat (die AVR-basierenden sollten sowas auf jeden Fall haben). Den Wert kannst du dann auch wieder aus dem EEPROM in dein Programm laden.
Vielleicht habe ich mich ungünstig ausgedrückt. Zur Laufzeit des Programms soll das passieren. Den Wert kann ich in einer Variable speichern. Der Wert darf nach einem Neustart auch 0 sein. Wie erkenne ich die Änderung? Und wie wird eine geringe Schwankung am ADC ignoriert? Wenn das Poti am ADC 100 erzeugt soll die Regelung mit 100 erfolgen. Wenn über Serial 200 empfangen wird dann soll die Regelung mit 200 erfolgen. Wenn wieder am Poti gedreht wird dann mit diesem Wert. Wenn die Versorgungsspannung schwankt oder die Bahn des Potis etwas dreckig ist und sich dadurch der ADC Wert ändert soll weiterhin mit dem letzten Wert geregelt werden.
Gerdi68 schrieb: > Wie erkenne ich die Änderung? > Und wie wird eine geringe Schwankung am ADC ignoriert? Alten Wert merken, mit Neuem vergleichen, nur bei (relevant großer) Änderung reagieren:
1 | ...
|
2 | |
3 | void loop() { |
4 | static float alter_messwert; |
5 | ...
|
6 | |
7 | float neuer_messwert=messe_und_berechne_irgendwas_vom_ADC(); |
8 | |
9 | if (fabs(alter_messwert - neuer_messwert) > 0.123) { |
10 | sende_messewert_sonswohin(neuer_messwert); |
11 | mache_regelungs_sachen_und_mehr(neuer_messwert); |
12 | ...
|
13 | alter_messwert = neuer_messwert; // merken |
14 | }
|
15 | ...
|
16 | |
17 | }
|
18 | |
19 | ...
|
Einfach zu jedem Wert auch einen Zeitstempel abspeichern. Dann kann man prüfen, welches der neueste Wert ist.
Vielen Dank!!! Ich glaube das habe ich verstanden ;)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.