Forum: Mikrocontroller und Digitale Elektronik schmitt trigger verhalten c/c++


von Alex (Gast)


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

von Falk B. (falk)


Lesenswert?

Mann muss sich den aktuellen Zustand merken und zur Auswertung mit 
Nutzen. Kann man in eine sehr kleine  statemachine packen.

von Peter II (Gast)


Lesenswert?

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?

von Tarek T. (tarek_t)


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.

von Falk B. (falk)


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.

von Peter II (Gast)


Lesenswert?

Falk Brunner schrieb im Beitrag #3211319:
> Etwa so

irgendetwas stimmt da nicht

fan_index++;

es gibt kein fan_index--?

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

Mist, Copy & Paste Fehler. Hier nochmal.

Mods, bitte mal den Beitrag löschen.

[Mod: ERLEDIGT]

von Peter D. (peda)


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.

von Tarek T. (tarek_t)


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.

von Alex (Gast)


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.

von Falk B. (falk)


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?

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

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!

von Falk B. (falk)


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)

von Alex (Gast)


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.

von Falk B. (falk)


Angehängte Dateien:

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.

von mar IO (Gast)


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.

von Alex (Gast)


Lesenswert?

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