Forum: Analoge Elektronik und Schaltungstechnik avr, schaltregler, stromregelung


von Wolf (Gast)


Lesenswert?

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?

von Matthias L. (Gast)


Lesenswert?

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...?

von Wolf (Gast)


Lesenswert?

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..

von Wolf (Gast)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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"

von Uhu U. (uhu)


Lesenswert?

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.

von Hatschi (Gast)


Lesenswert?

Erkennt der Compiler das nicht und optimiert entsprechend?

von Wolf (Gast)


Lesenswert?

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!?

von Stefan (Gast)


Lesenswert?

>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!

von Wolf (Gast)


Lesenswert?

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.

von Uhu U. (uhu)


Lesenswert?

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.

von Matthias L. (Gast)


Lesenswert?

>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??

von Wolf (Gast)


Lesenswert?

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?

von Matthias L. (Gast)


Lesenswert?

>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...

von Wolf (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Matthias L. (Gast)


Angehängte Dateien:

Lesenswert?

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

von Matthias L. (Gast)


Lesenswert?

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)

von Stefan (Gast)


Lesenswert?

>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

von Sophie (Gast)


Angehängte Dateien:

Lesenswert?

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)

von Wolf (Gast)


Lesenswert?

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?

von Stefan (Gast)


Lesenswert?

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...

von Wolf (Gast)


Lesenswert?

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!

von Stefan (Gast)


Lesenswert?

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!!!

von Stefan (Gast)


Lesenswert?

Nachtrag:

Eine kleine Übersicht über versch. DC-DC Wandler:
http://www.sprut.de/electronic/switch/schalt.html

von Sebastian (Gast)


Lesenswert?

@Matthias L.

Kannst Du mal Deine Berechnung der Übertragungsfunktion ins Netz 
stellen?
Würde mich unheimlich interessieren.

Danke schon mal.

von Wolf (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

>'Ä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!

von Uhu U. (uhu)


Lesenswert?

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...

von Stefan (Gast)


Lesenswert?


von Wolf (Gast)


Lesenswert?

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?

von Stefan (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.