ich arbeite gerade an einer Steuerung welche mir von einem Hydraulikmotor die Drehzahl regelt.
An der Steuerung sind 2 Drehzahlsensoren (induktiv) angeschlossen, welche mir die Drehzahlen liefern, diese werden dann verarbeitet und ein Stellmotor angesteuert, welcher mir die Ölmenge des Hydraulikmotors verstellt...
Die ganze Regelung funktioniert so auch einwandfrei.
Auf einem LCD 20x4 mit HD44780 werden mir div. Drehzahlen angezeigt. Leider stürzt mir das LCD immer wieder "sporadisch" ab und zeigt wirre Sachen an.... Die Steuerung läuft jedoch weiter, da der Stellmotor nach wie vor einwandfrei angesteuert wird.
Die LCD Ansteuerung ist folgendermaßen programmiert,
ich schreibe die festen Texte (Beschriftung) auf das LCD, welche sich nicht ändern
in einer Schleife werden dann immer wieder die geänderten Werte an die verschiedenen Positionen gesendet. Die Werte werden jedoch nur gesendet, wenn sie sich von dem zuvor geschriebenem unterscheiden.
Mein Problem ist jedoch, dass sich einige der angezeigten Werte sehr stark ändern können, z.B. in einer Sekunde evtl. 10 mal.... und das wird dann dem Display offensichtlich zu viel.
Die Signalbahnen zum Display sind auf +/-5mm gleich lang, Gesamtlänge ca. 5cm Leiterbahn und 20cm Flex. Kabel, ich verwende keinen i2c-Bus, also normale Ansteuerung mit 4 DB. An den Abblockkondensatoren dürfte es auch nicht liegen, da sind genügend verbaut.
Ich werde jetzt das Programm etwas abändern damit das Display nur noch zyklisch (evtl. 1x je sec) aktualisiert wird, und dann auch nur die Werte die sich wieder geändert haben und hoffe das das Problem dann beseitigt ist.
Meine Frage daher: gibt es Erfahrungswerte wie oft man ein Display aktualisieren kann/soll??
Die Reaktionszeit des LCDs liegt im unteren ms Bereich. Siehe Datenblatt. Da steht die Ausführungszeit für jedes Kommando dabei.
Praktisch kann man das schon alle paar 100ms machen damit es etwas flüssiger geht. Auch alle paar Dutzend ms sind möglich, aber die Displays sind so träge dass man das dann schlecht lesen kann.
Deine Störungen können eventuell durch den Motor kommen.
Wo sitzen die Abblockkondensatoren? Wenn die am µController sitzen, dann kann am Display immernoch die Spannung einbrechen, da dort ebenfalls ein Controller-IC verbaut ist. Also Spendiere dem Display selbst auch noch 100nF KerKo und 10-47µF Elko.
Bei 20 cm Kabel können schon Störungen über den Datebus auftreten. Versuche mal das Flexkabel abzuschirmen. Von einem dickeren Kabel 20-30 cm Metallgewebe zusammenschieben und runter und aus das andere Kabel drauf und wieder straffziehen. Den Schirm dann einseitig an Masse legen. Oder ein Schück Netzwerkkabel kannst du auch versuchen.
Kondensatoren sind direkt an der CPU und natürlich auch direkt am LCD Display, der Motor ist von der Anzeige und CPU 2m entfernt, die Relais die den Motor steuern sind von CPU und LCD-Kabel 20cm entfernt.
Relais werden via ULN2003 gesteuert..
StefanB79:
Meine Frage daher: gibt es Erfahrungswerte wie oft man ein Display aktualisieren kann/soll??
Text-Displays mit HD44780 Controller kannst Du so oft aktualisieren wie es Dir Spass macht. Entweder die in der Library hartcodierten Timings auf den Steuerleitungen stimmen, oder nicht.
Wenn hier im Forum jemand Probleme hat, dann sind die am ehesten seiner Hardware geschuldet:
Zu lange Leitungen zum Display, EMV-Störungen durch den Betrieb nicht-funkentstörter Motoren (Stichwort "Bürstenfeuer") und die Vernachlässigung sämtlicher EMV-Schutzmaßnahmen, selbst die simpelsten. Oft gesehen beispielsweise: Schalten "induktiver Lasten" (Motoren, Leuchtstofföhren-Vorschaltgeräte, Magnetspulen aller Art, z.B. Magnetventile) ohne die geringsten Entstörmaßnahmen mittels mechanischer Relais. Von den Funkstörungen, die da ausgehen, dürfte oft nicht nur das vom Arduino-Bastler zusammengeklatschte Gerät selbst etwas haben ("Fehlfunktion"), sondern auch noch die Nachbarschafft (z.B. Knackser und Prasseln beim Hören von UKW-Sendern mit der Stereoanlage, kurzfristige Bildartefakte beim Empfang von DVB-T Fernsehsendern etc.).
StefanB79:
.. der Motor ist entstört, ist Original schon so verbaut,
an den verbauten Magnetventilen sind entsprechende Freilaufdioden vorhanden,
StefanB79:
.. der Motor ist entstört, ist Original schon so verbaut,
an den verbauten Magnetventilen sind entsprechende Freilaufdioden vorhanden,
Neben Störungen, die durch die Hardware bedingt sind, werden von Usern hier im Forum natürlich auch merkwürdige Programme zusammengeschrieben und verwendet, die im laufenden Betrieb versagen.
Zum Beispiel durch RAM-Speichermangel. Häufige Ursache dabei die exzessive Verwendung von dynamisch erzeugten "String"-Objekten, die ständigen Längenänerungen unterzogen werden. Kennzeichen im Quellcode: Die Verwendung des Schlüsselworts "String" als Klassenbezeichnung
Andere Möglichkeiten: Integer-Überläufe: Also dass bereichsmäßig begrenzte Variablen überlaufen, z.B. "int" unbeabsichtigterweise in den negativen Bereich. Andere Möglichkeiten: Buffer-Overflows durch Arry-Zugriffe außerhalb des deklarierten Bereits.
Oder dubioses Handling von selbstgeschriebenen Interrupt-Handlern, bei denen nach "attachInterrrupt()" alles falsch gemacht wird.
hier die CPU:
K9 geht zum LCD Display, K8 zu einem Encoder
Layout:
aus den dünnen Leiterbahnen werden später Masseflächen
Frontseite:
Code wird nachgereicht, muss ich auf einem anderen PC machen.
Die "Abstürze" kommen auch wenn die Relais und der Motor nicht angesteuert werden, also nur die div. Drehzahlen im Display aktualisiert werden. Die CPU arbeitet jedoch weiter und regelt auch wenn ich die Drehzahl manuell verändere (Ventil verstellen von Hand, dann wird sofort nachgeregelt. Die Magnetventile werden aktuell überhaupt nicht angesteuert.
Am Motor (Strom ca. 80mA) sind 3 Entstörkondensatoren angebracht.
Am LCD selbst sind nochmal 100µF und 100nF angebracht.
Array und Strings sind nicht im Programm, Überläufe zu 99% ausgeschlossen, Alle Werte bewegen sich zwischen 0 bis 5000.
StefanB79:
Mein Problem ist jedoch, dass sich einige der angezeigten Werte sehr stark ändern können, z.B. in einer Sekunde evtl. 10 mal.... und das wird dann dem Display offensichtlich zu viel.
Bei der Trägheit der LCDs wäre eine 7-Segment-Anzeige eine Alternative. Drehzahlwerte können nicht verschwimmen.
Ich habe einen Timer mit 1/10sec. Auflösung programmiert, Bei LCD verschmiert die letzte Stelle komplett, bei LEd ist sie durchaus zu erkennen und kann auch zum manuellen Stop zu einem Zeitpunkt sehr genau genutzt werden. So werde ich wohl für die Endversion 20x4LCD für Einstellungen und Menü nutzen und eine 7-segment-Anzeige für den Zeitablauf.
Ein paar Feinheiten, die sich allerdings summieren können, sind mir aufgefallen:
bei den Eingangselkos am Spannungsregler hast du die Leiterbahnen T-förmig geführt (Stich zum Elko)
sowas ist prinzipiell ungünstig. Wenn du V-förmig zum Kondensator die Leiterzüge legst, fließen die Störungen gewissermaßen nicht am Kondensator vorbei, sondern müssen "drüber". Das nutzt den geringen Innenwiderstand des Kondensators (ESR) besser aus. Gilt sinngemäß auch für KerKos.
Der ULN ist ja von Elektronikseite aus dein Leistungsschalter. Wo ist dessen KerKo und Stützelko? Der wird zwar selbst nicht gestört, aber Störungen durch das Schalten der Relais können sich so über die gesamte Stromversorgung ausbreiten. Breite Leiterzüge und so dicht als möglich am IC erst einen KerKo und am nächstmöglichen Platz ein Elko.
Ein gemeinsames Netzteil für Relais und hinter den Relais sitzenden Leistungsverbrauchern ist prinzipiell möglich, erfordert aber eben auch saubereres Arbeiten, als getrennte Stromversorgungen.