Hallo, ich würde gerne mit dem uC eine Frequenz von 150-200kHz ausgeben, variabel, abhängig davon, wie schnell ein externer Interupt hereinkommt. Bei 20Mhz Takt hätte ich also komfortable 100 Takte (bei 200kHz) Zeit, um noch alles mögliche zwischendrin zu machen. Das ist also nicht das Problem, sondern die Auflösung. Die ist ja maximal 50ns bei 20Mhz pro Takt. Die Frage ist nun, gibt es da mit ein wenig einfacher Peripherie und ggfs. Verwendung von mehreren Pin's die Möglichkeit, dies noch feiner, sagen wir mal mit 10-20ns, zu steuern? Es geht nämlich darum, die Phase des Ausschaltens um wenige Grad Phasenlage verschieben zu können, und da sind die 50ns gerade etwas zu grob. Es kommt nicht auf die absolute Genauigkeit an, also ob der Quarz nun mit der Temperatur wandert o.ä. ist egal, da ja eh nach einem Feedback gesteuert wird. Auch gelegentliche Ungenauigkeiten wären nun nicht gar so schlimm, solange man eben im Mittel deutlich besser wie die 50ns native Auflösung wird. DDS kann ja auch nicht die Lösung sein, die Auflösung von 50ns bleibt ja die gleiche. Jemand eine Idee? PS: Jetzt wo ich das so schreibe, wäre vermutlich übertakten das einfachste. Aber ok, mal abgesehen von übertakten, was ginge noch?
Danke. Die Einstiegshürden für CPLD, FPGA sind etwas hoch (für mich). In gewisser Weise läuft das ja in Richtung bessere (=schnellere) Hardware, d.h. das wäre durch Übertakten auch abbildbar. Ausser, dass ich keinen schnelleren Quarz habe. PLL als Peripherie - uff, gerade mal das Wiki durchgelesen, auch zu hoch (für mich). Gibt's noch was primitiveres, z.B. mit RC oder flip flops, etc., was sich auch als Laie noch verstehen lässt?
>Gibt's noch was primitiveres, z.B. mit RC oder flip flops, etc., was >sich auch als Laie noch verstehen lässt? Natürlich kannst du auch ein RC Glied nachschalten, aber solange niemand weiss was du da vorhast kann man dir halt nur den Rat geben eine schnellere Hardware zu benutzen.
Übertakten bringt nichts außer Ärger. Wenn dir die 20 MHz nicht reichen, dann suche dir einen µC aus der mehr kann. zb Cortex Mx / Rx die können bis zu > 80 MHz.
OK, danke. Die Option auf bessere Hardware bleibt immer. @Holger - ok, es geht um Ansteuerung einer IGBT Halbbrücke für eine doppeltresonante Teslaspule für Zero Current Switching. Die üblichen Methoden dafür sind mir alle bekannt, daher spinne ich jetzt einmal ein wenig in Richtung uC Steuerung, weils eben auch noch für mich gerade so machbar wäre. Es gibt auch Leute, die machen das mit FGPA oder analog, darum geht es hier jetzt aber nicht. Das Ziel ist hier ein sog. phase lead, um Treiber-Delays auszugleichen und den stromführenden IGBT möglichst optimal im Zero Current Zeitpunkt auszuschalten/einzuschalten. Die Idee ist, über Int0/1 steigende/fallende Flanke eines CT Feedback-signals (also eine Halbperiode) zu messen, über einen simplen Zähler, und die Ein-/Ausschaltzeitpunkte davon abzuleiten. Diese werden dann jeweils um diesen Phase Lead korrigiert, um die man die IGBTs vorzeitig mit einem Abschaltsignal versorgen möchte. Da 1000A Primärstrom (gepulst, ca. 300us, dann 20ms Pause) durchaus denkbar sind bei solchen Teilen, ist es eben anstrebenswert, diesen Nullpunkt möglichst genau zu erwischen. Ein Zeitfehler von 50ns, wie o.a. bedeuten schon ein Schalten von 60A, daher der Wunsch nach einem kleineren Zeitinkrement. Grüsse
>Da 1000A Primärstrom.... >o.a. bedeuten schon ein Schalten von 60A, Wen interessieren schon 6%;)
die Piccolo Mikrocontroller von TI können PWM mit ca. 0.15ns Auflösung erzeugen. Deutlich besser als deren Takt von ca. 60MHz.
Hallo Zeitinkrement, da fällt mir ein Verfahren aus der Zeit der Schwarz-Weiß-Drucker ein: http://de.wikipedia.org/wiki/Dithering_(Bildbearbeitung) Das Prinzip funktioniert doch auch bei eindimensionalen Problemstellungen. Natürlich bleibt die Grundauflösung von 50ns weiterhin bestehen, aber durch Dithering kannst Du die Auflösung über einen längeren Zeitraum scheinbar erhöhen. Du könntest intern einen Software-Zähler mit der erforderlichen hohen Genauigkeit benutzen. Parallel dazu läuft der ungenauere HW-Timer. Nach jedem Timer-Durchlauf berechnest Du den aktuellen Fehler des HW-Timers gegenüber dem SW-Timer. Danach paßt Du den Startwert des HW-Timers entsprechend an. Es wird natürlich Jitter der ausgegebenen Frequenz entstehen. Viele Grüße Zausel
@holger: Diese 6% bedeuten aber hard switching und üble spikes. Da kommen ja noch reverse recovery Effekte und sonstiges, was ich gar nicht aussprechen kann, dazu. Die IGBT's werden ja (gepulst) enorm überlastet. Das machen sie offensichtlich auch mit, solange man sie eben sorgfältig von hard switching entlastet. @Beat: OK, aber lässt sich diese PWM dann auch von Periode zu Periode in der Frequenz fein regulieren (also mit einem Feedbacksignal getriggert)?
Oszillo=Zeitinkrement, übrigens. @Zausel - ja, genauso einen Ansatz hatte ich gesucht. Nur wird er so nicht funktionieren können, da ich ja keinen Timer benutzen kann (der wäre ja sehr viel gröber), sondern direkt den Takt des uC benutze. Nur so kommt man ja auf die 50ns. Ich hatte (bei der genannten einfachen Peripherie) eher an so was gedacht: z.B. 3 Pins, über jeweils einen R an einem gemeinsamen kleinen pF. Dahinter ein Schmitt-Trigger IC. Wenn nach 50ns 3 Pins gleichzeitig eingeschaltet werden, lädt der C am schnellsten, wenn nur 1 Pin eingeschaltet, am langsamsten. Wenn der RC so klein ist, dass er in 50ns aufgeladen werden kann, hab ich mein kleineres Zeitinkrement. Zum Entladen ditto. Dazwischen ist ja wieder massig Zeit, wie gesagt mindestens 100 Takte. Hmm, hab ich mir gerade selbst eine Antwort gegeben - kann das funktionieren?
>Hmm, hab ich mir gerade selbst eine Antwort gegeben - kann das >funktionieren? Nein. >ich würde gerne mit dem uC eine Frequenz von 150-200kHz ausgeben, >variabel, abhängig davon, wie schnell ein externer Interupt hereinkommt. > >Bei 20Mhz Takt hätte ich also komfortable 100 Takte (bei 200kHz) Zeit, >um noch alles mögliche zwischendrin zu machen. Dein Interrupt wird nicht nach 50ns ausgeführt. Der letzte Befehl vor dem Interrupt wird noch komplett ausgeführt. Der kann dann 1,2,3,4,5.. Takte lang sein. Dann evtl. noch ein paar Register auf dem Stack retten weil du zwischendrin ja auch noch was machen willst. Wird also nix mit der schlappen Hardware.
@holger: Im gegebenen Fall macht er aber nur ein i+=1; if i=upper_threshold then Portpin=an;i=0; if i=lower_treshold then portpin=aus; oder so ähnlich, in einer Schleife. Ich vermute mal, dass er da nicht viel register-Rettung machen muss, d.h. deterministisch. Er muss ja nicht alle 50ns ein-aus, sondern nur alle 2.5us, ich kann also einfach die erwartete Zeit für den Interrupt von den Thresholds abziehen. Oder? (Danke für die Beteiligung, hilft mir, das zu entwickeln!).
>@holger: >Ich vermute mal, dass er da nicht viel register-Rettung machen muss, >d.h. deterministisch. Er muss ja nicht alle 50ns ein-aus, sondern nur >alle 2.5us, ich kann also einfach die erwartete Zeit für den Interrupt >von den Thresholds abziehen. Dazu müsstest du aber voreilend wissen wann dein Interrupt kommt. Das wird so nix. Dein uC kann nicht raten.
Uff, ich kann grad nicht mehr denken,vielleicht hast Du recht. Morgen ueberlege ich das noch mal weiter oder probiere es einfach mal mit Funktionsgenerator und Evalboard. Danke erstmal!
das problem an deinen optimierungswünschen ist, dass du enorme probleme mit parasitären effekte bekommst, sei es der IGBT oder die treiberstufe... die paar ns machen da quasi rein garnichts mehr aus. statt zu messe kannst du aber einfach den IGBT als zustandsmodell beschreiben und mit prediktoren arbeiten um zukünftigen zustände zu schätzen und so den IGBT optimal zu steuern, bedarf einiges an theorie dahinter und leistungsfähiger hardware ;) damit triffst du die zeit punkte jedoch relativ genau, auch wenn es dir nicht wirklich all zu viel bringen wird
Verstehe ich jetzt nicht. Parasitaere Effekte haben ja jetzt erst mal nichts mit dem phase lead zu tun, den ich brauche. Der phase lead ist ja nur durch delay des treibers und der Halbbruecke determiniert und grob konstant. Ich muss also nur die Phasenlage des Ausgabesignals in einem festen Verhaeltnis zum feedbacksignal (sprich Interrupt) einstellen und die Frequenz nach jeder Zeitmessung anpassen. Beispiel: Startfrequenz Halbbruecke 200kHz - alle 5us kommt ein interrupt beim Nulldurchgang, steigende Flanke. Dazwischen zaehle ich eine var hoch, d.h. Bei 20Mhz uC clock messe ich 100. Diese div 2 schreibe ich in ein Timer compare register. Fehlt nour noch ein Phasenversatz zum ausgleich des Treiberdelays, der kommt bei jedem Interrupt als fester offset, z.b. 10, in den Timer counter. D.h. Nach 40 weiteren Takten kommt der Timer overflow, dann schalte ich die Igbts um, und durch den delay des treibers lande ich im zero switsching point.
Also, was ich bisher an Informationen aus Deinen Texten herausfischen konnte, halte ich für dermassen blödsinnig, daß ich behaupte, nicht verstanden zu haben, was Du genau möchtest. =) Wie wäre es mal mit einem Zeitdiagramm, in dem Du zeigst, welche Signale Du hast, welchse Signale Du haben möchtest und welche Zeiten geregelt werden sollen ... Zeitinkrement schrieb: > DDS kann ja auch nicht die Lösung sein, die Auflösung von 50ns bleibt ja > die gleiche. Naja, direkt ist DDS für Rechtecksignale aufgrund des Jitters nicht so optimal. Aber bei Sinussignalen kann nach einer Filterung, die Phase in Bruchteilen der Auflösung verändert werden. Danach kann man aus dem Sinus auch wieder ein Rechteck machen. (So soll man es auch machen) Gruß Jobst
>@Beat: OK, aber lässt sich diese PWM dann auch von Periode zu Periode in >der Frequenz fein regulieren (also mit einem Feedbacksignal getriggert)? Die Periodendauer kann beim ePWM Modul vom Piccolo u.ä. nur in CPU Clock Cycles eingestellt werden. Nur das Compareregister hat die high resolution extension. Das sollte aber ausreichen, da ja nur die 300 µs genau stimmen müssen und nicht die 20 ms. Selbstverständlich kann man das Compareregister incl. der high resolution extension in jeder Periode anders einstellen, ein Feedback ist also möglich. Grüße, Peter
Hallo - erstmal danke für die Antworten, trotz Verständigungsschwierigkeiten, vermutlich durch meine mangelnden Erklärungen. Daher jetzt noch ein paar Bilder und Dateien: 1) Ein Bild des Aufbaus (nicht die Nase rümpfen, bin Hobbyist, wie er momentan ist (ohne uC) 2) Eine Simulation in LTSpice (für den, den's interessiert. Man beachte, wie schön sauber da die Spannungsverläufe auf der Bridge sind - da ist eben keine Verzögerung im Feedback zum Schalten der IGBTs. 3) So sieht die Spannung auf meiner Halbbrücke in Wirklichkeit aus, üble Überschwinger 4) So das Gate Signal - daran liegt es nicht OK - nochmal zu Bild 1: nicht sichtbar ist ein Schwingkreis in Serie - also bei Resonanz fast ein Kurzschluss. Die Primärspule koppelt an eine Sekundärspule an, mit gleicher Resonanzfrequenz. Siehe Spannung an Sekundärspule in der Simu. Der CT misst den Strom, geht an die Logik, die bereitet das Signal auf und schickt das mit kleinem Delay an den Treiber. Der schickt es mit kleinem Delay an die IGBT's und die sind (für 200kHz) auch nicht gerade die schnellsten. Die Halbbrücke schaltet also immer verspätet - nicht im Nulldurchgang, was gewünscht wäre, um wirklich soft zu schalten. Da die Last ja ein Schwingkreis in Serie ist, fliessen enorme Ströme im Primärkreis. Das heisst, selbst kleine Verspätungen sorgen schon für Schalten erheblicher Ströme, und damit heftiger Spannungspeaks und Schaltverluste. Damit die IGBTs das aushalten, werden sie durch eine Interruptorschaltung nur 300us angeschaltet (mit 200kHz) und dann wieder 20ms aus zum abkühlen. So, zurück zum Thema: Diese Verzögerung will ich mit einem uC kompensieren. Man muss also 'vorhersehen', wann der Nulldurchgang des Primärstroms zu erwarten ist, und ein Steuersignal vorzeitig, vor dem Nulldurchgang und Signalwechsel vom Current Transformer, an die Halbbrücke senden. Das ist jetzt nicht so unmöglich, wie es sich anhört - der Strom im Primärkreis ist ein Sinus (Schwingkreis), und dieses Vorschalten (phase lead) ist ja in einem stabilen Verhältnis zum Feedbacksignal. Die Resonanzfrequenz ändert sich übrigens, z.B. mit steigender Spannung der Sekundärspule, oder bei Funkenbildung, auch das wäre per Feedbacksignal zu messen und nachzuführen. Wer jetzt meinen mag, das ist alles quatsch - ne, mit analogen Schaltungen kann man diesen Phase Lead und das vorzeitige Schalten ganz gut hinbekommen. Das ganze müsste eben aber auch digital gehen, mit dem Reiz, dass man da alles schön numerisch einstellen kann. Wer meint, dass die Spannungsspitzen in Bild 3 mit meinem Layout zu tun haben - nun gut, vielleicht auch, aber so schlecht ist das gar nicht. Peter, den Piccolo hab ich mir mal angesehen - schönes Teil. Aber: die Schaltperiode ist 5us (200kz), nicht 300us, das ist die An-Zeit! Jobst, die DDS Variante mit dem Sinus + Komparator hab ich auch schon gelesen, darüber hab ich hier schonmal rumgesponnen: http://4hv.org/e107_plugins/forum/forum_viewtopic.php?123724. Nun ja, vielleicht ist ja noch jemand nach all dem Text da und möchte auf die ursprüngliche Fragestellung eingehen.
Okay. Zusammenfassung: Du möchtest den Schaltzeitpunkt der IGBTs, deren Ansteuerung verzögert erfolgt, mit dem Nulldurchgang des Feedbacks des Trafos syncronisieren ...!? Dann benötigst Du noch die Information, was die IGBTs gerade tatsächlich tun, damit Du die Differenz zwischen SOLL und IST hast. Zeitinkrement schrieb: > die Schaltperiode ist 5us (200kz), nicht 300us, das ist die An-Zeit! Du meinst 300ns ...? Du möchtest also alle 2,5µs für 300ns wechselweise die IGBTs einschalten. Die 300ns sind fest? Die 2,5µs sollen vom FB eingestellt werden? Was möchtest Du da noch ... Zeitinkrement schrieb: > dass man da alles schön numerisch einstellen kann. Ich würde mit einem 4046 und einem Teiler ein symetrisches Rechteck erzeugen. Hieraus würde ich mittels Impulsabtrennung (C-R-Glied) wechselweise die Impulse für die IGBTs erzeugen. Die beiden Signale (SOLL und IST) gehen in den 4046 - der macht den Rest. Einen uC würde ich bei dem Vorhaben aussen vor lassen ... Gruß Jobst
Hallo Jobst, also erstmal danke, dass Du Dir die Mühe machst da immer noch durchzusteigen. Freut mich. >>Du möchtest den Schaltzeitpunkt der IGBTs, deren Ansteuerung verzögert >>erfolgt, mit dem Nulldurchgang des Feedbacks des Trafos syncronisieren >>...!? Ja. D.h. ich muss aus der Situation der letzten Periode errechnen, wie viel vor dem Nulldurchgang ich die IGBT's an und und ausschalten muss, damit sie wirklich möglichst genau zum Nulldurchgang auf- bzw. zu machen. >>Dann benötigst Du noch die Information, was die IGBTs gerade tatsächlich >>tun, damit Du die Differenz zwischen SOLL und IST hast. Jein. Ich brauche die Info, wie sie sich beim letzten Mal verhalten haben, damit ich daraus ableiten kann, wie sie sich beim nächsten Mal (bei der nächsten Periode) verhalten, um dann entsprechend vorzusteuern. Zeitinkrement schrieb: >> > die Schaltperiode ist 5us (200kz), nicht 300us, das ist die An-Zeit! >>Du meinst 300ns ...? Nein. Die 300us sind die Zeit, die ich diese Schaltung max. auf 200kHz (bzw. auf Resonanz) schwingen lasse, bevor ich sie wieder für 20ms ausschalte. Der Grund ist schlicht, dass sie sonst durchbrennen. Das verwirrt jetzt mehr, als es nützt - eigentlich ist diese Info für das Vorhaben eher nebensächlich. Also nochmal, die Frequenz, mit der die Halbbrücke beaufschlagt ist, ist ca. 200kHz, eben die Resonanzfrequenz. D.h. 5us Periode, 2.5us halbe Periode. Die IGBTs schalten also alle 2.5us an und dann wieder aus. >>Du möchtest also alle 2,5µs für 300ns wechselweise die IGBTs >>einschalten. Nein - alle 2,5us für 2.5us an bzw. aus >>Die 300ns sind fest? >>Die 2,5µs sollen vom FB eingestellt werden? >>Was möchtest Du da noch ... Den Delay der Treiberschaltung und IGBTs ausgleichen, sprich, die Frequenz aus dem letzten Verlauf via Interrupts von der CT schaltung berechnen, anpassen, und die IGBT's um den Delay der Treiberschaltung verfrüht einschalten. Bedenke, der Schwingkreis, denn ich oben erwähnte, schwingt ja weiter (gedämpft)und liefert weiter feedback, die Brücke pumpt ja nur mehr Energie rein, um letztendlich sekundär zu einem Funkenausbruch zu kommen. Zeitinkrement schrieb: > dass man da alles schön numerisch einstellen kann. >>Ich würde mit einem 4046 und einem Teiler ein symetrisches Rechteck >>erzeugen. Hieraus würde ich mittels Impulsabtrennung (C-R-Glied) >>wechselweise die Impulse für die IGBTs erzeugen. >Die beiden Signale (SOLL und IST) gehen in den 4046 - der macht den >Rest. Genau das Prinzip - prinzipiell kann man genau den gleichen Vorgang mit PLL machen. Hab ich auch schon. Hier ein Link zur Schaltung. http://scopeboy.com/tesla/dw-isstc/p2/dw2.html Allerdings ist das eben nicht mehr neu (und funktioniert bei gepulstem Betrieb auch nicht mehr so stabil). >>Einen uC würde ich bei dem Vorhaben aussen vor lassen ... Genau darauf kapriziere ich mich aber, weils eben noch keiner gemacht hat. Ich seh ja langsam ein, dass eben ein 8bit atmega das bei 20MHz vielleicht nicht schafft, aber prinzipiell müsste es möglich sein. Validieren kann man damit zumindest mal. Hier gibt es tatsächlich ein Video zu dem Vorgang, welchen ich erreichen möchte (ganz interessant): http://www.youtube.com/watch?v=6FdGIMlxJDc Allerdings macht der Kollege das analog (er schaltet eine Induktivität parallel zum CT, um den Phase lead zu erhalten, was Nachteile hat). So, jetzt müssten wir uns der Sache langsam nähern, wenn Du noch durchhälst :-).
Eine Frage noch: Wenn die Schaltung wieder für 300µs in Betrieb geht, schwingt der Trafo dann noch vom vorherigen Mal? Und: Dir kommt es also vor allem darauf an, die Resonanzfrequenz sehr genau zu treffen, das FB-Signal ist nur Mittel zum Zweck ..? Gruß Jobst
Hallo, nein, nach der Auszeit (ca. 20ms) ist die Schwingung im Schwingkreis dann schon abgeklungen. Der erste Einschaltimpuls sorgt aber für einen Impuls, der dann via CT wieder rückkoppelt und die Schwingung wieder in Gang setzt. Der CT ist nur ein Mittel, die Schwingung galvanisch getrennt und niederohmig (damit störunempfindlich) abzugreifen - das könnte auch sonstwas sein. Die Resonanzfrequenz möglichst zu treffen ist wichtig (durch das feedback regelt sich das ja ein), war aber nicht so sehr das Thema des Threads. Hier ging es mir eher darum, die Halbbrücke möglichst genau zum Nulldurchgang des Stroms zu schalten (Zero Current Switching). Um dies zu erreichen, muss ich eben mit Vorlauf ausschalten. Für alle, die hier Inverter im Sinn haben - das ist hier etwas anderes. Die Primär-/Sekundärkombinaton ist auch kein Trafo - die Kopplung ist hier nur ca. k=0.2.
Zeitinkrement schrieb: > war aber nicht so sehr das Thema des Threads. Du mußt den Leuten aber schon erlauben, zu verstehen, was Du vor hast, damit sie Lösungen oder Ideen dazu haben. Ich halte die Idee, solche Regelungen mit zeitdiskreten Systemen zu machen, jedenfalls nicht für sonderlich gut. Gruß Jobst
>Die Periodendauer kann beim ePWM Modul vom Piccolo u.ä. nur in CPU Clock >Cycles eingestellt werden. Nur das Compareregister hat die high >resolution extension. Die neuen Piccolos können jetzt auch die Periodendauer so fein einstellen !
Jobst, klar - das war ja auch nur eine Klarstellung, keine Kritik. Verglichen mit anderen habe ich ja schon einiges an Input geschrieben, inzwischen. Die Gefahr ist eben auch, dass das drumherum an Info gelegentlich auch verwirrt und ablenkt. Beat - diese Piccolos werd ich mir mal ernsthaft anschauen. Du meinst die TMS320F2806x-Serie, richtig? Die scheinen ja schon enorm leistungsfähig und wenn ich es richtig sehe, mit 39$ für einen ControlStick auch günstig. Allerdings fürchte ich, dass ich die Einarbeitung zeitlich nicht schaffe. Das ist ja alles Bastelei nebenher, die nichts mit meinem Job zu tun hat. Ich zieh mir mal das Datenblatt rein. Grüsse
Hier noch ein letzter Versuch, den Sinn dieses kaputterklärten Threads nochmal klarzumachen. Im Bild sieht man eine Messung des Ausgangs-Stroms der Halbbrücke. Man erkennt an dem Gezackel, wann die Halbbrücke schaltet - nämlich zu spät, nach dem Nulldurchgang. Die 200mV Anzeige entsprechen übrigens 20Ampere. Wenn es gelänge, mit Hilfe eines uC dieses Schalten vorzuschieben, wie oben erklärt, dann hätte man saubereres Schalten.
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.