Archiv verlassen und diese Seite im Standarddesign anzeigen : Hysterese
guenter1604
01.09.2009, 16:01
Hallo Experten,
wie programmiert man eine hübsche Hysterese?
do
Hysterese:
loop
Hysterese von was für was?
Denke mir, allgemein, du verwendest für steigendes und fallendes X verschiedene Grenzwerte bzw. Faktoren für die y=f(x) Funktion.
Wenn wir mal davon ausgehen, dass du zB die Hysterese bei Schmitttriggern meinst (wir sind ja schließlich in einem Robotikforum) dann könnte das in Pseudocode so aussehen
if out==1 then
if in<min then out = 0;
endif
else
if in>max then out = 1;
endif
endif
sast
guenter1604
02.09.2009, 08:56
Entschuldigung, ich war ein bisschen Wortkarg...
Ein ADC mißt eine Spannung ADCSpannung. Mit einem Select-case wird diese ausgewertet. Es tritt jedoch an den Übergängen ein flattern auf, wenn die Spannung leicht um den Grenzwert UGrenze schwankt. Wie bei einem Schmitt-Trigger, wie sast schon erwähnt hat soll die Hysterese das verhindern
ADCSpannung = getadc(0)
select case ADCSpannung
case is < UGrenze
'tuwas
case UGrenze to UGrenze2
'tuwas anderes
usw.
Naja, ZWISCHEN den Grenzen passiert ja genau nix.
eigentlich:
select case ADCspannung
case is > LimitHi: OUT = 1
case is < LimitLow: OUT = 0
end select
guenter1604
02.09.2009, 11:43
Jetzt fällt der Groschen. Anstatt nur eines Grenzwertes definiere ich 2, die um die Hysterese auseinanderliegen. Dazu definiere ich noch eine Variable "OldValue", die mir die aufsteigende oder abfallende Flanke anzeigt.
Luftcode
select case ADCSpannung
case is < UGrenzeUnten
'tuwas
OldValue = unten
case UGrenzeUnten to UGrenzeOben
'ich bin die Hysterese
if OldValue = unten then
'tu das gleiche wie unten
else
'tu das gleiche wie oben
endif
case is > UGrenzeOben
'tuwas
OldValue = oben
end select
@Robert
ja so kurz gehts auch :)
Jetzt wird das Ganze etwas klarer. Du musst dir aber im klaren sein, dass du beim Festlegen einer scharfen Grenze (UGrenze) immer mit solchen Schwankungen zu kämpfen hast.
Entweder du weichst die Grenze auf und nutzt unseren Vorschlag zB mit UGrenze-X und UGrenze+X als min und max, oder du mittelst über mehrere Werte, oder machst einen "wenn geändert dann Vergleich" indem du den Wert mit Wert_old vergleichst und nur änderst wenn eine bestimmte Größenschwelle überschritten wird und dein Case arbeitet dann immer mit Wert_old.
Das ist im Grunde immer irgendwie das Selbe, nur an verschiedenen Stellen im Code realisiert.
sast
Edit:
mein Post kommt wie immer zu spät. Naja gut wenn du alleine in die richtige Richtung denkst.
Aber mal im Ernst, seit einigen Wochen ist das RN ziemlich häufig wegen "Überlastung" nicht richtig erreichbar, da macht das Antworten manchmal echt keinen Spass. Liegt das an den neuen Servern, oder ist das RN wirklich so stark frequentiert?
guenter1604
02.09.2009, 14:39
Hallo,
danke für die Mithilfe, das VORLÄUFIGE Ergebnis unter:
http://www.gerold-online.de/cms/wheelie/mein-wheelie/ladegeraet.html
Günter
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.