S: Mehrfach-PWM-Controller

Nov 18, 2009 50 Replies

Rolf Mennekes :

Uuups, ich glaub ich lag da falsch. Der hat nur 2 Timer, die PWM wird mit dem Compareregister gemacht, und das Compareregister wird (nachdem es aktiviert wurde) dann gleich wieder mit dem nächsten Zählerstand geladen. CCR+=169 oder so; eigentlich braucht man das aber gar nicht, wenn man mit der vorgegebenen Periode des 16 bit Zählers auskommt (die per Vorteiler anpassbar ist); das Software-Reload braucht man nur, wenn man da pro PWM Kanal eine abweichende Periode haben will.

M.

Tilmann Reh :

Mit ner vernünftigen Sample and Hold-Schaltung könnte man auch DAC-Ausgänge multiplexen.

M.

Matthias Weingart schrieb:

Ausg=E4nge=20

Schon klar, aber der Aufwand wird insgesamt gr=F6=DFer als gleich PWM zu erzeugen.

Tilmann

Tilmann Reh :

Jo, diskret schon, aber wenn der Controllerhersteller da einen Längsfet und einen (meist recht billigen, da nur aus 7 Tranistoren bestehenden) OpAmp mehr spendieren würde, könnte sich das auf eine einzelne zusätzliche externe Kapazität beschränken, wenn er die nicht sogar gleich intern einbaut, so 50pF sind eigentlich kein Problem und z.B. in den ADC's verbaut.

M.

Wobei man auch noch überlegen könnte, ob die geforderten 20 KHz überhaupt benötigt werden. Wenn man da auf 10KHz oder sogar 5KHz heruntergeht, passt es wieder.

Man könnte dann etwas mehr Aufwand in die Tiefpassfilter stecken, z.B. indem man einen S&H dahinterschaltet und synchron mit dem Grundtakt sampelt.

Obwohl, S&H ist teurer, als ein ATmega8, oder?

Gruß

Stefan DF9BI

Nachdem OP die 100 khz für die Treiber zu schnell sind denk ich es soll etwas per PWM digital angesteuert werden. Wenn das angesteuerte etwas elektromagnetisches ist wirds mit 5 KHZ gewaltig pfeifen. Ein XC95144Xl währe keine schlechte Wahl. Vieleicht kann das CPLD noch was nützliches nebenbei machen.

Man könnte auch über 3 Attiny45 nachdenken wenn die PWM-Phase nicht wichtig ist.

MFG Gernot

Hi,

Tilmann Reh schrieb:

doch, du musst nur die "Bits umdrehen", alle 0er Bits der 8 Kanäle kommen in Byte0, alle 1er Bits in Byte1 usw... Jetzt kann man z.b eine Interruptroutine bauen die mit 320kHz aufgerufen wird, da drin schreibt man jetzt Byte0 auf den Port wartet (ein paar NOPs) jetzt 200ns) dann schreibt man Byte1 auf den Port und wartet

400ns, dann folgt Byte2 mit 800ns und Byte3 mit 1600ns, als letztes schreibt man Byte4 raus und verlässt den Interrupt. Dieser wird dann in 3200ns wieder aufgerufen wobei man dann Byte5 rausschreibt. Jetzt wird die Interruptzeit verdoppelt und so weiter gemacht bis Byte7, dann startet das Spiel von neuem.

Voila, 20KHz/8 Kanal/8Bit PWM und sogar noch Rechenzeit übrig.

- Alex

Schon klar, trotzdem finde ich den Vorschlag von Dirk richtig gut.

Ich hätte dazu noch eine Idee, um Rechenzeit zu sparen:

Ich habe 8 Sollwerte von 0-255. Die Sollwerte >= 128 benötigen mindestens 50% Einschaltdauer. Die Sollwerte

Alex Wenger schrieb:

len.

n

nn in

Das gibt aber ein wirklich heftiges Pulsmuster an den Ausg=C3=A4ngen - zw= ar im Mittelwert richtig, aber ganz und gar nicht das, was man unter PWM versteht, und au=C3=9Ferdem mit Schaltzeiten bis herunter auf 200 ns.

Tilmann

Na ich weiß nicht recht. Das hört sich recht umständlich und Fehleranfällig an. Dann lieber sowas:

---------- interrupt: inc index gehe zu weiter wenn index!=0

8bitport=0 gehe zum ende weiter: 8bitport=8bitport oder tabelle[index] ende

---------

Im Hauptprogramm setzt du dann die Bits an der stelle der Tabelle an der der Aushang 1 werden soll. Alte Bits müssen natürlich immer gelöscht werden.

MFG Gernot

Tilmann Reh schrieb:

Falls nix gegen Atmel spricht: Schau Dir mal die ATxmega-Serie an...

Gruß Markus

Etwas umständlich.

bei mir sieht das folgendermaßen aus:

--------------------------------------- interrupt:

index = 127;

while (index) 8bitport = tabelle[index--];

8bitport = tabelle[0]; // die 8. Bits der Sollwerte

ende;

-------------------------------------------

Wichtig ist dabei nur, dass in tabelle[1] die Bits 7 der 8 Sollwerte stehen. Alles andere passiert im Hauptprogramm.

Der Trick ist, dass ich eine Auflösung von 256 Stufen entsprechend 8 Bit erreiche, aber nur 128x etwas auf den Port schreibe. Nachdem ich die Tabelle geschrieben habe, veerlasse ich die INT-Service-Routine und habe knapp 50% der Rechenzeit für andere Aufgaben übrig.

Gruß

Stefan DF9BI

Hallo,

wenn Du eh schon einen µC von Renesas in Betracht ziehst, schau Dir mal diese Appnote an:

formatting link

Ist zwar für einen M32C aber Du brauchst ja auch keine 64 PWMs ;-) vielleicht kannst Du Dir daraus ein paar Anregungen holen.

Jörg.

J=F6rg Schneide schrieb:

al diese

cap.pdf

Danke, aber es sieht derzeit nicht so aus, als ob ein Renesas (oder ein anderer =B5C mit DMA) reinkommt. Nach dem aktuellen Stand schafft es ein kleiner 8-Bitter mit etwas Zusatzlogik (CPLD/TTL), und das ist insgesamt die g=FCnstigste L=F6sung.

Ein sch=F6nes Wochenende, Tilmann

Tilmann Rehschrieb: "

Sicher?

Wie schon geschrieben, kostet ein M16C/26A ca. 5,20EUR (64k Flash/2k RAM) und hat 2 DMA Kanäle. Damit hast du praktisch zu 100% den Controller für andere Aufgaben frei. Ein Transfer kann z.B. von einem der 11 Timer ausgelößt werden, womit sich die PWM-Frequenz einstellen läßt.

Und Software ist auch schon fertig

formatting link
formatting link

Dirk

bei mir sieht das folgendermaßen aus:

Ach ja, und wenn es noch schneller werden muss:

--------------- interrupt:

8bitport = tabelle[127]; 8bitport = tabelle[126]; 8bitport = tabelle[125]; 8bitport = tabelle[124]; 8bitport = tabelle[123]; 8bitport = tabelle[122]; ... 8bitport = tabelle[1]; 8bitport = tabelle[0]; ende;

----------------------

Dirk Ruth schrieb:

Ja, in diesem Fall und der aktuellen Gesamtkalkulation schon.

Vielleicht ein andermal. :-)

Tilmann

Hi,

ja, Schaltzeiten bis zu 200ns hätte man ja auch bei PWM. Für die nachfolgende Filterung ist so ein Pulszug doch sogar vorteilhaft. Hersteller wie TI verwenden ähnlich Methoden für ihre LED PWM Bausteine.

Noch besser wird es wenn man da noch irgendwo "zufälliges" dazu mischt, dann verteilen sich die Störfrequenzen gleichmäßiger und werden entsprechend niedriger.

-Alex

Alex Wenger schrieb:

...

Wenn man Gülle auf große Flächen verteilt, wird die Scheiße/m² weniger, in der Summe stinkt es aber mehr.

Irgendwann hatte ich mal eine Beschreibung von Maxim gelesen, in der der Jitter eines Oszillators ausdrücklich als Vorteil bzgl. EMV gepriesen wurde. Ist nichts anderes, als Müllverklappung in der Nordsee.

Falk

Ich habe nicht gegen Windows. Aber wenn ich etwas hätte, würde ich nicht zögern, es einzusetzen. (Sehr frei nach W. Schmickler)

Alex Wenger schrieb:

zwar

die

Bausteine.

Das Signal soll aber nachfolgend nicht gefiltert werden, sondern geht gleich auf eine (der Last entsprechend dicke) Endstufe. Deine Methode erzeugt viel zu viele Schaltvorg=C3=A4nge. Wenn ich ein PWM mit 20 kHz w=C3=BCnsche, bedeutet das exakt zwei Schaltvorg=C3=A4nge alle 50 =C2=B5s= =2E

In den F=C3=A4llen, wo das Signal anschlie=C3=9Fend nur gefiltert werden = soll, ist der Trick sicher ganz nett (Einschr=C3=A4nkung s.u.), aber hier geht das = nicht.

iger und werden

"Zuf=C3=A4lliger" wird Dein Signal schon allein dadurch, da=C3=9F jeder w= eitere ISR-Aufruf einen Jitter ins Signal bringt. Wenn zumindest Monotonie gew=C3=A4hrleistet sein soll, darf der kumulierte Jitter aller ISR zusamm= en (!) maximal +/- 100 ns (entsprechend 0.5 LSB) betragen. Kannst Du das gew=C3=A4hrleisten?

Tilmann

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required