Hallo,
ich versuche mich gerade an einem Schaltregler.
Es soll der Strom geregelt werden. Dazu wird der Spannungsabfall über
einem 0R1 Widerstand differentiell gemessen. 10mA entsprechen 1mV, mit
20-facher Verstärkung entspricht das einem 10-bit AD-Wert von 8, und
damit einer Auflösung von 1.25mA.
Problematisch ist, daß ich zwar über dem Widerstand den Spannungsverlauf
gut messen kann, die beiden Potentiale dem AD-Wandler aber über
Spannungsteiler zugeführt werden, und das Signal nicht mehr zu erkennen
ist. Nur im Mittel zeigt mir das Oszi etwa die richtige Spannung an..
Ich mittele also 20 Werte, und habe folgende Zeilen ausprobiert:
[c]
diff = ad_current() - 8;
OCR1B += (int8_t) diff*0.5;
[/]
Der duty-cycle des Schalters wird also um die Hälfte der Abweichung vom
gemessenen Sollwert verändert.
Ansatzweise meine ich eine Unabhängigkeit von der Eingangsspannung zu
erkennen, allerdings schwankt der Strom immer ziemlich stark. Und zwar
sägezahnartig |\|\|\
Wie kann ich zum gewünschten Verhalten kommen?
Ob das funktioniert??
>Spannungsteiler zugeführt werden
Wie wäre es mal mit einer Schaltung, und einer genauen Beschreibung des
Problems und dem, was du machen willst...?
Gewünscht ist, dass der Strom durch die LED konstant bleibt (unabhängig
von der Eingangsspannung).
Strom zu klein -> mehr Leistung in die Induktivität
Strom zu groß -> weniger ~
1
diff=ad_current()-8;
2
OCR1B+=(int8_t)diff*0.5;
Es muss genau andersherum sein! Allerdings hatte ich das vorhin
ausprobiert, und der Strom hat sich immer erhöht.
Gerade sah es so aus, als ob es funktioniert, aber Fehlanzeige..
Manchmal nimmt der Strom aber ungehindert zu. Das hieße, die Spannung
ist zu klein, diff ist negativ, das Tastverhältnis wird vergrößert.
Vielleicht versucht der Regler schneller zu sein, als er kann? Der Code
wird in einer ISR mit ca. 4kHz ausgeführt.
Der Verbraucher ist mit 47µF gepuffert, die Spannung über dem Shunt mit
22nF.
Ich würde das mal ändern
OCR1B -= (int8_t) diff*0.5;
in
OCR1B -= (int8_t) (diff >> 1);
Das vermeidet nämlich, daß der Compiler mit Fließkommazahlen rumrechnet.
>Anscheinend ist es aber üblich, den Fehler mit einem Faktor zu>multiplizieren, um die Stellgröße zu erhalten!?
Das nennt sich digitale Regelung und der Faktor ist der P-Anteil!
Ok, und das wäre dann das Verhältnis von gemessenem Spannungswert zu
compare register wert für die pwm, nehme ich an.
ok, dann hab ich das prinzip geschnallt, glaube ich.
Hatschi wrote:
> Erkennt der Compiler das nicht und optimiert entsprechend?
Nein, wenn float/double-Semantik in einem Ausdruck vorkommt, dann wird
nach double konvertiert und damit gerechnet. Erst der cast oder die
Zuweisung an ein int8_t sorgt dafür, daß zurückkonvertiert wird.
Das sind allesamt ziemlich teure Operationen und wenn der µC keine
Hardware-Float-Arithmetik kann, dann kostet das viel Zeit.
>Das nennt sich digitale Regelung und der Faktor ist der P-Anteil!
Ja genau.
Wie wäre es denn mal mit einer Berechnung der Induktivität, sowie der
Regelparameter, bevor losprogrammiert wird??
Das mit dem Regelparameter ist eine interessante Geschichte.
Sehe ich das richtig, daß eine einfache proportionale Regelstrecke gar
nicht ausreicht, wenn der Zusammenhang zwischen Stellgröße und Meßwert
nicht linear ist?
Die Korrekturmaßnahme leuchtet mir noch nicht so ein.
Drücke ich ein bisschen mehr auf's Gaspedal, wenn ich zu langsam bin,
oder berechne ich die zu erreichende Gaspedalposition anhand der
Geschwindigkeitsdifferenz neu?
>Drücke ich ein bisschen mehr auf's Gaspedal, wenn ich zu langsam bin,>oder berechne ich die zu erreichende Gaspedalposition anhand der>Geschwindigkeitsdifferenz neu?
Beides.
Du drückst mehr drauf.
Regelungstechnisch wird immer (zu jedem Abtastzeitpunkt), ausgehend von
der aktuellen Differenz ein neuer (Stell)Wert berechnet.
Gib doch mal ne Schlatung mit technischn Daten (Bauteilwerte). Und wir
sehen mal weiter...
>usammenhang zwischen Stellgröße und Meßwert nicht linear ist?
Das ist fast verloren, oder viel Aufwand mit Linearisierung,
Simulation...
Schaltung ist
http://schmidt-walter.fbe.fh-darmstadt.de/smps_e/awwandl_e.png
Vin_min = 3.0V Vin_max = 5.0V Vin = 3.4V
Vout = 6.4V Iout = 74.0mA f = 31.2kHz
L = 33.0uH ΔILfor Vin_min = 0.64A
Cout = 47µF
Beim reinen P-Regler nützt es aber doch nichts, wenn ich den duty-cycle
komplett neu berechne, ich muss doch den aktuellen anpassen!?
das passiert auf
http://www.roboternetz.de/wissen/index.php/Regelungstechnik durch den
D-Anteil, wenn ich es richtig verstanden habe.
Intuitiv würde ich sagen: ich fahre 70, will aber 80 fahren, also drücke
ich noch weiter auf's gas (und ich kann ungefähr einschätzen, wie weit).
demnach braucht man die funktion gas/geschwindigkeit, um dann bei 70kmh
das delta_gas für 70->80kmh schätzen zu können.
analog ist das duty-cycle/strom. das sieht mir irgendwie quadratisch
aus?
Das kann ja nicht richtig gehen. Das ist doch lückende Betriebsart.
Das gibt regelungstechnisch doch immer Probleme!
>komplett neu berechne, ich muss doch den aktuellen anpassen!?
Ist effektiv dasselbe.
>D-Anteil
Bring meistens mehr Probleme als Nutzen.
>um dann bei 70kmh das delta_gas für 70->80kmh schätzen zu können.
Nö. Du gibst solange (mehr) Gas, bis du 80km/h drauf hast. => PI-Regler
U_in L D
---o------/\/\/---o--|>|----o---------o------- U_out
| | | |
C_in Switch C_out R_out
| duty d| | |
| | | |I_out
---o--------------o---------o---------o-------- GND
Bin nicht ganz sicher, ob ich mich nicht verrechnet habe:
U_in 1
I_out = ----- ------------------- d
s*L 1 + s*R_out*C_out
(gilt nur für nicht lückenden Betrieb)
>Das kann ja nicht richtig gehen. Das ist doch lückende Betriebsart.>Das gibt regelungstechnisch doch immer Probleme!
Nö, in dem Falle nicht, da die LED-Stromregelung weder kritisch noch
instabil ist. Ich hab's (wie schon oben gesagt) ja hier auch so gemacht:
Beitrag "Solarlicht Steuerung"
Der lückende Betrieb lässt sich bei einer PWM-Erzeugung per µC kaum
vermeiden, da die Schaltfrequenz recht niedrig ist (KHz-Bereich) und die
Drossel dabei nicht so groß gewählt werden kann, um nicht in die
Sättigung zu gehen!
Hier mal 'ne App Note von TI mit Berechnungsgrundlagen eines Step-up
(auch im lückenden Betrieb):
http://focus.ti.com/lit/an/slva061/slva061.pdf
Mittlerweile habe ich den PI-Regler aus Roboternetz übernommen, und
etwas mit den Werten gespielt.
1
w=55;// Soll-Wert
2
x=ad_current();// Ist-Wert
3
e=w-x;// Vergleich
4
esum+=e;// Integration I-Anteil
5
if(esum<-400){esum=-400;}// Begrenzung I-Anteil
6
if(esum>400){esum=400;}
7
// y = Kp*e + Ki*Ta*esum;
8
y=2*e+1*esum;// Reglergleichung
9
y=y>>2;
10
if(y<0){y=1;}// Begrenzung Stellgröße
11
if(y>128){y=128;}
12
OCR1B=(uint8_t)y;// Übergabe Stellgröße
Die ISR in den vorigen Codeausschnitten läuft übrigens nur 1/256 so
schnell wie gedacht..
Jetzt also wirklich mit 100Hz - prinzipiell funktioniert's, auch wenn
ich den Einfluss der Faktoren noch nicht ganz nachvollziehen konnte.
Aber das ganze schwingt (vielleicht 10Hz) !
Anbei mal die Spannung über dem 0R1 Meßwiderstand und das PWM Signal.
Leider kann ich nicht messen, was am ADC anliegt, weil der Regler
ausschaltet, wenn ich das Oszi anklemme..
Wodurch entstehen die Überschwinger? Sind das irgendwelche
Leitungskapazitäten oder so? Sperrvorgang der Diode? ( Last (LED) ist
zwischen Ausgang und Eingang)
Nachdem ich noch einen Ausgangspuffer eingebaut habe, ist die Regelung
jetzt ziemlich stabil.
Wäre natürlich trotzdem gut, nur zu messen, wenn auch Strom fließt.
Sonst verhält sich der Messwert vs. tatsächlicher Strom ja umgekehrt
proportional zum Duty-Cycle..
Aber wie anstellen bei 62 KHz?
Ich verstehe den ganzen Schaltungsaufwand nicht, mit differentieller
Ist-Wert-Erfassung usw.
Wenn ich mich auf Deinen Schaltplan ('Boost.pdf') beziehe, wo hängt denn
nun Deine Last (LED)? Hängt die Zwischen TP1 und TP2 ?
Wenn ja, warum liegt dann die Parallelschaltung von R3 | R9 am unteren
Anschluß nicht auf GND sondern an VDD??? Das macht doch keinen Sinn!
Du erzeugst mit viel Aufwand eine hochgesetzte Spannung und läßt dieses
über die LED wieder gegen die Betriebsspannung arbeiten... wozu???
Der Fußpunkt von R3 | R9 gehört an GND. Dann erspare Dir bitte den
zusätzlichen Spannungsteiler (R5 kommt weg, R4 u. C3 können bleiben, als
Tiefpass um das Signal zu glätten) und messe Deine Ist-Spannung direkt
über EINEN ADC-Kanal und nicht differentiell. Verstärken brauchst Du
dann auch nichts mehr, wenn Du einen größeren Shunt verwendest. In
Deiner Simulation hattest Du Iout = 73mA. Shunt = 2R macht Uist = 146mV
-> passt perfekt, nicht zuviel aber auch nicht so mickrig wie vorher!
Und Deine ISR musst Du schneller machen, da hast Du irgend einen Bug
drin... das dauert viel zu lange! Dann klappt's auch mit der Regelung...
Danke für dein Feedback, Stefan.
Ich habe die Schaltung von http://cq.cx/smps.pl , die Last hängt
zwischen TP1 und TP2.
Eingetlich erschein mir ein invertierender Wandler auch geeigneter, nur
wegen der Strommessung problematisch. Aber differentiell sollte auch das
mit zwei Spannungsteilern gegen Vcc kein Problem sein, oder?
Wieso arbeitet die Spannung gegen die Betriebsspannung? Ist es nicht
egal, wo das andere Potential liegt?
Auf diese Weise ist es jedoch möglich, eine Spannung kleiner oder größer
als Vss zu erzeugen... also ca. 3-15V aus 3-5V. Soweit ich das
verstanden habe, geht das mit GND nicht.
Allerdings wundert es mich, dass sich von 3,3V auf 6.6V bei geschätzten
200mA schon ein D% von 46% einstellt, bei 5V etwa 39%.
Was kann da die Ursache sein?
Bauteile sind:
33uH/2,0A-SMD
SMD-Drossel 2,0A 0,1R
STPS 340 S
Schottky 40V 3A <0,5V/2A
IRF7401
Luxeon III white als Last
Sowohl zwischen Vcc (an der Drossel) und Vausgang 1000µF nach GND
Danke!
Hallo Wolf,
ohne das jetzt böse zu meinen... aber es ist schwer Dir zu helfen, ohne
dass Du mit detaillierten Informationen rausrückst!
Der Schaltplan den Du reingestellt hast (Boost.pdf) ist 'ähnlich' zu
Deiner Schaltung. Der neue Link hat gar keinen Schaltplan! Wie sollen
wir jetzt wissen, wie Deinen Schaltung genau aussieht?
Und was willst Du nun genau machen?
Um eine Akkuspannung von z.B. 1,2V auf 4,5V (Lux III) zu bringen,
braucht es einen Step-up Wandler, basta! Kein Inverter, Kein Buck/Boost,
kein Sepic. Also warum mit Kanonenkugeln auf Spatzen schießen, wenn
man's einfacher haben kann!
Bitte detaillierte Infos!!!
Hi stefan, es ist die schaltung aus boost.pdf, die vom autor der seite
weiter oben stammt.
'Ähnlich', weil nicht ganz identisch. Das Prinzip ist dasselbe.
Ich dachte, Du hättest die Schaltung schon verstanden, schließlich hast
Du sie radikal 'umgebaut' :-)
Das ist aber nicht ganz in meinem Sinn. Ich möchte hauptsächlich die
Luxeon III mit der Schaltung betreiben, aber nicht ausschliesslich.
Die Schaltung soll an Akkus betrieben werden, daher eine
Eingangsspannung von 3-5V. Die Betriebsspannung der LED liegt im
ähnlichen Bereich, etwa 3-4V.
Weder rauf- noch runterregeln helfen da, beides muss gehen. Also
entweder ein invertierender Wandler, oder ein anderes Potential
benutzen.
Er schreibt:
"I used the invert (buck-boost) topology, which allows Vin to be either
greater than or less than Vout. I could use that to run a white LED
(voltage drop around 3 V) from three alkaline cells, which give 4.5 V
with a fresh battery down to 2.4 V at 0.8 V/cell."
Wobei mir scheint, daß es kein invertierender ist, sondern ein step-up.
Aber es läuft ja eigentlich, und ich kann mich dran erfreuen und mit dem
PI Regler spielen. Bis auf zwei Sachen:
- die Leistung bei 40% Tastverhältnis scheint mir klein, ich hatte
angenommen, daß die Schaltung mehr schafft.
Ich bin kein E-Techniker, deswegen hatte ich gehofft, ich finde hier
guten Rat.
- Du schreibts, die Spannungen arbeiten gegeneinander. Das verstehe ich
nicht.
- Die Schottky- und die LED sind in der geschalteten Zeit in
Sperrichtung an die Eingangsspannung geschaltet. Schlecht/Egal ?
Danke für die Hilfe
>'Ähnlich', weil nicht ganz identisch. Das Prinzip ist dasselbe.
Der Teufel steckt im Detail. Und wenn Du z.B. nur eine Diode rumdrehst,
ist das ganze Funktionsprinzip dahin!
>Ich dachte, Du hättest die Schaltung schon verstanden
Hab ich auch. In meinen Augen ist das ein Pseudo Buck/Boost Konverter.
Da Du noch immer nicht gesagt hast, inwiefern sich Deine Schaltung nun
von Boost.pdf unterscheidet, muss ich von dieser ausgehen:
Die eigentliche Schaltung ist eine Step-Up, der an TP1 eine
Ausgangsspannung erzeugt, die immer >= Vdd ist.
Wenn Du nun die Last zwischen TP1 und TP2 anschließt, dann bekommt die
Last eine Spannung zwischen 0 und Vmax-Vdd (Vmax ist die max. Spannung
an TP1, je nach Regelung der PWM).
>die Leistung bei 40% Tastverhältnis scheint mir klein, ich hatte>angenommen, daß die Schaltung mehr schafft.
Das ist genau der Knackpunkt. Angenommen Deine Last benötigt 5V und Vdd
ist 2,4V (2 Akkus). Dann muss der Step-up an TP1 die Spannung 5V + 2,4V
= 7,4V erzeugen (und das aus 2,4V).
Würde R3|R9 an GND liegen und nicht an Vdd, dann müsste an TP1 'nur'
eine Spannung von 5V erzeugt werden (und das aus 2,4V). Das ist
wesentlich effektiver.
>Weder rauf- noch runterregeln helfen da, beides muss gehen
Dann musst Du mit dem schlechten Wirkungsgrad leben oder einen
g'scheiten SEPIC verwenden der das optimaler kann!
Oder Du entscheidest Dich für zwei getrennte Designs je nach
Anwendungsfall (Spannung rauf ODER runterwandeln)
>Du schreibts, die Spannungen arbeiten gegeneinander. Das verstehe ich>nicht.
Die Spannungsdifferenz zwischen TP1 und TP2 ist: Vout - Vdd.
Vout vom Step-up muss also gegen Vdd 'arbeiten' und nicht gegen GND
>Die Schottky- und die LED sind in der geschalteten Zeit in>Sperrichtung an die Eingangsspannung geschaltet. Schlecht/Egal ?
Geht nicht anders, wenn die LED überhaupt mal leuchetn soll! Wenn Du die
LED rumdrehen würdest, wäre sie immer in sperrichtung gepolt!
Kann mir mal jemand auf die Sprünge helfen, wo hier eigentlich der
'ähnliche' Schaltplan Boost.pdf zu finden ist? Vielleicht wird dann
dieser ziemlich kryptische Thread auch für Nichteingeweihte etwas
durchsichtiger...
Also heisst das quasi, die Batterie wird mit demselben Strom, der durch
die LED fliesst, wieder aufgeladen?
Ich check irgendwie nicht, was die Induktivität für eine Quelle ist.
Strom oder Spannung.
Gefühlsmässig ja eine Stromquelle.
Der Strom, der in die Spule geflossen ist, fliesst betragsmässig weiter,
durch die LED.
Damit dieser Strom fliesst, wird die Flusspannuung der LED +Vcc + 0,7V
schottky induziert.
Es wird eine Leistungsportion in die Spule gesteckt, fast dieselbe
Leistung könnte zwischen Uausgang und Masse entnommen werden.
Zwischen Uausgang und Vcc aber nur die Hälfte? Wo bleibt der Rest?
Klingt etwas nach Perpetuum Mobile...
... aber nicht wirklich!
In der Tat ist es so, daß die Batterie bzw. der Akku um den Strom der
durch die LED zurück nach Vdd fließt, entlastet wird!
PSpice sei dank! Denn wenn man einfach so drüber nachdenkt, kommt's
einem schon etwas komisch vor ;-)