Arduino Hysterese für Kondensator Auf- und Entladung

OP #6464372
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();
  }
}
Beitrag #6464455 wurde von einem Moderator gelöscht.
OP #6464462
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
Angehängte Dateien:
Gast #6464590
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.
Gast #6464656
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.
Gast #6464665
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ß
#6464700
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".
#6464900
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.
#6465370
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).

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