S: Mehrfach-PWM-Controller

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.

Reply to
Matthias Weingart
Loading thread data ...

Tilmann Reh :

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

M.

Reply to
Matthias Weingart

Matthias Weingart schrieb:

Ausg=E4nge=20

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

Tilmann

Reply to
Tilmann Reh

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.

Reply to
Matthias Weingart

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

Reply to
Stefan Brröring

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
Reply to
Gernot Fink

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

Reply to
Alex Wenger

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

Reply to
Stefan Brröring

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

Reply to
Tilmann Reh

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
Reply to
Gernot Fink

Tilmann Reh schrieb:

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

Gruß Markus

Reply to
Markus Faust

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

Reply to
Stefan

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.

Reply to
Jörg Schneide

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

Reply to
Tilmann Reh

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

Reply to
Dirk Ruth

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;

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

Reply to
Stefan

Dirk Ruth schrieb:

Ja, in diesem Fall und der aktuellen Gesamtkalkulation schon.

Vielleicht ein andermal. :-)

Tilmann

Reply to
Tilmann Reh

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

Reply to
Alex Wenger

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)
Reply to
Falk Willberg

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

Reply to
Tilmann Reh

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.