Entwicklung eines Tiefsetzstellers auf STM32F334: Funktionsprinzip, Berechnungen, Prototyping

In meinen letzten beiden Artikeln habe ich über das Leistungsmodul und die Steuerplatine gesprochen, die auf dem Mikrocontroller STM32F334R8T6 basieren und speziell für die Implementierung von Steuerungssystemen für Stromrichter und elektrische Antriebe entwickelt wurden. Ein Beispiel für einen DC / AC-Wandler wurde ebenfalls betrachtet, was eine Demonstration und keine fertige Konstruktion war. Jetzt ist es Zeit, etwas Einfaches, aber Nützliches und vor allem Vollendetes zu tun.

Die meisten Probleme im Zusammenhang mit dem Projekt und der Leistungselektronik hängen mit bestimmten Topologien zusammen: Jemand ist daran interessiert, den PFC-Steuerungsalgorithmus zu lernen, jemand möchte lernen, wie man eine Halbbrücken-LLC baut, aber die beliebteste Topologie ist zweifellos Buck. Schließlich ist der Abwärtswandler (auch bekannt als Abwärtswandler) der Hauptkonverter für die interessantesten Projekte: Dies ist der Treiber für LED-Lampen, die Grundlage des MPPT-Controllers für Solarmodule, Ladegeräte und vieles mehr.

Das Netzwerk verfügt über viele Informationen zu Buck, einschließlich Datenblättern, aber diese sind verstreut, und ich persönlich bin nicht auf Material gestoßen, das den Prozess der Erstellung eines Buck-Konverters mit digitaler Steuerung ausführlich beschreibt. Es ist Zeit, das Problem zu beheben. Es gibt praktisch keine Mathematik, die Erklärung ist "an den Fingern", also wird es für jeden interessant sein, der irgendwie mit Elektronik verbunden ist.



Einführung


Zuerst müssen Sie verstehen, was wir am Ende bekommen wollen und welche Einführung wir haben. Die Buck-Topologie ist Step-Down, dh Sie können einen Step-Down-Spannungswandler bauen. Wie Sie später sehen werden, hängt die Spannung am Ausgang des Tiefsetzstellers fast linear von der Spannung am Eingang ab, sodass Sie eine Rückkopplung hinzufügen müssen. Heute werde ich über eine einfache Spannungsrückmeldung sprechen, die am intuitivsten ist und es Ihnen ermöglicht, das Funktionsprinzip zu verstehen, während diese Rückmeldung ausreicht, um die meisten Aufgaben zu implementieren.

Am Ende des Artikels erhalten wir eine funktionierende stabilisierte Spannungsquelle gemäß der „Synchron-Buck“ -Topologie, die mit digitaler Steuerung mit einer relativ hohen Frequenz arbeitet und auf dem STM32F334R8T6 mit hochauflösendem PWM (HRPWM) implementiert ist. Der Eingangsspannungsbereich beträgt 15 ... 60 V, die Ausgangsspannung 12 V und der maximale Ausgangsstrom 2A.

Kapitel 1. Das Prinzip des Topologie-Buck


Ich werde anfangen, von den Grundlagen zu erzählen und werde unseren Konverter schrittweise verbessern, wie "Synchronous Buck" ist eine Version der verbesserten Version mit erhöhter Effizienz und Steuerungskomplexität. Die Basisversion der Topologie, die Sie wahrscheinlich verwendet haben, lautet wie folgt:



Diese Topologie wird in Spannungswandlern mit geringer Leistung verwendet, um beispielsweise digitale Schaltungen und andere Geräte mit geringer Leistung mit Strom zu versorgen. Das Verringern von DC / DC, das Sie in Ihren Geräten verwenden, wird wahrscheinlich in Mikroschaltungen gemäß dieser Topologie implementiert. Ein Beispiel für einen solchen Chip ist LMR16006 .

Das Funktionsprinzip dieser Schaltung ist sehr einfach, ein PWM-Signal wird dem Transistor VT1 zugeführt, die Arbeit selbst ist in 2 Stufen unterteilt, die sich nacheinander abwechseln:

  • Die Stufe der Energiespeicherung im LC-Kreislauf. In diesem Stadium ist der Transistor VT1 offen und der Strom fließt durch den Transistor zur Last, wobei gleichzeitig Energie in der Induktivität und der Ausgangskapazität gespeichert wird:

  • Entladestufe. In diesem Stadium schließt der Transistor VT1 und dann beginnt der Spaß. Gas - Dies ist so etwas, das Energie ansammelt, wenn ein Potential angelegt wird (offenes VT1) und es abgibt, wenn das Potential verschwindet (VT1 ist geschlossen). Gleichzeitig versucht er nicht nur Energie zu geben, sondern auch den Wert des Stroms und seine Richtung zu speichern. Um diese Eigenschaft zu nutzen, müssen Sie die VD1-Diode hinzufügen, um den Stromkreis zu schließen, da der Strom nur in einem geschlossenen Stromkreis fließt:


Als ich diese Topologie in der 6. bis 7. Klasse kennenlernte, verstand ich nicht sofort, warum die Diode in der ersten Stufe keinen Strom leitet, jetzt scheint es alltäglich, aber ich denke, es ist erwähnenswert. Wenn VT1 offen ist, wird das Potential + VIN, beispielsweise + 20 V, an die Kathode der Diode VD1 bzw. das Erdpotential an der Anode der Diode angelegt. Damit der Strom durch die Diode fließen kann, muss es genau umgekehrt sein: Das Potential an der Anode muss größer sein als das Potential an der Kathode, daher ist die Diode in Buck-e im Stadium der Energiespeicherung „geschlossen“. In der Entladungsphase schließt die Diode bereits den Stromkreis, das Potential + VIN wirkt nicht auf seine Kathode und „sperrt“ sie nicht. Ich hoffe ich habe es klar erklärt.

Dann sollten Sie eine Frage haben: "Und welche Spannung wird am Ausgang sein, wenn wir 20 V an den Eingang anlegen?". Wie immer ist alles einfach:



Wie aus der Formel ersichtlich ist, hängt die Ausgangsspannung linear vom Tastverhältnis des PWM-Signals ab, das wir dem Transistor VT1 zuführen. Wenn jemand den „Tastverhältnis“ nicht kennt oder vergisst, ist dies das Verhältnis der Zeit, in der sich der Transistor im geöffneten Zustand befindet, zur Länge der Periode. Dieser Koeffizient kann einen Wert von 0 bis 1 oder von 0 bis 100% annehmen. Weiter werden wir mit dieser speziellen Figur arbeiten, wenn wir den Konverter steuern, aber um das Wesentliche zu verstehen, lassen Sie uns diese Beziehung in die Formel einsetzen:



Die Betriebsfrequenz des Tiefsetzstellers ist konstant und wird während des Entwurfs ausgewählt, sie ändert sich während des Betriebs nicht und daher ist die Periode (T) konstant. Es stellt sich heraus, dass die Ausgangsspannung direkt von zwei physikalischen Größen abhängt:

  • Ab dem Zeitpunkt, zu dem wir den oberen Transistor (VT1) öffnen - je länger er geöffnet ist, desto mehr Energie hat Zeit, sich im LC-Filter anzusammeln, und dementsprechend ist die Ausgangsspannung höher.
  • Wenn wir beispielsweise von der Eingangsspannung die Füllung um 50% fixieren und Vin von 20 auf 40 V ändern, ändert sich auch die Ausgangsspannung von 10 auf 20 V.

Ich denke, das allgemeine Bild und das Prinzip der Arbeit haben begonnen, Sie zu erfassen. Lassen Sie es uns jetzt beheben und die realen Oszillogramme betrachten und dieses Verhältnis in der Praxis überprüfen. Ich habe ein Buck-Layout zusammengestellt, das mit einer 10-W-LED geladen ist. Ich habe 3 Kanäle des Oszilloskops verwendet, die in den folgenden Punkten enthalten sind:



Erfahrung Nr. 1 - Eingangsspannung (Vin) konstant 20V, das Tastverhältnis ändert sich

  • Vin = 20 V, D = 25%, Vout = D · Vin = 0,25 · 20 V = 5 V.

  • Vin = 20 V, D = 50%, Vout = D · Vin = 0,5 · 20 V = 10 V.


Wie Sie auf den Wellenformen sehen können, ist die Beziehung zwischen der Ausgangsspannung und dem Arbeitszyklus korrekt. Natürlich war dies ein „idealisiertes“ Experiment, in Wirklichkeit ist die Eingangsspannung nicht stabil und schwebt in einem ziemlich weiten Bereich. Lassen Sie uns nun sehen, wie die Abhängigkeit von der Eingangsspannung bei einer festen Füllung sein wird.

Erfahrung Nr. 2 - Die Eingangsspannung (Vin) ändert sich, das Tastverhältnis ist konstant und beträgt 50%

  • Vin = 15 V, D = 50%, Vout = D · Vin = 0,5 · 15 V = 7,5 V.

  • Vin = 20 V, D = 50%, Vout = D · Vin = 0,5 · 20 V = 10 V.

  • Vin = 30 V, D = 50%, Vout = D · Vin = 0,5 · 30 V = 15 V.


Nun haben wir in der Praxis gesehen, dass die Ausgangsspannung auch linear von der Eingangsspannung bei einem festen Arbeitszyklus abhängt. Verstehst du schon, wie es die Ausgabe stabilisieren wird? Das Stabilisierungsprinzip ist so einfach wie die Formel selbst - Vout ist 12 V und konstant. Wir können das Tastverhältnis mit Hilfe eines Mikrocontrollers ändern. Wenn also Vin zunimmt, steigt auch die Ausgangsspannung und in diesem Moment verringern wir den Tastverhältnis, bis er wieder 12 V beträgt. Wenn Vin abnimmt, beginnen wir dementsprechend, das Tastverhältnis zu erhöhen, bis die Spannung Vout wieder 12 V beträgt.

Worauf möchte ich im theoretischen Teil noch aufmerksam machen ... Ah, ja! Sicherlich fragen Sie sich, wie eine PWM mit einer Amplitude von 20 V nach einem Transistor schließlich in eine konstante Spannung mit spärlichen Wellen umgewandelt wurde? Wenn wir die rote Sonde des Oszilloskops an die Quelle des Transistors VT1, die grüne Sonde nach dem LC-Filter, setzen, sehen wir das folgende Bild:



Sie können sehen, wie der LC-Filter die Wechselspannung in eine konstante Spannung „schmiert“, aber die in Induktivität und Kapazität gespeicherte Energie kann nicht sofort verbraucht werden, daher kann sich die Spannung nicht sofort ändern. Wir erhalten, dass in dem Moment, in dem die PWM vor dem Induktor 0 V wird, die Ausgangsspannung durch die im Filter gespeicherte Energie bereitgestellt wird, die nicht sofort absorbiert und ausreicht, um die Spannung zum Zeitpunkt des Schließens von VT1 aufrechtzuerhalten. Es ist natürlich alles an den Fingern, wenn es interessant ist, tiefer zu tauchen, dann rate ich wie immer B. Yu. Semenova "Leistungselektronik: von einfach bis komplex" gibt es ein ganzes Kapitel über Buck (Chopper).

Der Kampf um Effizienz


Wie ich etwas früher geschrieben habe, war dies die Basisversion der Topologie. Sein Hauptnachteil sind hohe Verluste an der Sperrdiode. Was ist der Strom in einfachen Systemen, die mit MK und CPLD arbeiten? Normalerweise innerhalb von 1A, manchmal innerhalb von 2A, wenn eine Art TFT-Anzeige vorhanden ist. In diesem Fall beträgt der Verlust selbst bei Verwendung einer Schottky-Diode 0,4 V * 2A = 0,8 Watt. Grundsätzlich ist es tolerierbar, ohne Probleme so viel auf dem SMA / SMB-Gehäuse abzuleiten, obwohl bei einer Spannung von 3,3 V und 2 A ein Verlust von 0,8 V immer noch 12% Wirkungsgrad beträgt!

Stellen Sie sich nun den Fall vor, in dem der Strom 20 A beträgt. Es kann sich um einen MPPT-Controller, ein großes FPGA-Stromversorgungssystem und vieles mehr handeln. In diesem Fall beträgt der Verlust 0,4 V * 20 A = 8 W! Was bedeutet das? Im Fall von MPPT wird beispielsweise weniger Energie in der Batterie gespeichert, im Fall von FPGA-Leistung werden zusätzliche 8 Watt Wärme benötigt, die irgendwo abgeführt werden müssen, und in beiden Fällen ist dies zweifellos ein Verlust der Gesamteffizienz. Was kann getan werden? Und lassen Sie uns die VD1-Diode durch einen anderen N-Kanal-Mosfet ersetzen und diese Schaltung erhalten:



Jetzt wirkt der Transistor VT2 als Diode, dh er leitet Strom, wenn VT1 geschlossen ist. Die Diode, die in der Basisversion enthalten war, musste nicht gesteuert werden. Jetzt müssen wir einen zusätzlichen Steuerkanal mit einem PWM-Signal bezahlen, um die Leistung zu verbessern.

Berechnen wir zunächst, um wie viel wir die Verluste reduziert haben. Der Kanalwiderstand eines modernen Mosfets beträgt mehrere Megaohm. Nehmen wir als Beispiel einen Transistor aus meinem Leistungsmodul, über den ich in früheren Artikeln gesprochen habe - IPP083N10N5AKSA1 mit einem Kanalwiderstand von 8,3 mOhm. Wir erhalten statische Verluste von 0,0083 * 20A * 20A = 3,32 Watt. Natürlich wird es dynamische Verluste geben, die bei einem angemessen ausgelegten Treiber nicht mehr als 20% betragen, dh die Gesamtverluste für uns betragen 4 Watt. Wir bekommen, dass der Übergang von einem herkömmlichen zu einem synchronen Buck den Verlust der Diode halbieren kann.

Schauen wir uns nun das kompliziertere Management an. Wie wir bereits verstanden haben, leitete die Sperrdiode Strom, als VT1 geschlossen wurde. Daraus folgt, dass VT2 geschlossen sein muss, wenn VT1 geöffnet ist, und dementsprechend VT2 geöffnet ist, wenn VT1 geschlossen ist. Wenn es einfacher ist, arbeiten die Transistoren abwechselnd: Entweder ist einer offen oder der andere, wenn beide Transistoren offen sind, gibt es einen Durchgangsstrom, weil Sie sind zwischen VIN und GND miteinander verbunden. Mal sehen, was das Signal sein soll, wobei der "gelbe Kanal" der Transistor VT1 und der "grüne Kanal" der Transistor VT2 ist:



Wie Sie sehen können, muss zu diesem Zeitpunkt die logische „0“ im grünen Kanal (bei VT2) eingestellt werden, wenn die logische „1“ im gelben Kanal (bei VT1) eingestellt ist. Wir bekommen, dass VT1 Energie in den LC-Filter pumpt und VT2 den Stromkreis in der Entladungsstufe schließt.

Es gibt noch einen Punkt, von dem Sie oben bereits gehört oder gelesen haben - durch Strom . Tatsache ist, dass ein realer, kein idealer Transistor (Mosfet) eine bestimmte Kapazität am Gate hat, dh in Wirklichkeit nicht sofort von log.0 auf log.1 übergeht und sich die Energie im Transistor nicht sofort auflöst, wodurch Transistoren entstehen Zum Zeitpunkt des Umschaltens können beide für kurze Zeit geöffnet sein. Dies kann bestenfalls zu erhöhten Verlusten führen, was Erwärmung und im schlimmsten Fall zu einer Babah bedeutet, weil Durchstrom ist ein häufiger Kurzschluss (Kurzschluss). Um dies zu vermeiden, wird eine Verzögerung oder die sogenannte Totzeit zwischen dem Ausschalten eines Transistors und dem Einschalten eines anderen eingeführt. Es sieht so aus:



Ich denke, Sie haben bemerkt, dass es eine kleine Lücke an der Signalschaltgrenze gibt. Ich habe es wissentlich groß installiert (ca. 3%), damit Sie es sehen können, in Wirklichkeit ist es viel kleiner. Im Allgemeinen wird die Totzeit (im Folgenden dt) so kurz wie möglich eingestellt, aber gleichzeitig ausreichend, um das Schließen der Transistoren zu ermöglichen. Es kann berechnet oder empirisch ausgewählt werden. Ich persönlich denke, dass diese und jene Option normal ist, aber der bärtige Jedi wird Ihnen wahrscheinlich sagen: "Es ist notwendig, darüber nachzudenken, aber es ist besser, es zu modellieren!" Dies ist sicherlich richtig, aber entscheiden Sie selbst - wenn Sie nicht zu faul sind, modellieren Sie in LTspice unter Berücksichtigung der Streuinduktivitäten und Kapazitäten von Leitern und Bauteilen.

Für den Stand in diesem Artikel habe ich dt auf ~ 100 ns (tatsächlich 104) eingestellt. Mein Modul ermöglicht es Ihnen, es viel weniger zu installieren, weil Der Treiber wird sehr hart angewendet, aber sicher werden viele von Ihnen Ihr Layout ohne mein Modul erstellen, was bedeutet, dass es höchstwahrscheinlich Rotz geben wird. Damit ich nicht wegen Rotz hängen bleibe, lasse ich dt mit einem Rand und wenn Sie eine normale Verkabelung auf der Platine haben, können Sie diese selbst reduzieren - dann werden Sie im Kapitel über den Code sehen, wie wir vorerst sehen, ob es wirklich dt gibt:



Es ist ersichtlich, dass dt 2,5 Teilungen dauert und jede Teilung 40 ns beträgt, was bedeutet, dass die Dauer wie beabsichtigt ~ 100 ns beträgt. Ich hoffe, Sie verstehen, warum dt benötigt wird, wie lange es dauern sollte und wie der Konverter gemäß der Buck-Topologie funktioniert. Wenn Sie nicht verstehen, werden wie üblich Fragen in den Kommentaren, PM und Mail akzeptiert, während ich anscheinend alle beantworte.

Kapitel 2. Die Berechnung der Hauptkomponenten


In diesem Teil des Artikels werde ich zeigen, wie schnell und einfach die Hauptleistungskomponenten für einen synchronen Abwärtswandler berechnet werden können, nämlich: Induktor, Eingangs- und Ausgangskondensatoren, Transistoren.

Ich möchte Sie an die Eingabedaten erinnern:

  • Eingangsspannung: 15 ... 30V
  • Ausgangsspannung: 12V
  • Nennausgangsstrom: 2A
  • Schaltfrequenz: 100 kHz

Die Ausgangsspannung von 12V wird gewählt, weil Ich plane, eine 12V 20W LED als Last zu verwenden, was sich als zur Hand herausstellte und eine sehr offensichtliche Last ist. Vorwegnahme der Fragen der „Experten“ in den Kommentaren - ja, mir ist bewusst, dass die LED eine Stromstabilisierung benötigt, aber wir machen dann einen Spannungsstabilisator und die LED ist nur eine Last.

Die Eingangsspannung wird vom Bulldozer ausgewählt. Sie können 15 ... 60 V erzeugen. Wenn Sie also an einem anderen Bereich interessiert sind, können Sie den Wert der Komponenten selbst berechnen. Ein Nennstrom von 2A wird gewählt, um die Ausgangsleistung von 12 V * 2A = 24 W zu erhalten, dh etwas mehr als für die LED erforderlich. Die LED selbst bei 12 V verbraucht ca. 1,82 ... 1,9A.

Der interessanteste Parameter blieb - die Betriebsfrequenz des Wandlers. Was soll es sein Sie müssen hier selbst antworten, in meinem Fall sind es 100 kHz. Die Wahl basiert auf zwei Punkten:

  • Eine Erhöhung der Frequenz führt zu einer Verringerung der erforderlichen Induktivität des Induktors, des Eingangs- und Ausgangskondensators. Einfach ausgedrückt: Mit zunehmender Frequenz verringern sich die Abmessungen des Geräts. Mit abnehmender Frequenz nehmen die Abmessungen zu.
  • Eine Abnahme der Frequenz führt zu einer Effizienzsteigerung, da dynamische Verluste beim Schalten von Transistoren werden reduziert. Durch Erhöhen der Frequenz wird die dynamische Komponente der Transistoren erhöht und dementsprechend der Wirkungsgrad verringert.

Jetzt werde ich die Wahl der Frequenz nicht diskutieren, sondern nur 100 kHz annehmen. Nachdem ich die Berechnungsmethode gezeigt habe, werden wir auf diese Frage zurückkommen, weil Gemäß den Formeln wird die Abhängigkeit der Nennwerte der Hauptkomponenten von der Betriebsfrequenz deutlicher sichtbar.

Schritt 1. Transistoren auswählen

Wir werden uns hauptsächlich für 3 Parameter interessieren: die maximale Spannung "Drain-Source", den Kanalwiderstand im offenen Zustand und die Gate-Kapazität. Das volle Potential der Spannungsquelle (Vin) wird an den Transistor angelegt, und zum Zeitpunkt des Schaltens treten auch Überspannungen auf. Sie haben zwei Möglichkeiten: Nehmen Sie den Transistor VT1 und VT2 mit einem Spannungsabstand oder die Geschichte des RC-Snubbers auf VT2. In meinem Fall verfügt das Leistungsmodul über 100-V-Transistoren, und bei einem Eingang von 30 V ist dies eine enorme Spannungsspanne. Selbst 60 V reichten aus, um auf Dämpfer zu verzichten und den Transistor vor Durchschlag zu schützen.

Kanalwiderstand - je kleiner desto besser, aber es gibt einen ABER. Mit einer Abnahme des Kanalwiderstands verringern wir statische Verluste (I 2 * R), aber die Technologie ist so, dass die Gatekapazität zunimmt, und dies führt zu einer Zunahme der dynamischen Verluste. Sie müssen einen Mittelweg zwischen „Kanalwiderstand“ und „Verschlusskapazität“ finden. Bei Spannungen bis zu 100 V empfehle ich Ihnen, auf die Transistoren der Infineon OptiMOS-Serie zu achten, die Hochspannungen bereits selbst durch parametrische Suche oder sogar in Richtung IGBT-Transistoren zu betrachten. Letztere werden auch von meinem Power Module unterstützt und erfordern keine Änderungen am Treiber.

Schritt 2. Die Berechnung der Induktivität des Induktors

Es ist notwendig, den Mindestwert der Induktivität zu berechnen, damit unser DC / DC-Wandler im Dauerstrommodus (L min ) arbeiten kann:



In Bezug auf Variablen denke ich, dass alles klar ist, außer - k ind . Dies sind zulässige Welligkeitsströme in der Induktivität, sie wählen normalerweise einen Wert von 20 ... 50%, aber ich stelle fast immer 30% ein. Je kleiner die Welligkeit des Stroms ist, desto weiter sind wir von der Sättigungsgrenze des Kerns entfernt, auf den der Induktor gewickelt ist. Wie aus der Formel ersichtlich ist, wird jedoch eine große Induktivität des Induktors benötigt.

Jetzt berechnen wir den Mindestwert der Induktivität, der für meine Eingangsdaten benötigt wird, die Welligkeit, die ich 30% legen werde, wie ich oben geschrieben habe:



Es versteht sich, dass dies die minimale Induktivität ist, die erforderlich ist, damit der Tiefsetzsteller im Modus untrennbarer Ströme arbeitet, aber es gibt wieder eine Nuance. Bei der Erhöhung des in der Wicklung wirkenden Stroms sind die Permeabilität des Kerns und die Induktivität des Induktors OHNE Strom und Mit Strom etwas unterschiedlich, die Abhängigkeit ist für verschiedene Materialien unterschiedlich.Um die Situation zu vermeiden, in der mit einem Anstieg des Stroms in der Induktivität die Induktivität unter L min abfällt und DC / DC nicht in den Unterbrechungsstrommodus übergeht, ist es notwendig, die Induktivität etwas zu erhöhen, dh während des Wickelns einige zusätzliche Windungen hinzuzufügen. Eine Erhöhung der Induktivität um 10-15% wird für das Kool Mu-Material ausreichen, und meine Drossel wird darauf sein.

Schritt 3. Berechnung und Herstellung des Induktors

Ich möchte dieses Verfahren im Abschnitt "Prototyping" beschreiben, aber dann wäre Ihnen der Schritt der Berechnung der Induktivität weniger klar geblieben, und ich habe wahrscheinlich die interessanten Bilder verpasst, daher werde ich hier alles beschreiben. Für die Herstellung der Drossel werde ich die Drossel R26 / 14/11 (R ist der Ring und die Zahlen sind die Abmessungen) aus Kool Mu-Material mit Durchlässigkeit 60 nehmen. Sie können die Dokumentation dafür herunterladen und hier kaufen -Lepkos .



Jetzt müssen Sie berechnen, wie viele Windungen und welchen Draht Sie wickeln müssen. Beginnen wir vielleicht mit der Anzahl der Umdrehungen. In der Dokumentation gibt es einen so praktischen Parameter für den Kern - A L , der 75 nH / Umdrehung 2 entspricht . Hier vorsichtig - dreht sich in einem Quadrat! Um die Kerninduktivität zu ermitteln, multiplizieren Sie A L mit der Anzahl der Windungen im Quadrat. Von hier aus sieht die Formel zum Ermitteln der Anzahl der Windungen folgendermaßen aus:



Um die minimal erforderliche Induktivität zu erhalten, müssen 40 Windungen gewickelt werden. Wie bereits erläutert, muss die Induktivität leicht erhöht werden. Fügen wir 3 Windungen hinzu. Wir nehmen den Ring und Wind 43 Umdrehungen, wir bekommen so ein Gas:



Aus Gründen des Interesses berechnen wir nun, welche Induktivität sich herausstellen soll:



Und um die Zuverlässigkeit zu überprüfen, überprüfen wir die Induktivität des Induktors mit einer Pinzette:



137 μH, großartig! Ergebnisse konvergiert, einen Fehler innerhalb von ± 8% auf einen L . Hier ist es erwähnenswert: Wenn Sie nicht in der Lage sind, die Induktivität zu messen, kaufen Sie keine Kerne für Aliexpress, in ChiDa, Computer, Elektronik und anderen „Restaurants“. Es besteht die Möglichkeit, den Kern aus einem anderen Material oder mit der falschen Durchlässigkeit, aber mit der richtigen Markierung zu erhalten. verifiziert. Ohne die Fähigkeit, die Induktivität zu messen, können Sie A L nicht überprüfen und sich auf der Suche nach der Ursache des "Babakh" Ihres Konverters stark quälen.

Dies wirft eine vernünftige Frage auf: „Werden wir genug Kern und seine Dimensionen haben? Vielleicht war es mehr nötig? ". Für Kool Mu-Material beträgt die magnetische Induktionsgrenze 0,5 T, in der Praxis ist es besser, nicht über einen Schwellenwert über 0,45 T hinauszukriechen, ohne dass dies eindeutig erforderlich ist. Es stellt sich heraus, dass die Wicklungswicklung auf dem Kern nicht an jedem Punkt des Kerns eine Induktion von mehr als 0,45 T erzeugen muss. Wir überprüfen daher:



Wie Sie sehen können, liegt der Wert der magnetischen Induktion von 0,06 T viel unter dem Grenzwert von 0,5 T. Daraus lassen sich zwei Schlussfolgerungen ziehen: Erstens geht der Gashebel nicht in die Sättigung, und zweitens ist der Kern sehr groß und es ist kraftvoll, einen viel kleineren Ring zu nehmen. Ich habe den R26-Ring genommen, nur weil ich ihre ganze Box habe, es gibt keine andere geheime Bedeutung.

Es bleibt zu bestimmen, welcher Abschnitt des Drahtes für den Induktor benötigt wird. Erstens rate ich Ihnen dringend, bei so hohen Frequenzen keinen Draht mit einem Durchmesser von mehr als 1 ... 1,2 mm zu nehmen, weil Der Hauteffekt hat bereits einen signifikanten Effekt und reduziert den effektiven Querschnitt. Zweitens muss die Stromdichte im Draht basierend auf den Kühlbedingungen und der Leistung ausgewählt werden. Bei geringen Leistungen (bis zu 10-20 W) können Sie auch ohne Luftstrom sicher eine Stromdichte von 8..10 A / mm 2 verlegen . Bei Leistungen bis zu mehreren Kilowatt ist es besser, die Stromdichte im Bereich von 5 ... 6 A / mm 2 zu legen , und bei Leistungen ab 10 kW ist es sinnvoll, die Stromdichte auf 3 ... 4 A / mm 2 zu reduzieren .

An meinen Fingerspitzen befand sich ein lackierter Draht mit einem Durchmesser von 0,8 mm. Sein Querschnitt beträgt jeweils ~ 0,5 mm 2 . Bei einem Strom von 2A erhalten wir eine Stromdichte in der Wicklung von ca. 4 A / mm 2 . Ich könnte einen Draht mit dem halben Querschnitt verwenden, aber mein Kern ist groß genug, sodass ein Draht mit größerem Querschnitt problemlos passt. Wenn Sie Ihr Gerät optimieren, müssen Sie zuerst zählen und dann den Draht mit dem gewünschten Querschnitt kaufen, um die optimalen Abmessungen des Induktors zu erhalten.

Schritt 4. Berechnung des Ausgangskondensators

In diesem Stadium, wie im Fall der Induktivität, betrachten wir den Mindestwert der Kapazität, die im LC-Filter am Ausgang des Tiefsetzstellers installiert werden muss. Dementsprechend ist es besser, wenn Sie mehr installieren und dann sehen, warum. Berechnen wir die Kapazität:



Natürlich muss die Kapazität auch mit einem gewissen Spielraum versehen werden, insbesondere wenn Sie am Ausgang nur Keramik verwenden, weil seine Kapazität wird in Abhängigkeit von der an ihn angelegten Spannung stark reduziert. Es lohnt sich auch, auf die Abhängigkeit von Pulsationen zu achten - den variablen V- Puls. Dies ist der Maximalwert der Welligkeit am Ausgang, dh idealerweise bei einer Kapazität von 147,8 μF beträgt die Welligkeitsamplitude 0,2 V, dh die Ausgangsspannung schwankt im Bereich von 11,9 bis 12,1 V. Möchten Sie die Welligkeit reduzieren? Reduzieren Sie sie dann in der Formel, und der Wert der resultierenden Kapazität steigt entsprechend an. Natürlich erhalten Sie keine Labornetzversorgung, indem Sie einfach die Ausgangskapazität erhöhen. Es ist auch notwendig, die Notwendigkeit eines niedrigen ESR zu berücksichtigen, dazu setzen sie normalerweise 1-2 Elektrolyte parallel und hängen Keramik mehrere Mikrofarad parallel zu ihnen mit einem X7R-Dielektrikum, vorzugsweise. Wenn das Budget es zulässt, ist es möglich, den Elektrolytkondensator durch Polymer-Tantal (wie in der GPU) zu ersetzen, sodass Keramik nicht benötigt wird und einen winzigen ESR aufweist.

Frequenzüberlegungen

Nun kommen wir, wie gesagt, auf die Frage der Wahl der Betriebsfrequenz des Wandlers zurück. Lassen Sie mich die Schlussfolgerungen in einige Gedanken aufteilen:

  • Wie Sie in der Formel sehen, erscheint die Frequenz, je höher die Betriebsfrequenz, desto niedriger die Induktivität des Induktors und desto weniger Windungen müssen gewickelt werden - wir sparen Kupfer und vereinfachen die Herstellung von Wicklungsprodukten
  • Die Induktivität und die Anzahl der Windungen sind in der Formel zur Berechnung der magnetischen Induktion enthalten, obwohl, wie Sie sich erinnern, die Induktivität eine quadratische Abhängigkeit von den Windungen aufweist, was bedeutet, dass die Induktivität um das Vierfache abnimmt, wenn die Anzahl der Windungen um das Zweifache verringert wird. Daraus folgt, dass mit zunehmender Frequenz die Induktivität und der Wert der magnetischen Induktion abnehmen, was bedeutet, dass ein kleinerer Kern verwendet werden kann, dh wir verringern die Abmessungen
  • , — , , . !
  • … , . buck- mosfet- 200 . ( ) ? GaN

Ich denke, aus diesen Thesen wurde Ihnen klar, wie sich die Schaltfrequenz auswirkt. Jetzt müssen Sie lernen, wie Sie den „goldenen Mittelwert“ zwischen den Verlusten an Transistoren und der Größe des Geräts selbst finden. In einem der folgenden Artikel werde ich Ihnen beibringen, die Betriebsfrequenz für maximale Effizienz zu optimieren. Die Hauptsache ist, nicht zu vergessen, dass ich es tun würde.

Kapitel 3. Zusammenbau eines Buck-Konverter-Layouts


Der mühsamste, aber wichtigste Teil ist also vorbei, jetzt werden die Hardware und der Code weg sein. Stellen wir ein Layout zusammen, auf dem wir theoretische Berechnungen durchführen werden. Dazu benötigen Sie zwei Module, über die ich in früheren Artikeln gesprochen habe: das Leistungsmodul und das Steuermodul des STM32F334 . Sie können auch selbst eine Halbbrücke aus einem improvisierten Müll vom Typ IR2110 auf einem Steckbrett zusammenbauen und ein beliebiges MK als Steuerelement verwenden: STM32-Discovery, LaunchPad, Arduino und einfach die Logik von Arbeit und Code an Ihr Lieblings-MK anpassen. Nichts wird kompliziert, wenn Sie haben in den ersten beiden Kapiteln verstanden, wie der Buck-Konverter funktioniert.

Lassen Sie uns nun unser Buck-Diagramm „realistischer“ machen, indem wir die Werte aller Komponenten hinzufügen und die Anzahl der Kondensatoren korrekt wiedergeben. Beachten Sie auch, welchen Teil mein Leistungsmodul realisieren kann:



Wie Sie dem Diagramm entnehmen können, enthält das Modul bereits eine Halbbrücke (zwei Transistoren) zur Implementierung eines synchronen Buck und eines Eingangskondensators. Es befindet sich übrigens im Modul mit einem großen Spielraum - es gibt 3 Elektrolyte mit jeweils 1000 uF und 100 V, dies reicht aus, um einen Buck für 500 einfach zusammenzubauen -800 Watt Es bleibt für uns, eine Drossel, die wir bereits hergestellt haben, hinzuzufügen und Kondensatoren auszugeben, letztere übrigens auch mit einem Rand, weil Ich fand nur 4700 uF 25V für Niederspannung, aber sie sind eine Art Chinesisch, also entschied ich mich auch, ein paar zu parallelisieren. Tatsächlich gibt es dort genug 470 uF, aber ich hatte in der Ausgabeversion einfach keine solche Kleinigkeit. Es stellt sich heraus, dieses Design:



Wie bereits erwähnt, wird eine leistungsstarke 20-W-LED als Last verwendet. Ich weiß nicht, wie viel Licht es scheint, und es ist nicht sehr interessant, aber es verbraucht nur 21 ... 22 W bei 12 V, für die mein Abwärtswandler ausgelegt ist. Die LED selbst hat den KPT-8 beschichtet und mit dem Kühler verschraubt. Das reicht natürlich nicht aus, hält aber problemlos 5-7 Minuten (er erwärmt sich auf +40 ... 50 ° C) und ich brauche nicht mehr. Wir verbinden 2 HRPWM-, GND-Signale vom Steuermodul und schließen über den Teiler den Buck-Ausgang an den ADC an. Dadurch haben wir einen solchen Stand:



Kapitel 4. Software schreiben und Konverter starten


Jetzt haben wir alles, was wir brauchen, um Code zu schreiben und unseren Buck-Konverter wiederzubeleben. Schauen wir uns zunächst die Pinbelegung für den Mikrocontroller STM32F334R8T6 an, der sich im Steuermodul befindet:



Jetzt wissen wir, welche Mikrocontroller-Pins verwendet werden. Auf dem Modul selbst benötige ich nur 1 von 5 Kanälen, um das Netzteil zu steuern. Wir werden Kanal „A“ verwenden. Dieser Kanal verfügt wie alles andere über 2 hochpräzise PWM-Ausgänge (HRPWM), 1 Fehlereingang (wir verwenden ihn nicht), GND zum Kombinieren der Erdung der Karten und 2 ADC-Kanäle (wir verwenden nur einen für die Spannung).

Ein bisschen über HRPWM

In den Weiten des russischsprachigen Segments des Internets habe ich praktisch keine Schulungsmaterialien zu HRPWM und überhaupt keine Materialien zur Arbeit mit HRPWM auf der Basis von STM32-Mikrocontrollern gefunden, und dies ist ein sehr nützliches Peripheriegerät.

Ich werde mich im Rahmen dieses Artikels nicht mit der Theorie dieser Peripherie befassen, also werde ich das Wesentliche beschreiben. HRPWM oder High Resolution PWM ist unser übliches PWM-Modul, das eine erhöhte Auflösung zum Einstellen des Tastverhältnisses und normalerweise zusätzlich flexiblere Einstellungen aufweist.



  • Der Mikrocontroller STM32F334R8T6 verfügt über 10 HRPWM-Kanäle, die in 5 Gruppen zu je 2 Kanälen zusammengefasst sind. Diese beiden Kanäle innerhalb der Gruppe können unabhängig voneinander arbeiten und ein komplementäres Paar bilden - wir brauchen letzteres;
  • Innerhalb des komplementären Paares zwischen 2 PWM-Signalen ist es möglich, Hardware-Totzeiten zum Schutz gegen Durchgangsstrom zu installieren.
  • Alle 10 Kanäle werden von einem Timer - Master-Timer - getaktet, sodass sie alle miteinander synchronisiert sind und Sie keine Kette von Timern manuell konfigurieren müssen. Es reicht aus, den Master und die Timer A ... E-Timer einzuschalten, um von dort aus getaktet zu werden.
  • Die Frequenz bei HRPWM wird verdoppelt, dh bei einer Kernfrequenz von 72 MHz beträgt sie bei HRPWM 144 MHz nach einem zusätzlichen Faktor (x2) mit PLL. Dies ermöglicht es, die Wandler mit einer Frequenz von Hunderten von kHz zu steuern;
  • Viele Einstellungen für die PWM-Steuerung, z. B. die Möglichkeit, die PWM-Generierung an den Anfang und das Ende des Zeitraums zu binden, bieten 4 weitere konfigurierbare Ereignisse (comp), mit denen Sie die PWM zu jedem anderen Zeitpunkt als dem Beginn / Ende des Zeitraums auf 0 oder 1 übersetzen können.
  • Es gibt Modi für bestimmte Topologien, z. B. den Push-Pull-Modus, mit dem Sie viele Push-Pull-Topologien implementieren können.

Und dies ist nur ein kleiner Teil der Funktionen. Im HRPWM-Gerätediagramm sehen Sie die Synchronisierungsfunktionen mit einer Reihe von Ereignissen, DACs und in den MK integrierten Komparatoren. Neben diesem Blockdiagramm gibt es viele weitere dokumentierte Möglichkeiten.

Es bleibt die letzte Frage, die beantwortet werden muss: "Warum ist dieses PWM-High-Bit?". Betrachten Sie dazu ein einfaches Beispiel. Stellen Sie sich vor, wir haben uns für MK ohne HRPWM entschieden, sagen wir STM32F103C8T6, das auch mit einer Frequenz von 72 MHz arbeitet. Wir müssen die Halbbrücke mit einer Frequenz von 70 kHz steuern. Wir überlegen, welchen Regelungsschritt wir erreichen können: 72 000 000/1025 Schritte = 70 243 Hz. Ja, wir haben 1025 Schritte und beim Einstellen können wir die Ausgangsspannung mit einem theoretischen Schritt von 1/1025 = ~ 0,1% ändern. Jetzt nehmen wir STM32F334 mit einer Taktfrequenz von 144 MHz und einer Verschiebungsbreite des Timers von 32 Bit. Wir erhalten die äquivalente Frequenz von 144 MHz * 32 = 4,608 GHz. Für diejenigen, die Angst hatten und an der Figur zweifelten:



Nein, dies ist keine Betriebsfrequenz, dies ist eine äquivalente Frequenz. Was gibt uns das? Wir nehmen die äquivalente Frequenz von 4 608 000 000 Hz / 70 300 Hz = 65 535 Schritte. Jetzt können wir die Spannung (oder den Strom) am Ausgang in Schritten von 1/65 535 = ~ 0,001% einstellen, dh 100-mal genauer!

Und jetzt machen wir es - wir haben eine Frequenz von 700 kHz, was zum Beispiel für einen Mehrphasen-Buck normal ist. F103 erhält 72.000.000 Hz / 700.000 Hz = 102 Schritte, wodurch Sie bestenfalls 1% Regelung erhalten, aber dies ist 1% für den Betrieb, dh in der Realität schwebt bei so vielen Schritten die Spannung am Ausgang, als ob sie sich stabilisiert und nicht wirklich. Während für F334 die Anzahl der Schritte ungefähr 6500 beträgt, können Sie dennoch einen sehr genauen Spannungs- oder Stromregler bauen. Wir stellen fest, dass die Auflösung (Schritt) der Arbeitszykluseinstellung viel höher / häufiger ist als bei einem herkömmlichen MK mit einem Standard-PWM-Modul im Inneren.

Einrichtung des Uhrensystems

Ich habe TrueSTUDIO in diesem Artikel als Entwicklungsumgebung verwendet, da es kostenlos ist, nicht so miserabel wie Keil oder IAR. Ja, ja, erzählen Sie mir von seinem wunderbaren Debugger , seiner plattformübergreifenden und vielleicht besten Lösung für Anfänger und nicht nur. Am Ende des Artikels befindet sich ein Archiv mit dem Projekt speziell für diese IDE. Ich werde Ihnen nicht sagen, wie Sie ein Projekt erstellen und konfigurieren. Ich hinterlasse nur einen Link zu dem Video, in dem alles im Detail gezeigt wird.

Nachdem Sie ein Projekt erstellt und die LED blinken lassen, müssen Sie das Taktsystem konfigurieren, nämlich von 8 MHz, die Frequenz auf 72 MHz erhöhen und auf den Kern anwenden und dann den Teiler anpassen, um die dem ADC zugeführte Frequenz zu verringern:

void StartInitClock (void) { RCC->CR |= RCC_CR_HSEON; // Enable HSE while (!(RCC->CR & RCC_CR_HSERDY)); FLASH->ACR |= FLASH_ACR_LATENCY_1; RCC->CFGR |= RCC_CFGR_PLLMUL9; // PLL mult x9 RCC->CFGR |= RCC_CFGR_PLLSRC; // Source HSE RCC->CFGR2 |= RCC_CFGR2_ADCPRE12_DIV10; // ADC source AHB/10 RCC->CR |= RCC_CR_PLLON; while((RCC->CR & RCC_CR_PLLRDY) == 0){} RCC->CFGR &= ~RCC_CFGR_SW; RCC->CFGR |= RCC_CFGR_SW_PLL; // Select source SYSCLK = PLL while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_1) {} // Wait PLL } 

Hier denke ich nur, dass der Abstimmungsalgorithmus wie folgt lautet: Er schaltet auf externen Quarz (HSE) um -> wir warten, wenn der Übergang abgeschlossen ist und das Bereitschaftsflag gesetzt ist -> wir senden das Signal vom Quarz an den PLL-Eingang -> wir multiplizieren 8 MHz mit 9 -> wir teilen die Frequenz durch 72 MHz durch 10 um den ADC zu takten -> PLL einschalten -> warten, bis er sich einschaltet und das Bereitschaftsflag setzen -> ein Signal von PLL an den Systembus und den Kern senden -> warten, bis der Wechsel abgeschlossen ist -> fertig.

HRPWM-Setup

Hier ist alles etwas komplizierter, weil Dieses Modul verfügt über viele Funktionen, eine Reihe von Einstellungen und einen sehr großen Dokumentationsaufwand. Dies ist jedoch ein Minus und gleichzeitig ein Plus - Sie müssen für Flexibilität bezahlen.

 RCC->CFGR3 |= RCC_CFGR3_HRTIM1SW_PLL; RCC->APB2ENR |= RCC_APB2ENR_HRTIM1EN; 

Sie müssen angeben, dass HRTIM über PLL getaktet wird. Der x2-Multiplikator ist bereits standardmäßig aktiviert. Dann schalten wir einfach die Uhr für HRTIM ein, hier ist die erste Funktion - wie wir verstehen, wird der Timer von PLL getaktet, aber wir schalten ihn für APB2 ein. Dies ist nicht ganz logisch, kann jedoch leicht in der Datei mit CMSIS oder in der Dokumentation gesucht werden.

  RCC->AHBENR |= RCC_AHBENR_GPIOAEN; GPIOA->MODER &= ~GPIO_MODER_MODER8; GPIOA->MODER |= GPIO_MODER_MODER8_1; // Alternative PP GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8; // Very high speed GPIOA->MODER &= ~GPIO_MODER_MODER9; GPIOA->MODER |= GPIO_MODER_MODER9_1; GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9; GPIOA->AFR[1] |= 0xDD; // PA8 and PA9 - AF13 

PA8 und PA9 sind der Ausgang von Timer A, der auf meinem Modul zu Kanal Nr. 1 geht, den Sie in der Abbildung und der Pinbelegung sehen können. Die Beine sind als Push-Pull mit einer alternativen Funktion konfiguriert, die Nummer der Funktion selbst für beide Beine ist die 13 .. Es ist auch wichtig, auf die maximale GPIO-Frequenz abzustimmen, da sonst die Signalfront und der Abfall unverständlich blockiert werden, was für die Leistungselektronik äußerst kritisch ist.

 HRTIM1->sCommonRegs.DLLCR |= HRTIM_DLLCR_CAL | HRTIM_DLLCR_CALEN; while ((HRTIM1->sCommonRegs.ISR & HRTIM_ISR_DLLRDY) == RESET); 

Bevor Sie beginnen, müssen Sie den Timer kalibrieren, weil Es funktioniert mit minimalen Verzögerungen und wartet dann einfach auf das Bereitschaftsflag.

 HRTIM1->sTimerxRegs[0].PERxR = PeriodTimerA; // Period for timer A HRTIM1->sTimerxRegs[0].CMP1xR = 0; // Duty for timer A 

Das ist Flexibilität. Zunächst können wir für jeden Timer A ... E unsere eigene Frequenz einstellen. Hier zeichnen wir einfach die Periode unserer PWM auf. Zweitens haben wir standardmäßig die PWM-Ausrichtung zu Beginn der Periode, dh das Signal geht zu Beginn einer neuen Periode zu log.1, und jetzt müssen wir auswählen, wann es zu log.0 zurückkehren soll, in diesem Fall durch den Komparator Nr. 1, d. H. Ich frage darin im wesentlichen den Pflichtfaktor.

Beispielsweise können Sie PWM nicht zu Beginn des Zeitraums, sondern durch Komparator Nr. 1 übersetzen und mit Komparator Nr. 2 zu log.0 zurückkehren und so die Hardware phasenverschieben.

 // Deadtime enable HRTIM1->sTimerxRegs[0].OUTxR |= HRTIM_OUTR_DTEN; // Tdtg = 6.94 ns HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTPRSC_0 | HRTIM_DTR_DTPRSC_1; // Deadtime rising = 15*Ttg = 104 ns HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTR_0 | HRTIM_DTR_DTR_1 | HRTIM_DTR_DTR_2 | HRTIM_DTR_DTR_3; // Deadtime falling = 15*Ttg = 104 ns HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTF_0 | HRTIM_DTR_DTF_1 | HRTIM_DTR_DTF_2 | HRTIM_DTR_DTF_3; HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTFSLK | HRTIM_DTR_DTRSLK; 

In dieser Phase aktivieren wir die Totzeit und konfigurieren sie. Grundsätzlich enthalten die Kommentare alle Formeln. Sie finden sie auch im Referenzhandbuch. DT mit einer Dauer von ~ 100 ns, die Sie bereits im theoretischen Kapitel dieses Artikels auf der Wellenform gesehen haben. Die Totzeit kann am Rand und am Abfall des Signals separat eingestellt werden. Übrigens ist [0] Timer A bzw. [1] Timer B und so weiter.

 // Samples in middle of ON time HRTIM1->sTimerxRegs[0].CMP2xR = PeriodTimerA / 10; // ADC trigger 1 update: Timer A HRTIM1->sCommonRegs.CR1 |= HRTIM_CR1_ADC1USRC_0; // ADC trigger 1 event: Timer A compare 2 HRTIM1->sCommonRegs.ADC1R |= HRTIM_ADC1R_AD1TAC2; 

Für mich war dies nicht der offensichtlichste Moment. Das Fazit lautet: - Ich möchte sicherstellen, dass für 10% der Dauer des Timers A-Zeitraums ein Ereignis generiert wird, das die ADC-Umwandlung auslöst und das Rückkopplungssignal misst. Warum 10%? Im Idealfall sollte die Messung zum Zeitpunkt des Übergangs der PWM von 0 nach 1 oder umgekehrt nicht erfolgen, weil In diesem Moment gibt es im Netzteil Transienten und Interferenzen, die wir jedoch nicht messen müssen. Daher sind 10% in meinem Fall optimal, weil Bei 12 V Ausgang und 30 V fällt die Eingangsspannung des Tastverhältnisses nicht auf 10% ab und der Moment des Schaltens des Transistors stimmt nicht genau mit der ADC-Messung überein.

Nun müssen Sie sich das Ereigniskommunikationssystem zwischen HRTIM und dem ADC ansehen:



In der ersten Zeile wählen wir, wann der Komparator ausgelöst wird, in meinem Fall sind es 10% der Zeitspanne von Timer A. Als nächstes wählen wir einen bestimmten Trigger im ADC aus, der den MK kontaktiert. Wir haben Zugriff auf den 1. oder 3 .. Jetzt zeigt es einfach an, welches Ereignis das Signal an den ADC sendet, in meinem Fall ist es Komparator Nr. 2.

 // Enable output PWM for TA1 and TA2 HRTIM1->sCommonRegs.OENR |= HRTIM_OENR_TA1OEN | HRTIM_OENR_TA2OEN; // Continuous mode HRTIM1->sTimerxRegs[0].TIMxCR |= HRTIM_TIMCR_CONT; // Period for master timer HRTIM1->sMasterRegs.MPER = 65000; // Enable counter for Master and timer A HRTIM1->sMasterRegs.MCR |= HRTIM_MCR_MCEN | HRTIM_MCR_TACEN; 

Und der letzte Akkord! Wir erlauben HRTIM, Signale von Timer A an unseren GPIO auszugeben. Jetzt wählen wir den Modus, es passiert endlos (ich habe es), aber es kommt vor, dass der Timer für 1 Periode eingeschaltet ist und danach erneut gestartet werden muss. Stellen Sie als Nächstes die Periode für den Master-Timer ein und schalten Sie ihn als letzten Schritt ein. Er beginnt mit dem Takten der Kanal-Timer und das PWM-Signal erscheint am Ausgang.

Es war eine Tuning-Funktion, es bleibt eine Funktion zu erstellen, die den Tastverhältnis einstellt. Mit dieser Funktion werden wir beim Erstellen des Controllers arbeiten:

 void SetDutyTimerA (uint16_t duty) { HRTIM1->sTimerxRegs[0].CMP1xR = duty; } 

Auflisten der Funktionseinstellungen und Einstellen des Arbeitszyklus
 // f = 102,4 kHz #define PeriodTimerA ((uint16_t)45000) void InitHRPWM (void) { RCC->CFGR3 |= RCC_CFGR3_HRTIM1SW_PLL; RCC->APB2ENR |= RCC_APB2ENR_HRTIM1EN; /************************************************ * Setting GPIO ***********************************************/ RCC->AHBENR |= RCC_AHBENR_GPIOAEN; // Alternative PP GPIOA->MODER &= ~GPIO_MODER_MODER8; GPIOA->MODER |= GPIO_MODER_MODER8_1; // Very high speed GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8; GPIOA->MODER &= ~GPIO_MODER_MODER9; GPIOA->MODER |= GPIO_MODER_MODER9_1; GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9; // PA8 and PA9 - AF13 GPIOA->AFR[1] |= 0xDD; /************************************************ * Setting timer A ***********************************************/ HRTIM1->sCommonRegs.DLLCR |= HRTIM_DLLCR_CAL | HRTIM_DLLCR_CALEN; while ((HRTIM1->sCommonRegs.ISR & HRTIM_ISR_DLLRDY) == RESET); // Period for timer A HRTIM1->sTimerxRegs[0].PERxR = PeriodTimerA; // Duty for timer A HRTIM1->sTimerxRegs[0].CMP1xR = 0; // Deadtime enable HRTIM1->sTimerxRegs[0].OUTxR |= HRTIM_OUTR_DTEN; // Tdtg = 6.94 ns HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTPRSC_0 | HRTIM_DTR_DTPRSC_1; // Deadtime rising = 15*Ttg = 104 ns HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTR_0 | HRTIM_DTR_DTR_1 | HRTIM_DTR_DTR_2 | HRTIM_DTR_DTR_3; // Deadtime falling = 15*Ttg = 104 ns HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTF_0 | HRTIM_DTR_DTF_1 | HRTIM_DTR_DTF_2 | HRTIM_DTR_DTF_3; HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTFSLK | HRTIM_DTR_DTRSLK; // Event forces the output to active state for TA1 HRTIM1->sTimerxRegs[0].SETx1R |= HRTIM_SET1R_PER; // Event forces the output to inactive state for TA1 HRTIM1->sTimerxRegs[0].RSTx1R |= HRTIM_RST1R_CMP1; /************************************************ * ADC trigger intialization (with CMP2 event) ************************************************/ // Samples in middle of ON time HRTIM1->sTimerxRegs[0].CMP2xR = PeriodTimerA / 10; // ADC trigger 1 update: Timer A HRTIM1->sCommonRegs.CR1 |= HRTIM_CR1_ADC1USRC_0; // ADC trigger 1 event: Timer A compare 2 HRTIM1->sCommonRegs.ADC1R |= HRTIM_ADC1R_AD1TAC2; /************************************************ * HRTIM start ***********************************************/ // Enable output PWM for TA1 and TA2 HRTIM1->sCommonRegs.OENR |= HRTIM_OENR_TA1OEN | HRTIM_OENR_TA2OEN; // Continuous mode HRTIM1->sTimerxRegs[0].TIMxCR |= HRTIM_TIMCR_CONT; // Period for master timer HRTIM1->sMasterRegs.MPER = 65000; // Enable counter for Master and timer A HRTIM1->sMasterRegs.MCR |= HRTIM_MCR_MCEN | HRTIM_MCR_TACEN; } void SetDutyTimerA (uint16_t duty) { HRTIM1->sTimerxRegs[0].CMP1xR = duty; } 


Lassen Sie uns nun herausfinden, ob wir uns auf dem richtigen Weg bewegen. Initialisieren Sie in der Hauptfunktion die HRTIM-Einstellung und stellen Sie das Tastverhältnis ein, z. B. 22500. Bei einer Eingangsspannung von 20 V und einer Periode von 45000 beträgt unser Tastverhältnis 50% und der Ausgang etwa 10 V. Dies reicht nicht aus, um die LED vollständig zu erweitern, aber sie sollte aufleuchten und wir werden verstehen, ob das Leistungsteil funktioniert, ob mit dt alles in Ordnung ist und so weiter. Ich habe alles beim ersten Mal angefangen:



Sie können sehen, dass alle vorherigen theoretischen Berechnungen bestätigt wurden. Bei einem festen Tastverhältnis von 50% wurde die Ausgangsspannung einfach durch 2: 20 V -> 10 V, 22 V -> 11 V, 18 V -> 9 V geteilt. Lassen Sie uns nun die Ausgangsspannung stabil und unabhängig vom Eingang machen, dh Feedback hinzufügen.

ADC- und Controller-Tuning

Vor mir wurde bereits viel über die ADCs in STM32 geschrieben. Ich beschäftige mich nur mit der Einrichtung des Triggers, der dem HRTIM-Komparator zugeordnet ist. Ich werde kurz auf den Rest der ADC-Einstellungen eingehen. Wir betrachten die Initialisierungsfunktion:

 void InitBasicADC (void) { RCC->AHBENR |= RCC_AHBENR_ADC12EN; RCC->AHBENR |= RCC_AHBENR_GPIOCEN; /************************************************ * Calibration ***********************************************/ ADC2->CR &= ~ADC_CR_ADVREGEN; ADC2->CR |= ADC_CR_ADVREGEN_0; // Vref enable Delay(10); ADC2->CR &= ~ADC_CR_ADCALDIF; ADC2->CR |= ADC_CR_ADCAL; // Start calibration while (ADC2->CR & ADC_CR_ADCAL); // Wait end calibration /************************************************ * Select event trigger and channel ***********************************************/ // Enable start conversion external trigger ADC2->CFGR |= ADC_CFGR_EXTEN_0; // Event 7 - HRTIM ADC2->CFGR |= ADC_CFGR_EXTSEL_0 | ADC_CFGR_EXTSEL_1 | ADC_CFGR_EXTSEL_2; // Select ADC2 channel IN5 ADC2->SQR1 |= ADC_SQR1_SQ1_0 | ADC_SQR1_SQ1_2; // Length regular ADC channel = 1 ADC2->SQR1 &= ~ADC_SQR1_L; ADC2->IER |= ADC_IER_EOCIE; // Interrupt enable NVIC_EnableIRQ(ADC1_2_IRQn); // enable interrupt ADC1 and ADC2 /************************************************ * Start ADC ***********************************************/ ADC2->CR |= ADC_CR_ADEN; // Enable ADC2 Delay(10); ADC2->CR |= ADC_CR_ADSTART; } 

Ich benutze den regulären Kanalmodus, ich habe nur einen Kanal und er ist im SQR1- Register ausgewählt. Der beteiligte ADC Nummer 2, nämlich sein Eingang IN5, ist schnell und kann mit der maximalen Abtastfrequenz betrieben werden, diesmal jedoch nicht. Die Abtastfrequenz ist gleich der PWM-Frequenz, weil 1 Periode = 1 Probe, im Prinzip ist dies mehr als genug.

Außerdem müssen wir im CFGR- Register das Ereignis auswählen, mit dem die Konvertierung beginnen soll, dh Ereignis 7 , warum genau? Wir schauen in RM:



Trigger 1 vom HRPWM-Modul kommt zu Ereignis 7 für unseren ADC Nr. 2, der in diesem Fall als Slave arbeitet, und wird dann vom HRPWM-Modul gesteuert. Ich denke, jetzt ist klar, wie man 2 Module verbindet. Im Prinzip ist der Algorithmus für jede Peripherie und jeden Timer ähnlich, nur der Registername unterscheidet sich.

Wenn der Master-Timer-Periodenzähler erreicht ist, wird eine Konvertierung gestartet, die nach etwa 15 Zyklen (wie viel genau in RM angezeigt wird) eine Unterbrechung verursacht und Sie das Ergebnis darin abrufen können. In dieser Unterbrechung organisieren wir den Steueralgorithmus. Ja, innerhalb des Interrupts ist es besser, etwas Massives nicht zu tun, es ist besser, das Flag zu setzen und die Ausführung weiterzugeben, aber ich werde mir eine solche Vereinfachung erlauben, da in diesem Fall mein Controller nicht besonders belastet ist und es schafft, den Interrupt mit einer Wahrscheinlichkeit von 146% zu berechnen und zu beenden die Entstehung eines neuen.

Ein bisschen über das Management

Stellen Sie sich vor, Sie betreten das Badezimmer und beschließen, Ihre Hände im Waschbecken zu waschen. Sie öffnen das Wasser leicht, berühren es mit der Hand, kalt? Mehr heißes Wasser hinzufügen, wärmer? Gut! Mehr heißes Wasser hinzufügen? Fast was du brauchst? Gut! Mehr heißes Wasser hinzufügen, mit der Hand versuchen, sich verbrennen? Lassen Sie uns jetzt die Hitze ein wenig leiser stellen. Okay? Und so drehen Sie den Hahn bis ins Unendliche, bis die Wassertemperatur ideal wird. Dies ist der einfachste Knopf!

Nur regeln wir nicht die Warmwassermenge, sondern den PWM-Arbeitszyklus. Anstelle einer Hand haben wir einen ADC mit einem gemessenen Ergebnis. Es bleibt nur die Logik zu implementieren. Wir berechnen, was der ADC bei 12-V-Ausgang erzeugen soll, und zwingen dann unsere Steuerung unter Verwendung der if- Bedingung, diesen Wert durch Ändern des Tastverhältnisses beizubehalten.

Lassen Sie uns zunächst einen Spannungsteiler aufhängen, um beispielsweise 12 V auf 2 bis 2,5 V zu reduzieren, weil Der ADC kann von 0 bis +3,3 V messen. Wenn 12 V zugeführt werden, brennt der Mikrocontroller einfach aus. Daher werde ich einen Teiler mit Nennwerten von 10 kOhm und 2 kOhm einsetzen, der ein Teilungsverhältnis von 6 ergibt, und dementsprechend werden unsere + 12 V zu + 2 V. Unser ADC erzeugt das Ergebnis: adcResult = (V out / k) / V ref * 2 12 = (12 V / 6) / 3,3 * 4095 = 2481. Jetzt schreiben wir den Code für den Interrupt-Handler:

 void ADC1_2_IRQHandler (void) { ADC2->ISR |= ADC_ISR_EOC; adcResult = ADC2->DR; if (adcResult > 2480) { dutyControl = dutyControl - 10; } else { dutyControl = dutyControl + 10; } SetDutyTimerA(dutyControl); } 

Zunächst müssen Sie nach dem Einstieg in den Interrupt-Handler das Flag dieses Interrupts löschen, da Sie sonst beim zweiten Mal nicht darauf zugreifen können. Dann lesen wir das Ergebnis und speichern es als adcResult- Variable. Da Sie nun die Spannung am Ausgang kennen, müssen Sie das Tastverhältnis für die PWM anpassen. Ich habe dies einfach durch die if- Bedingung implementiert. In jeder PWM-Periode nehmen wir eine Messung vor, erhöhen oder verringern den Arbeitszyklus und legen das Ergebnis für die nächste Periode fest. Alles ist einfach, schnell und die Essenz ist sichtbar. Wir betrachten das Ergebnis der Arbeit:



Wie Sie sehen können, funktioniert alles und wenn sich die Eingangsspannung ändert, bleibt der Ausgang selbst bei 12 V stabil. Sehr aufmerksam können kleine Nadeln durchrutschen, dann müssen Sie nur X7R-Keramik an den Ausgang von 1-10 Mikrofarad hängen und sie werden gehen, ich bin einfach zu faul, um danach zu suchen und es zu löten. Nun das Oszillogramm selbst, um die Augen nicht zu verwöhnen:



Hier können Sie sehen, wie die Ausgangsspannung ansteigt. Tatsache ist, dass aufgrund des Steueralgorithmus, damit die Füllung einen Wert von 0 bis 10000 erreicht, beispielsweise tausend Perioden oder etwa 10 ms benötigt werden. Es passt zu mir, weil ein sanfter Start, wenn Sie die Anstiegszeit reduzieren möchten, den Algorithmus ein wenig komplizieren und +1000, nicht +10 hinzufügen möchten. Je näher Sie den angegebenen 12 V kommen, desto weniger Regulierung tun Sie, bis Sie +10 erreichen . Im Allgemeinen können viele Dinge in Bezug auf das Management erledigt werden, sodass Sie ein Feld für Experimente haben.

Ein weiterer interessanter Punkt ist die Schwingung zum Zeitpunkt des Herunterfahrens, eine solche "Mundharmonika". Tatsache ist, dass mein digitaler Teil nach dem Ausschalten weiterhin mit einem anderen Netzteil arbeitet und versucht, den gewünschten Wert am Ausgang zu halten. Woher kommt die Energie? Ja, vom Eingangskondensator sind dies diejenigen, die 1000 Mikrofarad bereits 3 Stück sind, dies ist ein so interessantes Phänomen.

Fazit


Der Artikel war nicht klein, aber Sie wollten alles und sofort heißt es, wir machen das Stück Eisen fertig - holen Sie es. Ich hoffe, Ihnen gefällt der Artikel. Ich habe versucht, ihn nicht wissenschaftlich, sondern populärwissenschaftlich zu gestalten, damit das Material für Menschen mit unterschiedlichen Kenntnissen und Erfahrungen zugänglich ist. Vielleicht werde ich in Zukunft andere Topologien wie Boost, Full Bridge und andere ähnlich analysieren.

Dieser Artikel und Code dienen übrigens für den neuen MPPT-Controller auf 20A, den ich entwerfe. Jetzt warte ich auf PCBway-Boards , die sich freiwillig gemeldet haben, um meine Open-Source-Projekte mit Leiterplatten zu sponsern. MPPT-Quellen werden ebenso wie alle meine Module geöffnet sein.

Ich habe das Wichtigste vergessen! Behalten Sie das Projekt mit dem Code für TrueSTDIO - RAR bei .

Source: https://habr.com/ru/post/de432778/


All Articles