Forum: Mikrocontroller und Digitale Elektronik Absturz bzw. Einfrieren eines Arduino Unos bei einer Klimakammer


von Mono211 (Gast)


Angehängte Dateien:

Lesenswert?

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 :)!

von H.Joachim S. (crazyhorse)


Lesenswert?

Brownout aktiviert?

Beitrag #6252880 wurde vom Autor gelöscht.
von Mono211 (Gast)


Lesenswert?

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?

von Sam W. (sam_w)


Lesenswert?

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.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Sind die Relais und Aktuatoren alle mit Freilaufdioden o.ä. entstört?

von grundschüler (Gast)


Lesenswert?

tippe auf Fehler im Programm der einen Registerüberlauf verursacht.

von Mono211 (Gast)


Lesenswert?

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!

von Wolfgang (Gast)


Lesenswert?

Mono211 schrieb:
> Da alle meine Timer als long Variable und die restlichen Werte als
> Double definiert sind

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/

von Antuino (Gast)


Lesenswert?

Wickel ihm halt einen Schal um!
Dann friert er nicht so.

von oszi40 (Gast)


Lesenswert?

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?

von Mike J. (linuxmint_user)


Lesenswert?

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.

von Christian B. (christian_b5)


Lesenswert?

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.

von Anselm (Gast)


Lesenswert?

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.

von Peter R. (Gast)


Lesenswert?

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

von Mono211 (Gast)


Lesenswert?

> 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 :)!

von Gerhard O. (gerhard_)


Lesenswert?

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.

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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 ".

von Patrick (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

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
Noch kein Account? Hier anmelden.