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