Forum: Mikrocontroller und Digitale Elektronik AVR als 3Phasen Oszillator


von Robert T. (tillule)


Lesenswert?

Servus miteinander,
für einen 3-phasigen DCDC (BuckBoost) benötige ich:
a) drei um 120Grad verschobenes Sync-Signale (DCDC reagiert auf die 
steigende Flanke, 200kHz <= F <= 700kHz)
b) drei PWM-Signale:
   wenn möglich synchronisiert mit dem jeweiligen Sync-Signal aus a)
   On-Time mindestens 6 Sync-Pulse aus a)

Angedacht ist derzeit ein Mega2560 (F=16MHz), der den gewünschten 
3Phasen-Oszillator nebenbei wuppen soll.
"Nebenbei" bei F=700kHz => wenig bis keine Software-Auslastung.

______________________________________________________________________

Vorhaben war bisher:

Timer1 (16bit) generiert die drei 120Grad-Phasen auf OC1A,B,C
      _
OC1A | |__________________
             _
OC1B _______| |___________
                    _
OC1C ______________| |____

Die 3 Phasen dann verodert auf den Eingang (external Clk-Source) von 
Timer3 und auf diesem dann 3 PWMs generieren mit leicht verschobenen 
OCR-Registern (3 Ticks pro Cicle, da 3 Eingangspulse => OCR1C = OCR1B+1 
= OCR1A+2)

Hardwareverodern per 3xD und 1xR:

OC1A --------|
OC1B -----|  |
OC1C --|  |  |
       V  V  V
       -  -  -
       |  |  |
       o--o--o--- T3
          |
         .-.
         | |
         | |
         '-'
          |
         GND

Das erste Problem stellt die Realisierung der OnTime der 3 
120Grad-Phasen dar.
Wenn ich verodern möchte, muss OC1A low sein bevor OC1B schaltet und an 
der Stelle komme ich hardwarenah nicht mehr auf.

Einzige, aber nicht schöne Lösung, die mir einfällt:
T1 im CTC-Mode mit ICR als Reload-Register OCR1A,B,C setzen OC1A,B,C auf 
high bei Compare, parallel IRQ ausführen und die Pins directemente 
wieder auf low setzen. Da die alternative Port Funktion per Timer-Init 
aktiviert ist, ist noch fraglich, ob/wie ich den Pin zurücksetzen kann.
Alternative: OC1A,B,C nicht low2high bei Compare sondern toggeln und 
dann per IRQ die Compareregister temporär für ein Zurücktoggeln 
anpassen.

Bei der gewünschten maximalen Frequenzen ist ein Software-IRQ nicht so 
prima.
Die erste Variante (wenn sie denn umsetzbar wäre) bedeutet bereits:
an IRQ-Adresse und zurückspringen
Pin schreiben
Die Alternative ist noch um einiges übler.

Bei 16MHz und 3 Phasen a 0.7Mhz bleibt nicht viel Luft: weniger als 8 
uC-Cicles pro Compare-Event
Wenn in diesen 5-7 Cicles hin und hergesprungen und ein Port geschrieben 
werden muss, ist der uC in Voll- oder Über-Last.


Also ........
habt Ihr eine Idee?

Das Layout der Controller-Platine ist in Mache, sodass noch Komponenten 
hinzugefügt werden können.
Ein LTC6902 http://cds.linear.com/docs/en/datasheet/6902f.pdf würde das 
Problem zB. lösen, wunder mich aber ein wenig, dass es die Paripherie 
des Mega2560 nicht hergeben soll. Vielleicht geht's ja doch einfacher 
wie zB. externer Counter (Logik-Baustein)

PS: ich weiß, dass ich die 700kHz mit dem uC nicht genau erreiche - wäre 
nicht schlimm, auf 650kHz runter zu müssen, wollte die DCDC-Stufen 
jedoch nicht komplett wegen einer Behinderung seitens des Controller 
beschneiden.

Danke fürs Drüberschaun
Robert

von Jens (Gast)


Lesenswert?

Hallo,

ich würde dir einen MOS4017 empfehlen. Der kann das gleiche machen wie 
der LTC.
Einfach den Reset des Bausteins so beschalten, dass er nur bis drei 
zählt.
Dann aus deinem Controller den Takt mit der dreifachen Frequenz erzeugen 
und die Pulsweite auf 50% setzten.
Dann läuft das von selber und du hast damit gar nichts mehr zu tun.

Gruß, jens

von Pandur S. (jetztnicht)


Lesenswert?

Ein Mega 2560 kann das nicht von Hause aus, denn er hat die Timer nicht, 
und auch nicht mit der passenden funktionaltaet.

Ich wuerd's mit einem zusaetzlichen CPLD (schon gemacht) oder mit einem 
PIC, der zB 6 Zaehler, mit jeweils Phasenverschiebung, und allen schon 
drinhat, machen. Der koennt dann auch waehrend den Pulsen die Strome auf 
den 3 Phasen ueberwachen. Alles in Hardware. Hab ich geplant aber noch 
nicht gemacht.

Einen genauen Typ muesst ich nachschauen.

von Mitlesa (Gast)


Lesenswert?

Robert T. schrieb:
> Das Layout der Controller-Platine ist in Mache, sodass noch Komponenten
> hinzugefügt werden können.

Wenn du noch in der Entwicklungsphase schon an der Kotzgrenze bist
dann wird es nicht klappen. Bei solchen Frequenzen auf die Leistung
eines AVRs zu Vertrauen ist schon gewagt.

Ein CPLDchen mit der richtigen Taktfrequenz ein paar Countern
wirkt da Wunder ....

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Don Lancaster hat im CMOS Kochbuch eine Schaltung, die mit einem 
Oszillator und einem einzigen CD4018 auskommt. Wimre muss der Oszillator 
6 mal so schnell laufen wie die gewünschte Ausgangsfrequenz.

: Bearbeitet durch User
von Pandur S. (jetztnicht)


Lesenswert?

Bei der Dimensionierung sollte man beachten dass sich die Frequenzen 
addieren. Deswegen sind 700kHz viel zu hoch. Eine gute PWM Frequenz ist 
zB 64kHz, die erziehlt man mit 16MHz div 256, dh man hat bei 64kHz 8 bit 
an Pulslaengen Aufloesung. Und die effektive Frequenz, die der 
gemeinsame Kondenser sieht waere dann bei 192kHz.

: Bearbeitet durch User
von Jens (Gast)


Lesenswert?

Darum geht es doch gar nicht.
Es wird doch oben beschrieben, dass die 700kHz sein müssen. 650kHz wären 
ok aber da sind doch deine 64kHz total daneben.
Und er will ja nicht die Auflösung sondern nur die 3 phasenversetzten 
Sync-Signale. Mit welcher Auflösung man die erreicht ist doch egal. Nur 
die Steigenden Flanken müssen stabil sein. Und die einfachste Lösung ist 
da der Zählerbaustein 4017.

von Robert T. (tillule)


Lesenswert?

Ist ein guter Einwand von Oder Doch.
Tatsächlich ist 200kHz die untere Grenzfrequenz, die der gewählte 
DCDC-Kontroller anbietet. 
(http://cds.linear.com/docs/en/datasheet/3790fa.pdf)
Ich bin was Schaltwandler-Layout angeht wenig erfahren, aber dass sich 
die Frequenzen bei parallelen, phasenverschobenen DCDC-Stufen 
zusammenaddieren ist mir bewußt - weniger bekannt ist mir die 
Frequenzbelastbarkeit des Ausgangs-Elkos (OS-CON SVPF) - ein 
angenommener Wert liegt bei 1MHz.
3x700kHz = 2.1MHz > 1MHz.
Nun ist aber auch vorstellbar, auf den Ausgangs-Elko zu verzichten und 
nur mit KerKos zu arbeiten; dann wäre die Frequenz-Grenze durch den Elko 
nicht mehr gegeben.

Ich freue mich über Aufklärung aus dem Bereich der Analogtechnik, wollte 
mir das Rumexperimetieren aber nicht durch das Controller-Board 
verbauen, daher gerne noch die 700kHz ermöglichen.
Wenn mans rein über Hardware und uC-Peripherie realisiert, sind die 
3x700kHz ja eigentlich auch kein Problem.
3x333kHz macht der Elko nach meinem Glaubensbekenntnis noch mit, was das 
Controller-Problem nicht bös ändert. Sind dann 16 uC-Takte von Phase zu 
Phase und da will man auch keine Software für am Laufen haben.

@CPLD .... hmm, nur wenn´s muss. Hab hier nur Hausfrauen-Werkzeug zuhaus 
(USBASP-Programmer). Ich hab mal ein Layout (Piezo-Reibmotor-Controller) 
mit einem C51 gemacht und dann für die Signalaufbereitung ein CPLD als 
Logik-Grab danebengesetzt.
Glaub ein JTAG-Programmer mußte damals angeschaft werden.

@PIC: wäre eine neue Welt für mich - will mich nicht aktiv den PICs 
verschließen, aber ähnlich dem CPLD: viel Aufwand bei den gegebenen 
Voraussetzungen, sodass ich dann eher auf die Synchronlauf des PWM zum 
Sync-Signal verzichten würde und das kann ich mit dem Mega ohne 
zusatzbeschaltung hardwareseitig realisieren.

Ich hatte gehofft, nur zu blöde zu sein, die Macht des AVR-Timers zu 
erkennen. Die Antworten gehen dahin, dass die relative Ohnmacht aber 
gesetzt ist.
Auswege wären daher:
- CPLD's
- höherfrequentigen uC oder eigenen uC für die Aufgabe spendieren
- Decadenzähler: - hab bisher nur flüchtig draufgeschaut, aber wenn 
ich's richtig verstanden habe, soll der die 3 Pulse zählen und dann ein 
Signal generieren. Sollte das gemeint sein, dann fehlte die Eigenschaft: 
PWM-Signal synchron mit Sync-Signal.

Eigentlich stört ja nur die Tatsache, dass die 3 Phasen nicht in ihrer 
ON-Time veränderlich sind - wenn man nun Flanke in Puls einstellbarer 
Länge wandeln können, wäre der Käse gelutscht.
Vielleicht so ebbes: Beitrag "Flanke in Impuls" ??

Nochmal zur Anwendung (Analogtechnik)
Dimming Control
There are two methods to control the current source for dimming using 
the LT3790. One method uses the CTRL pin to adjust the current regulated 
in the output. A second method uses the PWM pin to modulate the current 
source between zero and full current to achieve a precisely programmed 
average current. To make PWM dimming more accurate, the switch demand 
current is stored on the VC node during the quiescent phase when PWM is 
low. This feature minimizes recovery time when the PWM signal goes
high. To further improve the recovery time a disconnect switch may be 
used in the output current path to prevent the ISP node from discharging 
during the PWM signal low phase. The minimum PWM on- or off-time is 
affected by choice of operating frequency and external component 
selection. The best overall combination of PWM and analog dimming 
capabilities is available if the minimum PWM pulse is at least six 
switching cycles and the PWM pulse is synchronized to the SYNC signal.

^^der Text sagt: wär fein wenn's synchron wäre, sagt aber nicht wie 
unfein es asynchron wird

: Bearbeitet durch User
von Robert T. (tillule)


Lesenswert?

Hab mir das DB zum CD4017B derweil was genauer angeschaut und glaube den 
Clou verstanden zu haben:
Ich generiere per uC ein Clk-Signal mit 6facher Systemfrequenz, nehme 
jeden 2. Output für eine Phase um keine Überlagerung der High-Zustände 
zu erhalten und dann für den 2. Timer gut verundend das phasensynchrone 
PWM erzeugen zu können.
Für das Clk-Signal brauche ich dann ja nur ein toggling Output und kann 
einen 8bit-Timer nutzen :)

Frage zum Reset:
Wenn ich den Chip soweit richtig verstanden habe, interessieren mich der 
"Clock inhibit"- und der "Carry Output"-Pin nicht.
Das genaue Timing ist noch von Interesse bzgl. Reset-Pin:
- der Counter setzt den nächsten Ausgang bei der low2high Flanke der 
Clock
- mit low2high des Reset-Pins wird Output0 high und zwar bis zur 
nächsten low2high Flanke der Clock nachdem Reset nicht mehr high ist.

Letzter Zusammenhang ist eine Annahme, das DB lässts vermuten und wer 
den Logik-Schaltplan des Chips versteht, kennt den zusammenhang vllt 
auch genauer.
Nehmen wir an ich setze Phase1 auf Out1, Phase2 auf Out3 und Phase3 auf 
Out5. Reset verbinde ich dann mit Out6, sodass Out6 Out0 auslöst 
(gleicher Takt). Liegt dann ausreichen lange High-Pegel am Reset an oder 
löscht der sich zu schnell selbst, sodass vllt Dummfug passiert? 
Braucht's an der Stelle noch ein RC-Glied?

Verzeiht die deppigen Fragen, bin arg dumm, was Logik-Bausteine angeht

: Bearbeitet durch User
von Jens (Gast)


Lesenswert?

Hallo,

genau so ist es gemeint.
Ob das von deiner Signallänge passt weiß ich jetzt auch nicht aus dem 
Stehgreif. Aber dieser Baustein ist ja schon alt. Wenn man mal Google 
bemüht findet man sicher eine Schaltung die nur bis drei oder vier 
zählt. Meiner Meinung nach gibt es da App Notes die das beschreiben. 
Einfach mal schauen. Ich denke du brauchst kein RC-Glied. Die Pulslänge 
von deinem Takt ist länger als das was der Chip braucht zum umschalten.

Man könnte auch mal eine Simulation machen. In TINA von TI ist der 
Baustein auf jeden Fall mit dabei.

Oder man baut das auf Lochraster mal schnell auf. Der 4017 kostet ja 
nichts. Dann weißt du bescheid und kannst sogar eine Aussage über die 
Signalqualität machen.

6-fache Frequenz brauchst du auch nicht. Ich denke mit der 3-fachen 
kommst du aus. Die Signale sind nicht überlagert in der High Phase. Da 
wird zwar keine Totzeit eingehalten aber es soll auch nur ein 
Synch-Impuls erzeugt werden. Ich denke da ist das unkritisch. Die 
6-fache Frequenz von 700kHz wird schon recht hoch. Damit wird der Atmel 
Probleme haben. Die maximale Timerfrequenz die du einstellen kannst sind 
glaube ich 8MHz bei 16Mhz Takt. Du brauchst aber 4,2Mhz. Diesen Wert 
kannst du dann praktisch nicht einstellen da die Werte so klein werden, 
dass hier dann doch das Argument der Auflösung des Timers greift. Das 
musst du am Besten testen.

Ich bin gespannt für was du dich entscheidest.

Grüße, Jens

von Robert (Gast)


Lesenswert?

>Oder man baut das auf Lochraster mal schnell auf. Der 4017 kostet ja nichts.
Hildesheim, der Bauchnabel Europas ... könnte über Ebay bestellen :p

>In TINA von TI ist der Baustein auf jeden Fall mit dabei.
Ah ja - war bisher LTSpice-only-Benutzer. War anzunehmen, dass die Welt 
noch größer ist. Wird jeder Hersteller seine eigenen Bauteile 
unterstützen.

@jeden 2. Output (0-5) oder jeden Output (0-2):
Eigentlich wollte ich zeitgleiche High-Pegel vermeiden, um die 3 Signale 
verodert in den Eingang des nächsten PWM-generierenden Timers (Timer3).
der soll dann zum Sync-Signal synchron ein PWM-Signal generieren:
                  _      _      _      _      _      _      
SYNC_A ____| |____| |____| |____| |____| |____| |____| |____| |____
            _______________________________________
PWM_A  ____|                                         |_____________

                     _      _      _      _      _      _      
SYNC_B _______| |____| |____| |____| |____| |____| |____| |____| |_
               _______________________________________
PWM_B  _______|                                         |__________

                        _      _      _      _      _      
SYNC_C __________| |____| |____| |____| |____| |____| |____| |____|
                  _______________________________________
PWM_C  __________|                                         |_______

Damit ich das veroderte Signal in den Timer-Eingang stopfen kann, 
brauche ich bissl Off-Time - daher jedes 2.
Der uC muss nur bissl Messen/Stellen und Display bedienen und das in 
relativ grobmotorischen Zeitfenstern. Könnte auch mit 8MHz betaktet 
werden, um 4MHz zu generieren, sollte das hübscher sein.

Wie weit das PWM nach Durchlauf der Timer-Engine verzögert ist bleibt 
spannend (Flanke Eingang zu Flanke Ausgang) - sollte ich wohl erstmal 
mit einem Bsp-Code messen.

Wenn böse Delays entstehen, ist die Variante mit dem synchron-PWM eh 
gestorben. In dem Fall braucht's dann auch keine Sync-Signale mit 
verkürzter On-Time und der Counter wird überflüssig.

Die Familiensituation ist gerade nicht so experimentierfreundlich ... 
Frau recht schwanger und ab 1.3. ein neuer Arbeitgeber bei mir; will 
sagen, dass das Rumexperimentieren dauern könnte. Hatte gehofft, das PCB 
gestern abschicken zu können, damit man in 2 Monaten damit zaubern kann.

Alla - wie auch immer der Hase läuft, der 4017 bleibt im Speicher als 
zweckentfremdeter On-Time-Verkürzer.
Danke dafür :)


Wie weit das

von Robert T. (tillule)


Lesenswert?

So ... hab derweil ein wenig rumgetestet und den Plan, das PWM mit dem 
SYNC-Signal zu synchronisieren über den Haufen geworfen.
Der AVR stellt einem da nicht nur 1-2 Beine; geht Hinten und Vorne nicht 
auf => CPLD wäre Pflicht (bzw. ein uC, dessen Timer-Verkettung sowas 
ermöglicht)
Nichts desto trotz vielen lieben Dank für den Schubser auf den CD4017B - 
hab's Gefühl, den wird man irgendwann nochmal einsetzen.

Daaankööö,
Robert

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Nimm einen XMEGA, zum Besipiel einen A3U, dessen Timer sind extrem 
flexibel und verkettbar über das Event System. Wenn man sich mit AVRs 
schon auskennt, ist dies die naheliegenste Möglichkeit.

von Robert T. (tillule)


Lesenswert?

Hab mir derweil den XMega ein wenig angeschaut und denke, dass der Stein 
die Mühe wert ist.
Zudem wollte ich beim Mega die Taktfrequenz nicht unnötig herabsetzen 
und daher auf 5V bleiben. Da ich aber ein 3V Touch-Display ansteuern 
möchte, muss ich beim Mega relativ viele Spannungsteiler reinschrauben, 
was beim XMega wegfällt.

Nun will ich nicht erst ein Eval-Board kaufen und dann das Layout 
machen, sodass ich 2 Annahmen von Euch bestätigt haben möchte, bevor ich 
layoute:

- ADC und DAC sind gleichzeitig auf einem Port nutzbar!
ADC0-7 sind zB auf PA0-7
DACA0 auf PA2 und DACA1 auf PA3
ADC8-15 auf PB0-7
DACB0 auf PB2 und DACB1 auf PB3
Wenn ich die 4DAC-Kanäle nutzen möchte, bleiben mir (16-4=) 12 
ADC-Kanäle übrig

- Für oben beschriebenes Timing-Anliegen könnte ich  auf einem TC0 
OC0A-OC0D nutzen und dadurch Pins toggeln, bei jedem CompareMatch zudem 
ein internes Event erzeugen, das jeweils einen TC1 hochzählt und so an 4 
verschiedenen OC1A das PWM für die jeweilige Phase synchron zu dieser 
erzeugen!

Bsp.:
TCC0:
=>Phase1-Sync-Signal auf PC0 (OC0A)
=>Phase2-Sync-Signal auf PC1 (OC0B)
=>Phase3-Sync-Signal auf PC2 (OC0C)
=>Phase4-Sync-Signal auf PC3 (OC0D)

OC0A => TCC1 zählt eins hoch (über internes Eventsystem)
=> PWM synchron zu Phase1-Sync-Signal auf PC4 (OC1A)
OC0B => TCD1 zählt eins hoch (über internes Eventsystem)
=> PWM synchron zu Phase2-Sync-Signal auf PD4 (OC1A)
OC0C => TCE1 zählt eins hoch (über internes Eventsystem)
=> PWM synchron zu Phase3-Sync-Signal auf PE4 (OC1A)
OC0D => TCF1 zählt eins hoch (über internes Eventsystem)
=> PWM synchron zu Phase4-Sync-Signal auf PF4 (OC1A)

Und mir bleiben 3 untouched 16-bit-Timer für sonstigen Schnickschnack

Sind die beiden gekennzeichneten Annahmen richtig? Wenn dem so ist, kann 
ich mit dem Layout loslegen.

Danke fürs Drüberschaun
Robert

PS: Meinen USBASP kann ich umflashen und mit geringem Schaltungsaufwand 
in einen PDI-Flasher verwandeln.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.