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?
Welches ist denn das "gewünschte" Verhalten?
1 | OCR1B += (int8_t) diff*0.5 |
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..
Wie erhofft, so läuft es meistens:
1 | diff = ad_current() - 8; |
2 | OCR1B -= (int8_t) diff*0.5; |
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.
Ist zwar für'n MSP430... ...aber vom Prinzip her doch das Gleiche: DC-DC-Wandler, im diesem Fall ein Step-Up Beitrag "Solarlicht Steuerung"
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.
Danke für die Hinweise. Die Schaltung ist ähnlich http://www.mikrocontroller.net/attachment/18905/LED_SMPS.zip Momentan scheint es zu laufen, ist sehr langsam, etwa 3s zwischen zwei Helligkeitsstufen. Aber es gibt keine Abstürze..
1 | uint16_t ad_current(void) // 125kHz adps |
2 | {
|
3 | uint8_t i; |
4 | uint16_t result; |
5 | |
6 | result = 0; |
7 | for( i=0; i<20; i++ ) |
8 | {
|
9 | ADCSR |= (1<<ADSC); |
10 | while (ADCSR & (1<<ADSC)); |
11 | result += ADCW; |
12 | result /= 2; |
13 | }
|
14 | return result; |
15 | }
|
16 | |
17 | |
18 | |
19 | ISR(TIMER0_OVF0_vect) // 4MHz/1024 = 3906.25Hz |
20 | {
|
21 | int16_t diff; |
22 | static uint8_t st; |
23 | |
24 | if (++st == 64) |
25 | {
|
26 | st = 0; |
27 | diff = ad_current() - 8; // 8*1.25mA |
28 | OCR1B -= (int8_t) diff/2; |
29 | }
|
30 | }
|
Anscheinend ist es aber üblich, den Fehler mit einem Faktor zu multiplizieren, um die Stellgröße zu erhalten!?
>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!!!
Nachtrag: Eine kleine Übersicht über versch. DC-DC Wandler: http://www.sprut.de/electronic/switch/schalt.html
@Matthias L. Kannst Du mal Deine Berechnung der Übertragungsfunktion ins Netz stellen? Würde mich unheimlich interessieren. Danke schon mal.
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 ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.