Guten Tag!
Ich habe aktuell das Problem, dass meine Regelung innerhalb einer
Konditionierungskammer (Temperatur und Luftfeuchtigkeit) auf Basis eines
Arduino Unos clones (Seeeduino V4.2) unvorhersehbar abstürzt bzw.
einfriert. Die In- und Outputpins frieren ebenso, wie das angeschlossene
LCD Bildschirmsegment ein. Ich habe im Anhang eine Skizze des Aufbaus
angehängt. Dieses Phänomen geschieht in unregelmäßigen Abständen. Mal
nach einem Tag, mal nach einer Woche.
Kurzbeschreibung des Systems: Eine isolierte Kammer soll durch ein
Heizbett (120W) und einen Terrariumsluftbefeuchter auf ein am LCD
Bildschirm eingestelltes Soll-Klima gebracht werden und durch
Aktivierung und Deaktivierung von Relais in diesem eingependelt werden.
Die Relais entsprechen diesen klassischen Relais Modulen mit
Octokopplern etc., die es zu Hauf beim großen A gibt. Betrieben wird das
ganze durch ein 150W Schaltnetzteil, dass den Arduino Uno, die Heizung
und über einen Step-Down-Wandler einen zweiten Arduino Nano und die
Relais versorgt. Der zweite Arduino kümmert sich lediglich darum, dass
bei einem Absturz des Unos die Heizung nicht ungeregelt agiert, in dem
es den Uno resettet und die Versorgungsspannung zum Heizbett durch ein
zusätzliches Relais trennt. Im Nachhinein wäre ein Watchdog
wahrscheinlich sinnvoller und ein adäquaterer Ersatz?
Sowohl das Schaltznetzteil, als auch der Luftbefeuchter hängen an der
selben 230V Quelle. Alle 2 Minuten schreibt der Arduino Uno die über
einen Sensor ermittelte Luftfeuchtigkeit und Temperatur auf eine SD
Karte.
Temperatur- &Feuchtigkeitssensor: DHT22
Sensoren: Thermistoren
Ungenutzte Pins des Unos sind auf Input, HIGH gesetzt.
Ich habe folgende Vermutung, die ich aber bislang noch nicht
reproduzieren konnte - ihr aber wahrscheinlich besser einschätzen könnt:
Kommt es zu einer Spannungsspitze im Stromnetz im Bereich der 230V
Quelle, so ist bei gleichzeitiger Aktivität der Heizung und der
Steuerung, dass schmal kalkulierte Netzteil an seiner Grenze und sorgt
somit für dieses Phänomen?
Ich hoffe ich konnte das Problem ausreichend beschreiben.
Vielen Dank! Ich hoffe ihr könnt mir helfen :)!
Soweit ich Brownout detection verstehe, wäre dies nur eine Möglichkeit
den Watchdog bzw. die Absicherung zu ersetzen. Ich würde aber gerne das
grundlegende Problem verstehen und dann lösen. Denn ich will es gar
nicht soweit kommen lassen, dass es zum Absturz kommt und so meine
Konditionierung verzögert.
Außerdem - ist die nicht von Haushaus bei Unos aktiviert?
Mono211 schrieb:> Außerdem - ist die nicht von Haushaus bei Unos aktiviert?
Kann, muss aber nicht. Oder ist etwas knapp eingestellt.
Das Problem könnte durchaus auch vom Aufbau kommen. Wie ist das Ganze
denn aufgebaut? Gerade mit Jumperkabeln etc. holt man sich schnell
Probleme aufgrund ungleicher Masse etc. ein. Ein Bild vom Aufbau wäre
gut.
Ein bisschen wundert mich, dass Bild und Beschreibung nicht
zusammenpassen. Steuert der Uno nur das Befeuchter-Relais oder auch das
Heizungsrelais I?
Ggfs. gibt es beim Einschalten der 12V Heizung Störungen auf der
12V-Versorgung, die deinen Arduino über seinen Spannungsregler aus dem
Tritt bringen. Hier hilft es mitunter, ein Filter mit einem größeren
Kondensator vorzusehen.
Der zusätzliche Nano sollte eigentlich nicht nötig sein. Optimalerweise
implementiert man ein Heartbeat-Signal, dass bei Ausfall eine möglichst
einfach Schaltung dazu bringt, die Heizung abzutrennen.
Im Prinzip reicht aber mitunter auch ein einfacher Bimetallschalter.
Sam W. schrieb:> Kann, muss aber nicht. Oder ist etwas knapp eingestellt.
Gut zu wissen danke :)! Das könnte aber das Abstützen an sich nicht
verursachen - würde lediglich als potentielle Absicherung dienen oder?
>Das Problem könnte durchaus auch vom Aufbau kommen. Wie ist das Ganze>denn aufgebaut? Gerade mit Jumperkabeln etc. holt man sich schnell>Probleme aufgrund ungleicher Masse etc. ein. Ein Bild vom Aufbau wäre>gut.
Ich komme leider aktuell nicht an den Aufbau um ein Foto zu machen.
Ungleiche Masse würde aber doch nur entstehen wenn unterschiedliche
Stromquellen miteinander agieren würden oder? Das dürfte eigentlich
nicht der Fall sein. Lediglich der Step-Down-Wandler hat über den Nano
Kontakt zum anderen System.
>Ein bisschen wundert mich, dass Bild und Beschreibung nicht>zusammenpassen. Steuert der Uno nur das Befeuchter-Relais oder auch das>Heizungsrelais I?
Oh mist. Entschuldigt. Da fehlt natürlich eine Linie: Also der Ablauf
vom Heizbett ist folgender: Die positive Leitung des Heizbettes ist an
dem Relais II angeschlossen, welches weiter mit dem Relais I verbunden
ist und dann weiter zum Netzteil verläuft. Der Nano dient lediglich als
Absicherung und somit ist das Relais II, sofern keine Temperatur über
dem Grenzwert, konstant geschlossen. Negativ geht direkt an Negativ des
Netzteils. Das Relais I wird vom Uno geschaltet und dient hier als
Regler. Keine PID, lediglich "bang-bang" da das System sehr träges ist.
>Ggfs. gibt es beim Einschalten der 12V Heizung Störungen auf der>12V-Versorgung, die deinen Arduino über seinen Spannungsregler aus dem>Tritt bringen. Hier hilft es mitunter, ein Filter mit einem größeren>Kondensator vorzusehen.
Du meinst also den 12V Eingang des Unos weiter zu filtern? Werde ich
recherchieren. Vielen Dank!
Der Bimetallschalter ist tatsächlich in Überlegung :).
>Sind die Relais und Aktuatoren alle mit Freilaufdioden o.ä. entstört?
Die Relais sind es. Also alles, was direkt am Uno angeschlossen ist.
>tippe auf Fehler im Programm der einen Registerüberlauf verursacht.
Da alle meine Timer als long Variable und die restlichen Werte als
Double definiert sind, sehe ich das aktuell nicht als Problem an.
Vielleicht irre ich mich natürlich auch. So etwas entsteht doch durch
unzureichend definierte Wertebereich? Selbst die Timer könnten in ms
nach einer Woche nicht den Bereich von 64 Bit sprengen?
Da keine Rückfragen oder Anmerkungen zum gering gewähltem Netzteil
kamen, gehe ich davon aus, dass ihr das ausschließt?
Danke soweit schonmal an alle!
Mono211 schrieb:> Da keine Rückfragen oder Anmerkungen zum gering gewähltem Netzteil> kamen, gehe ich davon aus, dass ihr das ausschließt?
-Stützkondensatoren?
-Falls das öfter vorkommt würde ich mal über ein paar Prüfpunkte
nachdenken. -Evtl. ein paar LEDs statt Relais leuchten lassen ob es da
auch passiert?
Mono211 schrieb:> Im Nachhinein wäre ein Watchdog> wahrscheinlich sinnvoller und ein adäquaterer Ersatz?
Wenn die Spannungsversorgung nicht einbricht und nur das Programm irgend
wo hängt, dass funktioniert das.
Wenn allerdings die Spannung zu dem Zeitpunkt mal kurz zu niedrig ist,
dann kann der Instruction-Pointer irgend wo hin springen wo er
eigentlich gar nichts zu suchen hat (und das dann auch reproduzierbar)
oder er bleibt einfach hängen.
Mit welcher Frequenz betreibst du deinen AVR?
Du könntest mal versuchen dem AVR einen GoldCap als Puffer zu verpassen.
Es reicht vielleicht auch einfach eine Diode zu nutzen um die 12V in
einen 1000µF Elko fließen zu lassen und von dort dann erst in den
Vin-Pin deines Arduino.
Vielleicht gibt es beim schalten der Relais (schalten der internen
Spulen) Störungen welche sich auf der Leitung fortpflanzen.
Wenn der "Befeuchter" eine Pump beinhaltet, dann können auch von dort
Störungen entstehen und deinen Controller stören.
Ich würde mal versuchen das MCUSR auszulesen.
Daran kann man ggf. bei aktivierter Brownout Detektion auslesen, wenn an
dem Controller die Spannung einbricht und dieser dann dadurch einen
Reset durchführt.
Mono211 schrieb:>>Sind die Relais und Aktuatoren alle mit Freilaufdioden o.ä. entstört?> Die Relais sind es. Also alles, was direkt am Uno angeschlossen ist.
Die Frage ist, sind die Freilaufdioden direkt am Relais oder hast du die
am µC-Board dran?
Sind sie nicht direkt am Relais, wird das den Fehler verursachen.
Gruß
Anselm
p.S.: Wenn es längere Leitungen dahin sind, würde ich ich sogar noch
einen 100nF an die Ausgänge setzen.
Verzeihung, aber zunächst eine giftige Kritik:
Wenn die Hardware ebenso chaotisch strukturiert ist wie die Skizze der
Schaltung, gibt es kaum eine Chance, die Ursache zu finden.
Mono211 schrieb:> ...Quelle, so ist bei gleichzeitiger Aktivität der Heizung und der> Steuerung, dass schmal kalkulierte Netzteil an seiner Grenze und sorgt> somit für dieses Phänomen?
Und? warum nimmst du nicht erstmal ein stärkeres Netzteil zur Probe oder
stützst du nicht das Netzteil mit einem dicken Elko?
Noch besser: Du nimmst ein getrenntes Netzteil für den Steuerteil und
trennst die Stromkreise auf der Sekundärseite der Relais völlig von dem
Steuerteil mit den Relaisspulen und den Kontrollern.
Grundsatz: Man sollte den Leistungsteil und den Steuerteil klar trennen.
Sonst fängt man sich ekligen Mist an Streusignalen ein und kann auch
nicht systematisch auf die Fehlersuche gehen. Wenn man schon Relais
benutzt, dürfte das gut zu machen sein
Lass auch mal den Zusatzteil mit dem Nano weg, ob dort die
Absturzursache liegt
> Das macht nichts. Double auf dem Arduino Uno ist kein double, sondern> nur ein IEEE754 Single Precision (binary32), m.a.W. der Typ hat trotzdem> nur vier Byte.> https://www.arduino.cc/reference/en/language/variables/data-types/double/
Man lernt wirklich nie aus. Vielen Dank :)!
> -Stützkondensatoren?
Nur die im Schaltnetzteil direkt.
> Wenn allerdings die Spannung zu dem Zeitpunkt mal kurz zu niedrig ist,> dann kann der Instruction-Pointer irgend wo hin springen wo er> eigentlich gar nichts zu suchen hat (und das dann auch reproduzierbar)> oder er bleibt einfach hängen.
Also am besten beides. Notiert :)!
> Mit welcher Frequenz betreibst du deinen AVR?
Beim letzten Compiler waren Standart 16mHz eingestellt.
>Wenn der "Befeuchter" eine Pump beinhaltet, dann können auch von dort>Störungen entstehen und deinen Controller stören.
Das Verdampfen des Befeuchters funktioniert über das Ansaugen und
Zerstäuben einer Piezokeramik, dessen Regelkreislauf aber lediglich
durch die "Enable"-Leitung mit dem Relais verbunden ist. Selbst die
Stromversorgung ist extern (war ein Zukaufsteil).
> Die Frage ist, sind die Freilaufdioden direkt am Relais oder hast> du die am µC-Board dran?> Sind sie nicht direkt am Relais, wird das den Fehler verursachen.
Diese sind direkt am Modul, zwischen den beiden Schalt-Anschlusspunkten
des Relais verbaut. Die Leitungen dort hin sind kürzer als 10cm.
> Verzeihung, aber zunächst eine giftige Kritik:> Wenn die Hardware ebenso chaotisch strukturiert ist wie die Skizze der> Schaltung, gibt es kaum eine Chance, die Ursache zu finden.
Ich akzeptiere die Kritik, weise aber darauf hin, dass nicht jeder
Zugang zum Fachwissen eines E-Technik-Studiums, einer Ausbildung oder
jahrelange Erfahrung in diesem Bereich hat und mir somit auch die
Kompetenzen bezüglich Software und Normgerechten Zeichnungen fehlen.
Das ist ja das schöne an solch einem Forum, dass so viele Kompetente
Menschen hier ehrenamtlich einem weiterhelfen!
>Und? warum nimmst du nicht erstmal ein stärkeres Netzteil zur Probe >oder>stützst du nicht das Netzteil mit einem dicken Elko?
Das wird der nächste Schritt sein. Nur ist bedingt durch die aktuelle
Lage ein Zugang zum Arbeitsplatz erschwert.
Vielen Dank nochmals an alle bisherigen Beteiligten!
Ich fasse kurz zusammen:
- Brownout überprüfen und MCUSR auslesen
- Watchdog für softwareseitige Bugs
o Durchsichten des Programmes auf potentielle Registerüberläufe
- Trennung des Regel- und Aktuationskreises
- Weitere Stützkondensatoren zwischen Netzteil und Regelarduino
- Zusätzliche Prüfpunkte (bspw. Austausch des Relais durch LEDs oder
ähnlich
- Ggf. Puffern des AVR durch ein Goldcap
Ich melde mich, wenn ich wieder zur Arbeit kann und das Problem weiter
analysieren und hoffentlich lösen konnte :)!
Ich entwickle industrielle uC basierte Steuergeräte schon seit über
zwanzig Jahren. Zum Gesagten ist wenig hinzuzufügen.
Bei digitalen Steuergeräten ist es unumgänglich notwendig jeden uC
IO-Pin der extern genutzt wird durch Tiefpassfilter, ESD Schutzmaßnahmen
und manchmal durch galvanische Isolation(Opto-Isolator) zu entkoppeln.
Natürlich muß auch darauf geachtet werden, daß die 5V Stromversorgung
über alle Zweifel erhaben ist. Also ausreichend Stützkondensatorwn
verwenden und Masseschleifen vermeiden.
Wichtige Regeln: kein ungeschützter IO-Pin darf die Leiterplatte jemals
verlassen oder externe Signale erhalten. Da gibt es absolut keine
Ausnahme!!!
Die Stromversorgung muß absolut sauber sein. Schaltregler Impulse am
Ausgang sollten 50mVpp nicht überschreiten (mit Oszi nachsehen)und surch
LC Filter und gute Selektion der Ableit-Cs gewährleistet sein.
Extern geführte Pins immer über sinnreiche Schutzkompenten verbinden(RC
Glieder, TVS Dioden, Opto-Isolator
Analog Eingänge am besten über RC Glieder und OPVs, Differenzverstärker,
Instrumentationsverstärker, etc. Nie ohne Filter nach aussen führen. Bei
RC Eingang darauf achten, daß bei Überspannung der zulässige interne
Ableitstrom nach Vdd/Vss nicht überschritten wird. Andrerseits darf der
Arbeitswiderstand am Eingang einen bestimmten Wert nicht überschreiten
um die Zeitkonstante des ADC Multiplexers nicht zu verletzen. Oft ist es
günstig ein Stütz-C am ADC Eingangspin anzuordnen.
Und, und, und...
Beim Arduino ist es nicht verkehrt den eingebauten Spannungsregler nur
für die Versorgung des uC zu begrenzen und externe Elektronik mit einem
eigenen Spannungsregler. Falls nur ein Spannungsregler ausreichender
Kapazität verwendet wird, dann sollte man sternförmige Verdrahtung
zwischen Arduino Vdd und den Test der Elektronik machen um
Masseschleifen zu vermeiden.
Es ist auch nicht falsch mindestens 100uF am Vcc Bus nahe beim Arduino
und Regler zu haben. Kurze Verbindungslängen sind zu erstreben. Nur muß
man sich vergewissern, daß der Brownout richtig konfiguriert ist und
funktioniert weil manche uC langsam ansteigende und abfallende
Versorgungsspannungen nicht mögen und im schlimmsten Fall zu Korruption
des EEPROMs führen können.
Es gibt also allerhand zu beachten und es würde für Dich nützlich sein
mit einem erfahrenen Kollegen der alles schon mitgemacht hat,
zusammenzuarbeiten. Wenn man nicht wirklich grobe Unterlassungsfehler
macht, sind solche Probleme alle lös- und beherrschbar.
Früher als Weller Magnastat Lötkolben noch gebräuchlich waren, konnte
man drastisch demonstrieren inwieweit die Schaltungen Umweltrobust
waren. Da gab es oft sehr starke induktive Störenergie beim Abschalten
des Heizkörpers durch den Magnastat Temperaturschalter. Wenn man das
Lötkolbenkabel in der Nähe des uC hatte, rragierte jener fast immer mit
Störverhalten oder einen RESET. Erst wenn man alles notwendige gemacht
hat, stoppte der Spuk. Solange Deine Schaltung auf externe Impulsenergie
starker Verbraucher reagiert ist Deine Arbeit noch nicht getan. So
gesehen ist die ehrwürdige Magnastat Lötstation immer noch eine
nützliche "Entwicklungshilfe". Das Schalten darf Deine Gesamtschaltung
in keiner Weise beeinflussen. Erst dann ist Deine Arbeit getan.
Wenn man eventuell dank Erfahrung dann später alles richtig macht,
funktionieren die meisten Anwendungen auf Anhieb. Bei industriellen
Anwendungen ist minimalistische Schaltungstechnik zu vermeiden. Ein
gewisser Aufwand ist fast immer unumgänglich notwendig. In dieser
Hinsicht ist auch ein Arduino absolut für gewisse Insustrieanwendungen
begrenzt geeignet.
Gerhard O. schrieb:> gewisser Aufwand ist fast immer unumgänglich notwendig. In dieser> Hinsicht ist auch ein Arduino absolut für gewisse Insustrieanwendungen> begrenzt geeignet.
Wir verwenden Nano in 2 verschiedenen Steuerungen gerade für
Industrieanwendungen.
Nano wird in diesen Steuerungen aber nur als M328 in DIP betrachtet,
netterweise mit USB und Resonator ausgestattet.
Das zugehörige SteuerBoard wird aber nach allen Regeln entstört und
die Stromversorgung ist, wie du sagst:" über alle Zweifel erhaben ".
Wie Peter R. schon feststellte: Entkopple möglichst die Versorgung der
Arduinos von der Lastversorgung. Wenn bei Schaltvorgängen die
Versorgungsspannung einbricht, kommt es zum Reset (brown out) - mit Pech
verbiegt es aber auch z.B. das Program counter Register und der Arduino
führt auf einmal "leeren Code" aus, was zu undef. Verhalten führt. Die
einfachste Lösung wurde von Peter auch beschrieben. Wenn du allerdings
mit 5V ankommst, könnte nach der Diode nicht mehr genug Spannung für den
Arduino übrig sein. Alternativ ein zweites 5 Volt Netzteil nutzen, die
Massen der Netzteile verbinden und das neue Netzeil ausschliesslich zur
Lastversorgung nutzen.
Ich persölich arbeite gerade bei Einsatz von Relais gerne mit 12 Volt
und einem 7805 für die 5-Volt-Versorgung - so hat man bereits für eine
Entkopplung gesorgt.
Mono211 schrieb:> - Brownout überprüfen und MCUSR auslesen> - Watchdog für softwareseitige Bugs
Für die Fehlersuche muß man den Watchdog immer ausschalten, sonst können
Fehler verschleiert werden.
Ist im MCUSR kein Bit gesetzt, bedeutet das, der PC ist ohne Reset in
den Resetvektor gelaufen, d.h. ein SW-Fehler liegt vor.