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
Mann muss sich den aktuellen Zustand merken und zur Auswertung mit Nutzen. Kann man in eine sehr kleine statemachine packen.
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?
1 | /* Temperatur einlesen */
|
2 | temp = ...; |
3 | |
4 | if(temp >= 30.0 && temp < 35.0) |
5 | {
|
6 | luefter = 33; |
7 | }
|
8 | else if(temp < 29.5 && temp >= 20.0) |
9 | {
|
10 | luefter = 20; |
11 | }
|
12 | |
13 | /* Lüftersteuerung */
|
14 | ...
|
Im Prinzip ganz simpel. Kannst entweder deine Tabellenwerte eintragen, wenn sie Fix sind oder über eine FOR Schleife jedes Wertepaar durchlaufen.
@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.
Falk Brunner schrieb im Beitrag #3211319:
> Etwa so
irgendetwas stimmt da nicht
fan_index++;
es gibt kein fan_index--?
Mist, Copy & Paste Fehler. Hier nochmal. Mods, bitte mal den Beitrag löschen. [Mod: ERLEDIGT]
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_t comp( uint8_t val ) |
7 | {
|
8 | static uint8_t state = 0; |
9 | |
10 | switch( val ){ |
11 | case 0 ... THRESHOLD - HYSTERESIS - 1: |
12 | state = 0; |
13 | break; |
14 | case THRESHOLD - HYSTERESIS ... THRESHOLD + HYSTERESIS: |
15 | break; |
16 | default:
|
17 | state = 1; |
18 | }
|
19 | return state; |
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!
1 | // falsch
|
2 | (fan_index <(TABLE_SIZE-2) |
3 | |
4 | // richtig
|
5 | (fan_index <(TABLE_SIZE-1) |
Ohne die Abfrage würde das nie in die Einstellungen für den Bereich von 20 bis 25°C übernehmen.
1 | if ((fan_index <(TABLE_SIZE-1)) && temperature >=kennlinie[fan_index][1]) { // zu warm, hochchalten |
2 | fan_index++; |
3 | set_fan(kennlinie[fan_index][0]); |
Ändere man die Reihenfolge
1 | if ((fan_index <(TABLE_SIZE-1)) && temperature >=kennlinie[fan_index][1]) { // zu warm, hochchalten |
2 | set_fan(kennlinie[fan_index][0]); |
3 | fan_index++; |
werden die Obersten Einstellungen nicht Übernommen.
@ 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.
Ok Falk hast rech. Ich hab den zweiten durchlauf ausgelassen daher der Fehler.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.