Forum: Mikrocontroller und Digitale Elektronik Arduino Hysterese für Kondensator Auf- und Entladung


von Pedro E. (p2m)


Lesenswert?

Hallo,

ich habe eine Lade und Entladeschaltung für Kondensatoren aufgebaut und 
beschäftige mich gerade mit der Programmierung. Mit der Schaltung kann 
ich die Spannung am Kondensator messen, den Innenwiderstand messen und 
den Kondensator auf und entladen. Aktuell habe ich das Problem, dass 
wenn ich den Kondensator auf die gewünschte Spannung 
(selectedCapVoltage) auf-, oder entladen möchte, der Spannungswert kurz 
vor Ende hin und her zappelt. Das heißt wenn ich zum Beispiel auf 2 Volt 
laden möchte, das Display zwischen 1,9 und 2,0 Volt hin und her zappelt, 
so schnell, dass ich es nicht richtig sehen kann. Ich denken ich brauche 
eine Art Hysteresecode, damit der Transistor beim Erreichen der Auf-, 
oder Entladespannung schaltet.
Vorab Danke für nützliche Tipps.

Hier ist mein aktueller Code bzw. Die entsprechende Funktion:


void chargeModeHandler()
{
  float hysteresis = 0.005;

  if ((capVoltage + hysteresis) == selectedCapVoltage || (capVoltage - 
hysteresis) == selectedCapVoltage )
  {
    holdCapvoltage();
  }

  else if (capVoltage < selectedCapVoltage)
  {
    chargeCapvoltage();
  }
  else if (capVoltage > selectedCapVoltage)
  {
    dischargeCapvoltage();
  }
}

von Peter D. (peda)


Lesenswert?

Peter M. schrieb:
> if ((capVoltage + hysteresis) == selectedCapVoltage || (capVoltage -
> hysteresis) == selectedCapVoltage )

Floats sind nie exakt gleich.

Für alles andere braucht man den Schaltplan.

von Sebastian S. (amateur)


Lesenswert?

Das Gleichheitszeichen sollte in Verbindung mit Fließkommazahlen 
verboten werden.
Größer: Ja
Kleiner: Ja
Gleich: Selbst dran schuld

>float hysteresis = 0.005
Auf dem Papier: Ja
aber sind Deine A/D-Wandler überhaupt so genau?

von Stefan F. (Gast)


Lesenswert?

Ich würde einfach die Anzeige auf dem Display nur 1x pro Sekunde 
updaten.

Beitrag #6464455 wurde vom Autor gelöscht.
von Pedro E. (p2m)


Angehängte Dateien:

Lesenswert?

Hier ist eine Schaltung, welche meiner ähnlich ist.
Der AD Wandler hat 10 Bit. Also bei 5V Spannung eine Auflösung von ca.
4,8 mV. Ja aber wie bekomme ich es jetzt hin, das die Transistoren nicht
mehr hin und her schalten. Das Auf und Entladen funktioniert, nur wenn
der Wert sich dem Zielwert nähert, fängt er an zu schwanken. Ich will
einfach nur, dass wenn die Zielspannung erreicht ist beide Schalter auf
Low bleiben und nicht hin und her schwanken.

Ladelogik:

             S1            S2
Laden       HIGH          LOW
Entladen    LOW           HIGH
Halten      LOW           LOW

von aaoy (Gast)


Lesenswert?

Hi,

wie wärs mit -->

if (capVoltage <= (selectedCapVoltage + hysterese) && capVoltage >=
     (selectedCapVoltage - hysterese))
  {
    holdCapvoltage();
  }

Gruß

von Pedro E. (p2m)


Lesenswert?

Vielen Dank für die Antwort. Hat aber leider nicht funktioniert. 
Schalter springen immer noch hin und her.

von Sebastian S. (amateur)


Lesenswert?

Wenn der Kondensator die Schnauze voll hat, tut sich S1/Q1 mit dem 
Durchschalten schwer. Genaugenommen schon kurz vorher (Vcc - ~0,7).

von Wolfgang (Gast)


Lesenswert?

Peter D. schrieb:
> Floats sind nie exakt gleich.

Natürlich können Floats exakt gleich sein.
Das Problem ist, dass z.B. Konstanten, die als Dezimalzahl eingegeben 
werden, oft nur näherungsweise in einen ähnlichen Float-Wert konvertiert 
werden können.

Aber ich stimme dir zu: Floatvergleich auf Gleichheit geht (meist) 
daneben.

von Pedro E. (p2m)


Lesenswert?

Ja aber muss halt leider float verwenden. Oder wie soll ich sonst z.B. 
den Kondensator 2.15 Volt aufladen?

von Achim S. (Gast)


Lesenswert?

Pedro E. schrieb:
> Ja aber muss halt leider float verwenden. Oder wie soll ich sonst z.B.
> den Kondensator 2.15 Volt aufladen?

ist die Frage ernst gemeint? Lade ihn einfach auf 2150mV auf, dann hat 
du einen integer.

Pedro E. schrieb:
> Hat aber leider nicht funktioniert. Schalter springen immer noch hin und
> her.

dann musst du die Hysterese großer machen. sie muss z.B. großer sein als 
der Spannungssprung, der sich bei der Stromänderung am ESR ergibt.

von aaoy (Gast)


Lesenswert?

Hallo,

versuch mal deine Hysterse ein bisschen gößer zu machen. +-1 ADC Wert 
ist evtl. bisschen schmal gewählt.

oder mach das messen unabhänig von der Anzeige. Lass den immer messen 
und die Transitoren steuern, aber du updatest das Diyplay nur alle 
0.5s-1s.

Welche größe haben denn die Kondensatoren, so wie in dem Bild von dir 
mit nur paar pF's ? der Messvorgang zeiht ja auch Strom (also Ladung vom 
Kondensator der zu ein Spannungsfall führt) zwar wenig aber evtl doch so 
das der ADC Wert um >+-1 schwankt.

Ansonsten hier im Forum bei Projekt&Code ist auch der Transistortester 
zu finden. Da kannste ja mal im Code reinschauen wie die das da gelöst 
haben.

Gruß

von Sebastian S. (amateur)


Lesenswert?

Es gibt mehrere Möglichkeiten das "Hin-Und-Her-Schalten" abzustellen:
1. Du fragst nicht so schnell wie möglich ab, oder
2. Du baust eine sinnvolle Hysterese ein, oder
3. Du verwendest eine Kombination mit variablen Schaltschwellen, oder
4. Du implementierst einen, einer Dissertation würdigen, Regler.
Und, und, und.

Noch was zur Abfrage von Fließkommazahlen:
Natürlich funktionieren die üblichen Verdächtigen wie
">", "=" und "<" auch bei Fließkommazahlen, aber die Abfrage auf 
Gleichheit funktioniert nur sonntagnachmittags um exakt 3 Uhr wenn 
gerade der frische Kaffee auf dem Tisch steht.
Willst Du also auf Nummer sicher gehen, so frage im Intervall:
<  ...
>= ...
oder
<= ...
>  ...
Damit erschlägst Du dann auch den "Sonderfall".

von Pedro E. (p2m)


Lesenswert?

Der Kondesator hat 1000F.

von Joachim B. (jar)


Lesenswert?

Pedro E. schrieb:
> Oder wie soll ich sonst z.B.
> den Kondensator 2.15 Volt aufladen?

ich würde den auf 215 centi Volt aufladen ist integer

von Sebastian S. (amateur)


Lesenswert?

Hat sich eigentlich noch nirgends herumgesprochen, dass Computer mit 
dezimalen Zahlen, im Grunde genommen, nichts anfangen können?

Gehe ich von einem 10 Bit A/D-Wandler aus, so liegen 5V bei 1023 (3FFh).
Diesen Wert tut auch der A/D-Wandler - ohne Umrechnung - direkt kund.
Also kann eine Abfrage nach 2,0V auch durch eine Abfrage nach 408 (198h) 
erledigt werden.
An welcher Stelle hier eine Umrechnung nötig ist - außer bei der 
Definition der Konstanten für den Präprozessor - erschließt sich mir 
nicht. Auch sehe ich keinen Grund dafür irgendwo Fließkommabibliotheken 
vorzusehen. Einzige Ausnahme: Die Darstellung im Display, bei der eine 
fixe Darstellung mit fixem Komma (Punkt für die Ausländer) am 
sinnvollsten ist.

Also ein bisschen itoa () statt (?)printf () - in welcher Form auch 
immer - und sogar der freie Speicher wird sich freuen.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Achim S. schrieb:
> ist die Frage ernst gemeint? Lade ihn einfach auf 2150mV auf, dann hat
> du einen integer.

Joachim B. schrieb:
> ich würde den auf 215 centi Volt aufladen ist integer

Die Lösung ist manchmal zu einfach, um von selbst drauf zu kommen.

von Pedro E. (p2m)


Lesenswert?

Wie gesagt ich bin Anfänger in der Programmierung. Werde eure 
Lösungsvorschläge ausprobieren. Dank an alle für die nützlichen Infos.

von Peter D. (peda)


Lesenswert?

Pedro E. schrieb:
> Hier ist eine Schaltung, welche meiner ähnlich ist.

Nun, bei 0,5Ω und 5V fließen bis zu 10A, d.h. Du hast große 
Spannungsabfälle an den Leitungen. Da ist es kein Wunder, daß die 
gemessene Spannung beim Ein-/Ausschalten ordentlich schwankt.
In der Praxis löst man das so, daß zum Messen der Strom kurzzeitig 
abgeschaltet wird (Sperrverzögerung der Transistoren beachten).

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.