Forum: Mikrocontroller und Digitale Elektronik Stromregelung Schwingkreis mit STM32


von Hermann S. (diphtong)


Lesenswert?

Hallo zusammen,

ich bau mir gerade einen Induktionserhitzer.
Kurz zur Funktio:
Eine IGBT Vollbrücke speist die Leistung über einen Trafo in den 
LC-Schwingkreis ein. Ich hab eine Resonanzfrequenz von ca. 72 kHz. Die 
IGBT´s werden über einen GDT und einem geeignetem Treiber versorgt.
Steuern tut das Ganze ein STM32F103 über einen PWM Ausgang vom Timer1.
Mein Programm arbeitet von 25 - 120 kHz, Start ist immer bei 120 kHz.
Über ein Poti wird der Strom eingestellt, welcher dann über einen 
einfachen P-Regler im Programm entsprechend die Frequenz einstellt.

Das Teil ist eigentlich soweit schon fast fertig und funktioniert auch 
schon ganz gut, ein paar kleine Bugs muss ich aber noch beseitigen.

Z. b. dieser hier:
Angenommen ich stelle auf 16 A Eingangsstrom ein. Wenn ich z. B. Stahl 
erwärme bis er glüht, kann es sein, dass die Stromaufnahme sinkt. Kein 
Problem, der Regler regelt die Frequez ja nach, bis der eingestellte 
Strom wieder fließt. Funktioniert auch.
Es kann aber sein, dass das Gerät bei Resonanzfrequenz nicht mehr auf 
die Eingestellten 16 A Eingangsstrom kommt (weil sich die Induktivität 
des Werkstücks ändert oder der Widerstand...warum auch immer), sondern 
nur noch auf 13 A. Dann regelt der Regler aber immer weiter runter, bis 
auf 25 kHz.
D. h. der Regler checkt nicht, dass es eine Resonanzfrequenz gibt, und 
dass im Moment einfach nicht mehr gehen als die 13 A.
Besser wäre eigentlich eine Strombegrenzung, und keine Regelung auf 
einen festen Wert?!

Hat jemand eine Idee?

Hier mal der Regelungsteil:

 while (sensor1 <= strommax1) //Treiberstromüberwachung
      {
      if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)==GPIO_PIN_SET) //Wenn 
Aus-Schalter gedrückt -->
      {
        goto ende; // --> goto ende
      }
          //+++++++++++++++++++Fusspedalerkennung+++++++++++++++++++++++++++++++++ 
+++++++++++++++++++++++++
          if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4)==GPIO_PIN_SET) //Wenn 
Fusspedal eingesteckt
          {
            potentiometer = poti2;
          } else {
            potentiometer = poti;
          }
          //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
++++++++++++++++++++++++++

            //Frequenzregelung++++++++++++++++++++++++++++++++++++++++++++++++
            //Poti: 25A max! = 4096
            //sensor2 bei 25A max! = ?
            Strom = (sensor2-s2offset);
            e = (potentiometer*0.1325) - Strom; // Faktor muss angepasst 
werden! //war 0.1325
            Kp = 0.3; //Wert für Regleranpassung
            y = Kp * e;
/*
            //Richgung für Regelung (je nachdem, auf welcher Seite des 
Resonanzpeaks sich der Arbeitspunkt gerade befindet)
            if(e > 0 && laststrom > Strom){
              frequenz = frequenz - y; //Frequenz regeln
            } else {
              frequenz = frequenz + y; //Frequenz regeln
            }

            laststrom = Strom;
*/
            frequenz = frequenz + y; //Frequenz regeln
            //Frequenzgrenzen zw. 25 kHz und 120 kHz
            if(frequenz < 599){
              frequenz = 599;
            }
            if(frequenz > 2880){
              frequenz = 2880;
            }
            shift = frequenz/2;
            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++Freqenz-Timer setzen++++++++++++++++++++++++++++++++++++ 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        TIM1->ARR = frequenz; //counter period (frequenz) aktualisieren
        TIM1->CCR1 = shift; // Pulsbreite aktualisieren
        TIM1->CCR2 = shift;// Pulsbreite aktualisieren



Den auskommentierten Teil bei der Regelung hab ich schon mal 
ausprobiert, funktioniert aber nicht, vermutlich weil die gemessenen 
Stromwerte vom ADC immer ein bisschen zappeln.

Danke schon mal!

von A-Freak (Gast)


Lesenswert?

Ich würde die Phasenverschiebung zwischen Spannugn und Strom messen.

Ist die induktiv bist du im Regelbereich, ist sie null hast du schon die 
maximale leistung die du übertragen kannst und wird sie kapazitiv bist 
du übers Maximum hinaus.

von oweiowei (Gast)


Lesenswert?

Hermann S. schrieb:
> Danke schon mal!

Danke schon mal wenn du dich an die Regeln zum Posten von Code hältst.

Formatierung (mehr Informationen...)
    [c]C-Code [ /c]

von Hermann S. (diphtong)


Lesenswert?

A-Freak schrieb:
> Ich würde die Phasenverschiebung zwischen Spannugn und Strom messen.
>
> Ist die induktiv bist du im Regelbereich, ist sie null hast du schon die
> maximale leistung die du übertragen kannst und wird sie kapazitiv bist
> du übers Maximum hinaus.

Interessanter Ansatz! Dann müsste ich irgendwie die Spannung galvanisch 
getrennt messen. Würde das mit einem Optokoppler gehn? Linearität wär ja 
nicht so wichtig, brauch ja keinen exakten Spannungswert, sondern die 
Phase...oder?!

Wie kann ich dann dem STM32 beibringen, die beiden Phasen zu messen?

von MaWin (Gast)


Lesenswert?

Hermann S. schrieb:
> auch immer), sondern nur noch auf 13 A. Dann regelt der Regler aber
> immer weiter runter, bis auf 25 kHz.
> D. h. der Regler checkt nicht, dass es eine Resonanzfrequenz gibt, und
> dass im Moment einfach nicht mehr gehen

Verwende maximum power point Regelung: also nach jeder Änderung des PWM 
duty cycle ermitteln welcher Strom (bei welcher Spannung) fliesst, 
daraus die Leistung ermitteln (wenn der Strom grösser war als der 
gewünschte, Kurve spiegeln an der Maximalleistungsgrenzlinie, also aus 
11W bei 10W Maximum mit 9W weiterrechnen) und die Richtung 
(grösser/kleiner) der PWMduty cycle Änderung ändern,  wenn die Leistung 
geringer wurde.

von Hermann S. (diphtong)


Lesenswert?

MaWin schrieb:
> Hermann S. schrieb:
>> auch immer), sondern nur noch auf 13 A. Dann regelt der Regler aber
>> immer weiter runter, bis auf 25 kHz.
>> D. h. der Regler checkt nicht, dass es eine Resonanzfrequenz gibt, und
>> dass im Moment einfach nicht mehr gehen
>
> Verwende maximum power point Regelung: also nach jeder Änderung des PWM
> duty cycle ermitteln welcher Strom (bei welcher Spannung) fliesst,
> daraus die Leistung ermitteln (wenn der Strom grösser war als der
> gewünschte, Kurve spiegeln an der Maximalleistungsgrenzlinie, also aus
> 11W bei 10W Maximum mit 9W weiterrechnen) und die Richtung
> (grösser/kleiner) der PWMduty cycle Änderung ändern,  wenn die Leistung
> geringer wurde.

Servus!
Erstmal Danke für die Antworten!

Wenn ich annehme, dass die Spannung eine Konstante ist, brauch ich doch 
nur den Strom messen, oder?!

Ist das nicht schon sowas in der Art:
1
//Richgung für Regelung (je nachdem, auf welcher Seite des Resonanzpeaks sich der Arbeitspunkt gerade befindet)
2
if(e > 0 && laststrom > Strom){
3
frequenz = frequenz - y; //Frequenz regeln
4
} else {
5
frequenz = frequenz + y; //Frequenz regeln
6
}
7
8
laststrom = Strom;
9
*/

Wie schon oben geschrieben...funktioniert nicht, weil meine ADC Werte im 
Betrieb ein wenig zappeln und man merkt, dass er es nicht schafft sich 
einzuregeln (Frequenz zappelt dann bei 120 kHz rum).

Jetzt hab ich aber schon ne Mittelwertbildung über 1000 Werte.

von Nick M. (Gast)


Lesenswert?

Hermann S. schrieb:
1
> if(e > 0 && laststrom > Strom){
2
>               frequenz = frequenz - y; //Frequenz regeln
3
>             } else {
4
>               frequenz = frequenz + y; //Frequenz regeln
5
>             }

Das ist nicht groß verwunderlich, wenn die Frequenz zappelt. Du musst da 
mit einer zulässigen Abweichung (5%?) arbeiten und nicht aufs Komma 
genau.
1
            shift = frequenz/2;

Da bringst du was durcheinander!
Ändere die Frequenz um in Resonanz zu kommen.
Ändere das Tastverhältnis, um den gewünschten Strom einstellen zu 
können.

Die Resonanzfrequenz ändert sich übrigens wg. der Curie-Temperatur.

von Hermann S. (diphtong)


Lesenswert?

Nick M. schrieb:
> Hermann S. schrieb:
>
1
>> if(e > 0 && laststrom > Strom){
2
>>               frequenz = frequenz - y; //Frequenz regeln
3
>>             } else {
4
>>               frequenz = frequenz + y; //Frequenz regeln
5
>>             }
6
>
>
> Das ist nicht groß verwunderlich, wenn die Frequenz zappelt. Du musst da
> mit einer zulässigen Abweichung (5%?) arbeiten und nicht aufs Komma
> genau.
>
>
1
>             shift = frequenz/2;
2
>
>
> Da bringst du was durcheinander!
> Ändere die Frequenz um in Resonanz zu kommen.
> Ändere das Tastverhältnis, um den gewünschten Strom einstellen zu
> können.
>
> Die Resonanzfrequenz ändert sich übrigens wg. der Curie-Temperatur.

Guten Morgen!

Ahh das könnte funktionieren! Muss ich später gleich mal ausprobieren!
Logisch... ;-)

Die bez. „shift“ ist vll. hier irreführend, stammt noch aus älteren 
Zeiten des Programms, als ich die 2 Brückenzweige noch separat über 2 
Treiber und 2 GDTs ansteuern konnte. Damals lief der Timer1 im Capture 
Compare Output mode...mit dem shift hab ich dann die Phasenverschiebung 
der Brückenzweige gesteuert (CCR1 = 0 und CCR2 mit „shift“ verändert).

Jetzt werden alle 4 IGBTs über einen GDT angesteuert, der Timer1 läuft 
im PWM mode. Um die Brückenzweige symmetrisch anzusteuern, müssen die 
CCR Register immer die Hälfte der Frequenz sein, andernfalls ist das 
eine PWM Signal länger als das andere.

Ich steuer also die Leistung jetzt rein über die Frequenz.

Ah ja, das deckt sich auch mit meinen Beobachtungen, dass bei ~770 Grad 
irgendwas passiert.

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.