Hi Leute,
irgendwie steh ich total auf dem Schlauch. :(
Ich versuche für meine Temperaturregelung ein Schmitt Trigger zu
schreiben.
Hab eine dazu eine lock up Tabelle.
Temp … 25 30 35 …
Lüfter Geschw. In % … 20 33 42 … usw.
Bsp.
Wird die Temp >= 30°C < 35°C soll Lüfter mit 33% drehen
Fällt die Temp auf 29,5 soll der Lüfter immer noch mit 33% drehen
Fällt die Temp 20 <= Temp < 29,5 soll er wieder mit 20% drehen.
Dies Funktion krieg ich einfach nicht hin -.- und im Netz hab ich keine
Beispiele in c/c++ gefunden.
Eventuell habt ihr ein Link oder selber einen geschrieben und hab den
Code zur Hand.
Gruß
Alex
Alex schrieb:> Dies Funktion krieg ich einfach nicht hin -.- und im Netz hab ich keine> Beispiele in c/c++ gefunden.
für was braucht man dafür ein beispiel?
Was hast du bis jetzt geschrieben?
@Tarek T. (tarek_t)
>Im Prinzip ganz simpel.
Nicht ganz.
>Kannst entweder deine Tabellenwerte eintragen, wenn sie Fix sind oder>über eine FOR Schleife jedes Wertepaar durchlaufen.
Deine Lösung erreicht nicht, was der OP will, nämlich Hysterese. Siehe
Schmitt-Trigger. Wenn bei dir die Temperatur genau auf einer
Schaltschwelle wackelt, wird dauern der Lüfter hoch- und runter
geschaltet, das nervt und verschleißt den Lüfter. Mit Hysterese
vermeidet man das. Dafür braucht es aber einen anderen Ablauf.
Für einen Schmitt-Trigger brauchst Du einen Merker, um die Hysterese zu
realisieren. Sonst weiß ja die Statemaschine nicht, was sie zwischen den
beiden Schwellen machen soll.
1
#include<stdint.h>
2
3
#define THRESHOLD 123
4
#define HYSTERESIS 10
5
6
uint8_tcomp(uint8_tval)
7
{
8
staticuint8_tstate=0;
9
10
switch(val){
11
case0...THRESHOLD-HYSTERESIS-1:
12
state=0;
13
break;
14
caseTHRESHOLD-HYSTERESIS...THRESHOLD+HYSTERESIS:
15
break;
16
default:
17
state=1;
18
}
19
returnstate;
20
}
Das läßt sich auch leicht auf mehrere Schwellen erweitern.
Falk Brunner schrieb:> Deine Lösung erreicht nicht, was der OP will, nämlich Hysterese. Siehe> Schmitt-Trigger. Wenn bei dir die Temperatur genau auf einer> Schaltschwelle wackelt, wird dauern der Lüfter hoch- und runter> geschaltet, das nervt und verschleißt den Lüfter. Mit Hysterese> vermeidet man das. Dafür braucht es aber einen anderen Ablauf.
Das tut mein obiges Beispiel ja. Ist die Temperatur erst einmal auf
größer/gleich 30° gestiegen, schaltet der Lüfter auf 33%.
Erst wenn sie wieder kleiner als 29,5° ist, schaltet der Lüfter zurück
auf 20%. Das war doch im Beispiel vom OP so angegeben oder nicht?
Ok, ich sehe, dass der OP statt 29,5° wohl eher 25° meinte. Egal, aber
im Prinzip meinte ich das so, wie Du es in deinem Code gepostet hast. Du
brauchst pro Motorleistung eine TOP & BOTTOM Schaltschwelle.
Danke euch allen für die Hilfe
Werd mir eure codes jetzt anschauen.
Ich meine die Schaltschwelle von 29,5°C sollte aber nur ein Bsp. sein.
Wahrscheinlich werd ich die Schaltschwelle auf 1 - 1.5°C setzen.
@ Tarek T. (tarek_t)
>> Deine Lösung erreicht nicht, was der OP will, nämlich Hysterese. Siehe>> Schmitt-Trigger. Wenn bei dir die Temperatur genau auf einer>> Schaltschwelle wackelt, wird dauern der Lüfter hoch- und runter>> geschaltet, das nervt und verschleißt den Lüfter. Mit Hysterese>> vermeidet man das. Dafür braucht es aber einen anderen Ablauf.>Das tut mein obiges Beispiel ja.
Nein, das tut sie nicht, weil der aktuelle Zustand nicht berücksichtigt
wird. Deine Skizze des Algorithmus kann nur einfache,
hintereinanderliegende Werte in einen Lüftersteuerwert umrechnen,
praktisch ist das wie eine Tabelle, nur schlechter mit mehr
Schreibaufwand ;-)
>auf 20%. Das war doch im Beispiel vom OP so angegeben oder nicht?
Nein, es fehlt die Hysterese. Und dafür braucht man zwei Kennlinien,
eine für hoch und eine für runter.
>Ok, ich sehe, dass der OP statt 29,5° wohl eher 25° meinte.
Zahlen sind Schall und Rauch.
>Egal, aber>im Prinzip meinte ich das so, wie Du es in deinem Code gepostet hast.
Was du MEINST ist was vollkommen anderes als was du GESCHRIEBEN hast.
>Du brauchst pro Motorleistung eine TOP & BOTTOM Schaltschwelle.
Wo ist das in deinem Codefragment ersichtlich?
So habs jetzt.
Habe das Bsp. von Falk Brunner genommen.
Es hat einen kleinen Bug in den Bedingungen. Das letzte Feld/Einstellung
würde nicht erreicht werden.
Habs angepasst und jetzt tuts.
Danke euch allen!
@ Alex (Gast)
>Es hat einen kleinen Bug in den Bedingungen. Das letzte Feld/Einstellung>würde nicht erreicht werden.
Stimmt.
>Habs angepasst und jetzt tuts.
Warum so aufwändig? Es hätte gereicht, EINE Zahl zu ändern!
@ Alex (Gast)
>Ohne die Abfrage würde das nie in die Einstellungen für den Bereich von>20 bis 25°C übernehmen.
Aber sicher, wenn du den originalen Code eben MINIMAL korrigierst und
nicht deine Verschlimmbesserung.
Siehe Anhang, kann man wunderbar im AVR-Studio simulieren. Und es
funktioniert wie gewünscht. Ohne abstruse Konstruktionen, sauber lesbar.
Falk Brunner schrieb:> @ Tarek T. (tarek_t)>>>> Deine Lösung erreicht nicht, was der OP will, nämlich Hysterese. Siehe>>> Schmitt-Trigger. Wenn bei dir die Temperatur genau auf einer>>> Schaltschwelle wackelt, wird dauern der Lüfter hoch- und runter>>> geschaltet, das nervt und verschleißt den Lüfter. Mit Hysterese>>> vermeidet man das. Dafür braucht es aber einen anderen Ablauf.>>>Das tut mein obiges Beispiel ja.>> Nein, das tut sie nicht, weil der aktuelle Zustand nicht berücksichtigt> wird. Deine Skizze des Algorithmus kann nur einfache,> hintereinanderliegende Werte in einen Lüftersteuerwert umrechnen,> praktisch ist das wie eine Tabelle, nur schlechter mit mehr> Schreibaufwand ;-)
Eigentlich tut das schon wie beschrieben, falls luefter als static
definiert wurde.