Hallo,
vor rund 14 Jahren habe ich u.a. mit Hilfe dieses Forums eine AVR µC
Steuerung für die Warmwasseranlage incl. Sonnenkollektoren bei meinen
Eltern realisiert. Es werden Temperaturen von 4 PT1000 Fühlern
ausgelesen und abhängig von Prioritäten, die mit einem Schiebeschalter
gewählt werden können, 3 Umwälzpumpen gesteuert. Das Ganze läuft seither
recht zuverlässig aber ganz selten (1x pro Jahr) kann es vorkommen, dass
die Anlage in einen undefinierten Zustand verfällt und bis zu einem
manuellen Reset nicht mehr funktioniert. Das ist deshalb unangenehm,
weil bei starker Sonneneinstrahlung die Wärme nicht mehr abtransportiert
wird und die Flüssigkeit im Sonnenkolletor-Kreislauf teilweise verdampft
und nur durch Entlüften der Anlage wieder der Normalzustand hergestellt
werden kann. Eine Beschädigung der Anlage bei längerem Ausfall ist nicht
auszuschliessen. Vor einigen Wochen kam dieser Zustand mehrmals
hintereinander vor. Evtl hat ein Relais nicht mehr korrekt geschaltet.
Da der Störfall normalerweise sehr selten eintritt und ich nicht vor Ort
bin fällt es mir schwer festzustellen wo es genau hapert. Nach
Installation der Schaltung vor 14 Jahren kam es bereits manchmal zu
Hängern. Diese konnte ich nachträglich durch die interne Watchdog
Schaltung des AVR abfangen. Die Anzahl der Resets werden im EEPROM
gespeichert und können am LCD angezeigt werden. Es gibt lange Perioden
in denen gar keine Resets vorkommen und dann können plötzlich mehrere
Resets an wenigen Tagen eintreten. Zusätzlich kommt die Anlage sehr
selten in den genannten Zustand in dem die interne Watchdog Schaltung
nicht mehr funktioniert. Die erste Zeile des LCD wird schwarz, alle
Pumpen stehen still und der µC reagiert nur noch auf manuellen Reset.
Hier wäre eine externe Watchdog Schaltung natürlich besser gewesen, aber
das wurde mir erst später klar.
Meine Vermutung ist, dass die Schaltvorgänge der Relais diese Zustände
hervorrufen. Wenn ich mit dem Schiebeschalter wild die Pumpen manuell an
und aus schalte (Der Schiebeschalter legt den Transistor der das Relais
ansteuert entweder an den µC-Ausgang, an GND oder an 5V) kommt es öfters
zu Resets. Mit einem Uralt-Röhren-Oszi habe ich die 5V Versorgung
angeschaut und gewisse Spannungsspitzen beim Umschalten entdeckt. Ich
bin mir aber nicht ganz sicher ob es sich nicht auch um parasitäre
Messfehler handeln kann. An einem 5V Steckernetzteil das Testweise am
selben Netz angeschlossen wurde habe ich DC-seitig ähnliche Ausschläge
gesehen. Was zusätzlich für die Relais als Störquelle spricht ist, dass
Ausfälle meist an sonnigen Tagen vorkamen and denen vermutlich mehr
Schaltvorgänge vorkommen.
Zum Aufbau:
Die Anlage besteht aus drei Platinen die mit Flachbandkabeln miteinander
verbunden sind.
1. Netzspannungsplatine mit Spannungsversorgung und Pumpenrelais
Ein 9V Trafo mit Gleichrichter und 4700µF Elko erzeugt ca 12-13V. Aus
diesen wird mit 7809 die OP Spannung erzeugt und davon mit 7805 die
restliche Logik versorgt. Die Spulen der Relais werden direkt mit den
12V versorgt um die Festspannungsregler nicht unnötig zu belasten.
2. Logikplatine mit AT90S8535 und Temperaturmessung
Die 9V und 5V werden auf der Logikplatine mit Elko nochmals gepuffert.
Vermutlich 47µF. Die Beschaltung des AVR ist nach Datenblatt mit
externem Oszillator. Die Folienkondensatoren sind nahe an den Pins.
Der PT1000 wird über eine H-Brücke und OP-Komparator ausgelesen. Der
Temperaturbereich von -20°C bis 100°C wird recht linear auf 0-5V
abgebildet. Dieses Analogsignal wird direkt am ADC des µC angelegt. Die
BAT schützt den ADC vor Überspannung.
3. I/O Frontplatine mit 16x2 LCD, status LEDs und Schiebeschalter für
Prioritätswahl und Wahl zwischen manueller und automatischer
Pumpensteuerung
Nun Endlich zu den Fragen:
- Was kann eurer Meinung nach solche Aussetzer verursachen?
- Sieht jemand Schwachpunkte, die die Schaltung störungsanfällig machen?
- Würde es evtl helfen den µC noch mit schnellen KerKos zu puffern um
Spitzen besser abzufangen?
Als externe Sicherheitsschaltung werde ich mit einem Komparator einen
Schmitt Trigger realisieren der über ein extra Relais die Kollektorpumpe
bei Übertemperatur (>4.5V Analogsignal) aktiviert und bei 3V wieder
deaktiviert, unabhängig davon was der µC macht. Ein Ausfall der
Spannungsversorgung wird damit leider nicht abgedeckt weil ich den
Schmitt Trigger mit den 5V versorgen werde und das Auslesen der
Temperatur nur mit dem bestehenden Fühler möglich ist. Ein Überhitzen
bei Ausfall des µC wird dadurch jedoch vermieden. Evtl könnte diese
Schaltung auch gleich einen hard-reset des µC ausführen.
Axel Schindler schrieb:> Werde ich kommendes Wochenende mal testen
Dann bring am Besten auch ein paar Fotos mit, vielleicht kann jemand
damit etwas anfangen...
Ansonsten hier mein Vorschlag für einen externen Winz-Watchdog: Ein
CD4060 mit Uhrenquarz, der in der Hauptschleife (nicht per ISR!) vom
Mega am Resetpin zurückgesetzt wird. Einer der höherwertigen Ausgänge
zieht dann über einen Open Collector Transistor die Reset Leitung des
Mega auf low.
Reset des LCD (sofern vorhanden) würde ich mit dem Reset des Mega
verbinden. Noch ein Tipp: in main() immer alle globalen Variablen
initialisieren, wenn du das nicht sowieso schon machst.
> Pumpen stehen still und der µC reagiert nur noch auf manuellen Reset.> Hier wäre eine externe Watchdog Schaltung natürlich besser gewesen, aber> das wurde mir erst später klar.
Wenn du damit recht haettest dann waere der AVR ein laecherlicher Witz
der sofort in den Muelleimer gehoert. Ich erwarte von einem Watchdog das
er einen Controller immer resetten kann.
Ich wuerde vermuten das der Fehler in der Software liegt. Vermutlich
gibt es einen Fehlerzustand der nicht erkannt wird und bei dem der
Watchdog immer noch zurueckgesetzt wird.
Olaf
olaf schrieb:> Ich erwarte von einem Watchdog das> er einen Controller immer resetten kann.
Es gibt Leute, die meinen, dass er immer in einem Timer-IRQ
zurückgesetzt werden muss, damit das auch sicher passiert ...
Gruß
Jobst
Die ATmega sind robuster, als die alten AT90Sxxxx.
Es könnte daher was bringen, ihn durch den ATmega8535 zu ersetzen.
Oder ATmega16, dann mußt Du aber das Programm neu compilieren.
Axel Schindler schrieb:> Das ist deshalb unangenehm, weil bei starker Sonneneinstrahlung die> Wärme nicht mehr abtransportiert wird und die Flüssigkeit im> Sonnenkolletor-Kreislauf teilweise verdampft und nur durch Entlüften> der Anlage wieder der Normalzustand hergestellt werden kann.
Das wird wohl kein Dampf sein. Der müsste bei Abkühlung von selbst
wieder in den flüssigen Aggregatzustand übergehen. Wahrscheinlich ist
Luft in deinem Transportmedium gelöst.
Hat zwar nichts mit der Problemlösung zu tun: ich würde eventuell eine
"Fall Back"Hardware Schaltung implementieren. Als z.B. bei kritischer
Temperatur (Überwachung durch Komparator) eine der Umwälzpumpen
aktivieren.
Zum Problem: es scheinen ja die Schaltvorgänge (Relais) zu sein, die das
Problem auslösen. Also würde ich als erstes dort ansetzen:
1.) Snubber an jedes Relais
2.) Alle IOs die an lange Leitungen hängen mit Seriewiderstand und evt
Dioden schützen
Hallo!
Ich würde auch mal gern meinen Senf dazugeben:
Tippen würde ich mal auf ein Software-Problem. Ich halte es für möglich,
dass es Zustände gibt, mit der die Software nicht umgehen kann.
Diese Zustände treten anscheinend selten auf, oder eben in letzter Zeit
auch öfter.
Wenn die Häufigkeit des Fehlers mit der Häufigkeit des Schaltens steigt,
sind es vielleicht die elektromagnetischen Wellen, die durch das
Einschalten, bzw. Ausschalten entstehen.
Möglicherweise ist der Kontakt in den Relais in die Jahre gekommen und
durch den schlechten Kontakt wurden die EM-Wellen heftiger.
Die EM-Wellen könnten dann an den Eingängen Spannungen hervorrufen, die
das Programm nicht richtig auswertet.
Z.B. könnte in eine While-Schleife eingestiegen werden, wo der Ausstieg
falsch implementiert ist oder so.
Kritisch sind oft Werte im Endbereich, z.B. 255 oder == Vergleiche (Z.B.
steigt die while-Schleife aus, wenn der Wert einer Variable, die
hochgezählt wird, genau 250 ist. Wenn die nun aus irgendeinem Grund
doppelt hochgezählt wurde und schon 251 ist, steigt die nicht aus.
Besser wäre da dann >250 statt ==250)
Oder es wird eine Feldvariable falsch indiziert, z.B. var[10], obwohl
der Index nur bis 9 gehen dürfte -> z.B. in for Schleifen.
Stell mal dein Programm online, das wäre wesentlich.
Unabhängig davon würde ich:
a) die Relais möglichst weit weg vom Rest der Schaltung geben, am besten
in ein extra Gehäuse
b) Energie- und Signalleitungen möglichst weit weg voneinander führen
c) Geschirmte Leitungen für die Signale (bzw. alles was Eingang ist)
verwenden (gerne auch Ethernet, die sind wirklich gut gegen HF
geschützt)
d) mit den Schaltern nicht die Transistoren schalten, sondern die Relais
direkt
e) Nicht die internen Pullups verwenden, sondern externe,
niederohmigere, z.B. 10k
All diese Punkte machen dein System robuster gegen solche sporadischen
Störungen.