schmitt trigger verhalten c/c++

Gast #3211271
Lesenswert?

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
#3211297
Lesenswert?

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.
#3211324
Lesenswert?

@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.
#3211332
Lesenswert?

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.
#3211344
Lesenswert?

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.
Gast #3211425
Lesenswert?

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.
#3211441
Lesenswert?

@ 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?
#3212081
Lesenswert?

@ 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)
Gast #3214408
Lesenswert?

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.
#3214454
Lesenswert?

@ 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.
Angehängte Dateien:
Gast #3214492
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren