SwitcherCAD: Pulsweitenmodulation

Hallo, wie kann ich unter SwitcherCAD III mit einfachen Mitteln eine Rechteckspannung generieren die dem Ausgang einer Pulsweitenmodulation entspricht? Ich brauche diesen Spannungsverlauf, da ich mit diversen Filtern herumspielen will, damit man aus dem Rechtecksignal der PWD einen Sinus gewinnen kann. Danke. Servus Thomas

Reply to
kein_Plan
Loading thread data ...

----- Original Message ----- From: Newsgroups: de.sci.electronics Sent: Sunday, December 04, 2005 8:05 PM Subject: SwitcherCAD: Pulsweitenmodulation

Hallo Thomas, hier mal ein paar Tipps.

Ich sehe da prinzipiell zwei Möglichkeiten wobei jede Vor- und Nachteile hat.

Die digitale Methode: Man nehme einen N-Bit Binär-Zähler und einen Vergleicher. Immer wenn der Zählerstand größer dem Signal ist, dann wird eine "1" erzeugt. Das Signal muß natürlich mit int() quantisiert sein. Vorteil: prinzipiell hohe Genauigkeit Nachteil: lange Rechenzeit.

Die analoge Methode: Man erzeugt eine präzise Rampe oder Dreieck(Sym. PWM). Immer wenn das Rampensignal größer dem Signal ist, dann wird eine "1" erzeugt. Das Signal muß natürlich mit int() quantisiert sein. Vorteil: prinzipiell schneller Nachteil: Man muß mit der Rechengenauigkeit aufpassen.

Ich würde mit der analogen Methode starten.

Gruß Helmut

LTspice-Schaltung "test.asc"

Version 4 SHEET 1 1480 692 WIRE 16 528 16 496 WIRE 16 640 16 608 WIRE 32 176 32 128 WIRE 32 288 32 256 WIRE 48 -80 48 -112 WIRE 48 32 48 0 WIRE 80 128 32 128 WIRE 80 496 16 496 WIRE 96 -112 48 -112 WIRE 144 128 80 128 WIRE 448 496 80 496 WIRE 448 560 400 560 WIRE 656 -80 608 -80 WIRE 672 544 624 544 WIRE 768 -80 736 -80 WIRE 800 176 800 144 WIRE 800 288 800 256 WIRE 800 528 800 496 WIRE 800 640 800 608 WIRE 864 144 800 144 WIRE 864 496 800 496 WIRE 880 -80 848 -80 WIRE 880 -32 880 -80 WIRE 880 64 880 32 WIRE 912 -80 880 -80 FLAG 32 288 0 FLAG 80 128 ramp FLAG 864 144 pwm FLAG 800 288 0 FLAG 16 640 0 FLAG 80 496 sig0 FLAG 48 32 0 FLAG 96 -112 ctp FLAG 400 560 ctp FLAG 800 640 0 FLAG 864 496 sig2 FLAG 672 544 sig1 FLAG 880 64 0 FLAG 608 -80 pwm FLAG 912 -80 out SYMBOL voltage 32 160 R0 WINDOW 123 0 0 Left 0 WINDOW 39 0 0 Left 0 SYMATTR InstName V1 SYMATTR Value PWL(0 0 repeat forever (1n 0 {TP} {NMAX}) endrepeat) SYMBOL bv 800 160 R0 SYMATTR InstName B1 SYMATTR Value V=IF(V(ramp)>V(sig2), 1, 0) tripdt=1p SYMBOL bv 16 512 R0 SYMATTR InstName B3 SYMATTR Value V=sin(2*pi*time*FREQ)*125.001 SYMBOL SpecialFunctions\\sample 528 528 R0 SYMATTR InstName A1 SYMATTR SpiceLine Vhigh=300 Vlow=-300 SYMBOL voltage 48 -96 R0 WINDOW 123 0 0 Left 0 WINDOW 39 0 0 Left 0 SYMATTR InstName V2 SYMATTR Value PULSE(0 1 1p 1p 1p {TP/2} {TP}) SYMBOL bv 800 512 R0 SYMATTR InstName B4 SYMATTR Value V=int(V(sig1)+128) SYMBOL res 640 -64 R270 WINDOW 0 32 56 VTop 0 WINDOW 3 0 56 VBottom 0 SYMATTR InstName R1 SYMATTR Value 50 SYMBOL ind 752 -64 R270 WINDOW 0 32 56 VTop 0 WINDOW 3 5 56 VBottom 0 SYMATTR InstName L1 SYMATTR Value 10m SYMBOL cap 864 -32 R0 SYMATTR InstName C1 SYMATTR Value 10µ TEXT 48 -232 Left 0 !.tran 0 30m 20m 50n TEXT 48 -312 Left 0 !.param TP=100u TEXT 48 -280 Left 0 !.param NMAX=256 TEXT 48 -200 Left 0 !.options plotwinsize=0 TEXT 424 -328 Left 0 ;PWM Generator With Edge Enhancement(tripdt) TEXT 48 -344 Left 0 !.param FREQ=400 TEXT 832 648 Left 0 ;V=128+int(V(sig1))

Reply to
Helmut Sennewald

Spricht denn was dagegen, das mit einer gewöhnlichen "Independent Voltage Source" (Component->voltage) zu machen, indem man bei Advanced Pulse auswählt, und dort die gewünschte Periodendauer, Rise&Falltime und T_on (man muss halt selber rechnen wieviel das bei welchem Duty-Cycle ist) einträgt und die Zyklenzahl ausreichend hoch setzt? Ich denke nämlich das ist somit die einfachste Methode, und sollte auch nicht viel Rechenzeit kosten.

Gruß Thomas

Reply to
Thomas Faust

"Thomas Faust" schrieb im Newsbeitrag news:op.s0972ax50lvuul@thomas...

Hallo Thomas,

ich hatte gedacht du willst in einem Run verschiedene Pulsweiten haben damit gleich ein Sinus herauskommt. Wenn du natürlich nur eine bestimmte Pulsweite willst, dann geht natürlich eine V-source

Gruß Helmut

Reply to
Helmut Sennewald

Hallo Thomas,

Beispiel:

PULSE 0 8 0 100n 150n 2u 7u

Die Parameter der Reihe nach: untere Spannung 0V, obere 8V, Zeitverzoegerung 0sec, 100nsec Anstieg, 150nsec Abfall, Pulsbreite

2usec, Periodendauer 7usec.

Hope that helps.

Gruesse, Joerg

formatting link

Reply to
Joerg

Hallo Helmut, ich habe an dieser Stelle eine Frage, die auch in diese Richtung geht. Ich ben=F6tige ein Rechecksignal mit einer Frequenz von ca. 200Hz bis

1200Hz, bei dem die Pulsweite von 20% bis 80% verstellbar sein soll. Ich habe zwar eine PWM mit zwei NE555 (einer erzeugt den Takt, mit dem zweiten wird =FCber den Control Pin die Pulsweite verstellt) erzeugen k=F6nnen, aber leider ist hier die Frequenz fix. Au=DFerdem ist diese L=F6sung recht aufwendig.

Kann man so etwas vielleicht mit den oben genannten Ans=E4tzen l=F6sen ?

Ich habe in der Hilfe von LTspice leider keine detaillierten Infos bez=FCglich der PWL Spannungsquelle gefunden. Gleiches gilt f=FCr die "if-then" und "forever repeat" Anweisungen.

Vielen Dank

Ralf Bartling

Reply to
Ralf Bartling

Hallo Ralf,

mir ist immer noch nicht klar was du jetzt brauchst. Es ist ein himmelweiter Unterschied ob Frequenz und Pulsweite während einer Simulation konstant sind oder ob das Ganze durch eine zeitabhängige Spannung(Modulation), während dem Simulations- lauf, moduliert wird.

Schick mir deine Schaltung(.asc) und eine Beschreibung was das Ganze machen soll. Dann werfe ich mal einen Blick darauf.

Du solltest dich in der Yahoo-Group anmelden. Da findest du was du suchst.

formatting link

Files section:

Files > Tut > PWL Voltage Sources

Files > adventures with analog > Waveform_Arithmetic_&_B_sources.pdf

Gruß Helmut

Reply to
Helmut Sennewald

Hallo Helmut, hier zun=E4chst die Schaltung.

Version 4 SHEET 1 1996 680 WIRE -160 240 -160 160 WIRE -160 368 -160 320 WIRE -48 160 -160 160 WIRE 0 160 -48 160 WIRE 80 160 64 160 WIRE 128 160 80 160 WIRE 256 160 208 160 WIRE 384 160 336 160 WIRE 384 256 384 160 WIRE 384 384 384 320 WIRE 480 160 384 160 WIRE 640 160 560 160 WIRE 640 240 640 160 WIRE 640 384 640 304 WIRE 736 64 736 48 WIRE 736 160 640 160 WIRE 736 160 736 128 WIRE 736 240 736 160 WIRE 736 384 736 304 WIRE 784 160 736 160 WIRE 848 -80 848 -304 WIRE 848 48 736 48 WIRE 848 48 848 0 WIRE 848 112 848 48 WIRE 848 384 848 208 WIRE 928 48 848 48 WIRE 960 48 928 48 WIRE 960 96 960 48 WIRE 1008 96 960 96 WIRE 1104 -304 848 -304 WIRE 1104 -64 1104 -304 WIRE 1104 64 1104 16 WIRE 1120 96 1088 96 WIRE 1120 160 1120 96 WIRE 1136 64 1104 64 WIRE 1136 160 1120 160 WIRE 1168 256 1168 224 WIRE 1168 368 1168 320 WIRE 1248 224 1168 224 WIRE 1248 256 1248 224 WIRE 1248 368 1168 368 WIRE 1248 368 1248 336 WIRE 1344 160 1328 160 WIRE 1344 224 1248 224 WIRE 1344 224 1344 160 WIRE 1344 368 1248 368 WIRE 1344 368 1344 240 WIRE 1360 128 1328 128 WIRE 1360 240 1344 240 WIRE 1360 240 1360 128 WIRE 1392 128 1360 128 WIRE 1392 208 1392 128 WIRE 1392 368 1392 272 WIRE 1408 -304 1104 -304 WIRE 1408 64 1328 64 WIRE 1408 64 1408 -304 WIRE 1440 128 1392 128 WIRE 1440 208 1440 128 WIRE 1440 368 1440 288 WIRE 1584 128 1440 128 WIRE 1760 128 1696 128 WIRE 1760 128 1760 80 WIRE 1936 -304 1408 -304 WIRE 1936 80 1936 -304 WIRE 1936 368 1936 160 FLAG 384 384 0 FLAG 640 384 0 FLAG 736 384 0 FLAG 1936 368 0 FLAG 848 384 0 FLAG 1440 368 0 FLAG 1392 368 0 FLAG -48 160 u_in FLAG 928 48 u_opto FLAG 1760 80 u_out FLAG -160 368 0 FLAG 80 160 u_c SYMBOL voltage -160 224 R0 WINDOW 123 0 0 Left 0 WINDOW 39 0 0 Left 0 SYMATTR InstName V1 SYMATTR Value PULSE(0 24 0 1n 1n 600=B5 1000=B5 200) SYMBOL res 224 144 R90 WINDOW 0 0 56 VBottom 0 WINDOW 3 32 56 VTop 0 SYMATTR InstName R1 SYMATTR Value 100 SYMBOL res 352 144 R90 WINDOW 0 0 56 VBottom 0 WINDOW 3 32 56 VTop 0 SYMATTR InstName R2 SYMATTR Value 22k SYMBOL cap 368 256 R0 SYMATTR InstName C1 SYMATTR Value 47nF SYMBOL res 576 144 R90 WINDOW 0 0 56 VBottom 0 WINDOW 3 32 56 VTop 0 SYMATTR InstName R3 SYMATTR Value 10k SYMBOL npn 784 112 R0 SYMATTR InstName Q1 SYMATTR Value Qbc847bdw1t1/ON SYMBOL cap 720 240 R0 SYMATTR InstName C2 SYMATTR Value 1nF SYMBOL cap 720 64 R0 SYMATTR InstName C3 SYMATTR Value 1nF SYMBOL res 832 -96 R0 SYMATTR InstName R4 SYMATTR Value 22k SYMBOL voltage 1936 64 R0 WINDOW 123 0 0 Left 0 WINDOW 39 0 0 Left 0 SYMATTR InstName V2 SYMATTR Value 5 SYMBOL Optos\\CNY17-3 1232 128 R0 SYMATTR InstName U1 SYMBOL res 1088 -80 R0 SYMATTR InstName R5 SYMATTR Value 220 SYMBOL res 1104 80 R90 WINDOW 0 0 56 VBottom 0 WINDOW 3 32 56 VTop 0 SYMATTR InstName R6 SYMATTR Value 320 SYMBOL res 1424 192 R0 SYMATTR InstName R7 SYMATTR Value 1500 SYMBOL res 1232 240 R0 SYMATTR InstName R8 SYMATTR Value 1e6 SYMBOL cap 1152 256 R0 SYMATTR InstName C4 SYMATTR Value 1nF SYMBOL cap 1376 208 R0 SYMATTR InstName C5 SYMATTR Value 47nF SYMBOL Misc\\diode_own 656 304 R180 WINDOW 3 31 0 Left 0 WINDOW 0 24 72 Left 0 SYMATTR Value bas21slt1/ON SYMATTR InstName U2 SYMBOL 74HC\\74hc14 1632 80 R0 SYMATTR InstName U3 SYMBOL cap 64 144 R90 WINDOW 0 0 32 VBottom 0 WINDOW 3 32 32 VTop 0 SYMATTR InstName C6 SYMATTR Value 1=B5 TEXT 464 -80 Left 0 !.include on_bjt.lib\n.include on_diode.lib\n.include 74hc.lib TEXT 286 -22 Left 0 !.tran 200m

Es handelt sich dabei um eine Schaltung zum Auswerten von Drehzahlsignalen eines induktiven Gebers (gibt Rechtecksignale ab). Diesen Geber habe ich mit V1 modelliert. Leider weist der Geber einige Probleme auf, die ich gerne simulieren m=F6chte:

- Die steigende Flanke des Gebers entspricht zwar der Drehzahl, aber seine Pulsweite schwankt. Dadurch =E4ndert sich der DC-Anteil und verf=E4lscht das Signal am Ausgang (u_out)

- Bei niedrigen Drehzahlen gibt der Geber ein Signal 0/24V ab. Je h=F6her die Drehzahl wird, umso weniger wird der 0V Pegel erreicht. Bei

1kHz liegt das Signal bei 6/24V. Hier wurde m=F6glicherweise ein Pull Up Widerstand zu klein dimensioniert.

Meine Aufgabe ist es nun, mit der bestehenden Schaltung (diese ist nicht von mir entwickelt worden und kann auch nicht mehr ge=E4ndert werden) ein korrektes Signal in meinen Microcontroller zu bekommen (h=E4ngt an u_out). Dieser Controller ermittelt die Drehzahl durch Zeitmessung von einer steigenden Flanke hin zur n=E4chsten. Ich habe auch nicht verstanden, warum zwischen Basis/Collector und Basis/Emitter des BC847 Kondensatoren liegen. Die Schaltung war wohl urspr=FCnglich zum Auswerten von Wechselspannungssignalen konzipiert worden.

Nach meinem Verst=E4ndnis trennt der Kondensator C6 den DC-Anteil im Signal von u_in ab. Ich habe festgestellt, dass in der Einschwingphase, also wenn C6 sich aufl=E4dt, bereits Verf=E4lschungen am Ausgang messbar sind. Wenn sich nun die Pulsweite oder auch der 0V Level =E4ndern im Betrieb =E4ndern, so =E4ndert sich auch das Drehzahlsignal.

Ziel der Simulation ist der Vergleich von u_in und u_out mit Einfluss der oben genannten Randbedingungen.

An dieser Stelle m=F6chte ich mich nochmals f=FCr deine M=FChe bedanken. Ich werde mich weiterhin in der yahoo group umsehen.

Ralf Bartling

Reply to
Ralf Bartling

Hallo Ralf,

für die Messung der Frequenz ist das Tastverhältnis völlig unbedeutend.

Du könntest zum Beispiel einzelne Parameter schrittweise ändern. Dafür gibt es das .step command.

.step param per list 1000u 2000u 5000u 10000u .param pw=m*0.6 .param amp0=6*1000u/per

PULSE({amp0} 24 0 1n 1n {pw} {per})

Ein sinnvolles Kommando für .tran sieht dann so aus: .tran 0 100m 0 10u .options plotwinsize=0

Dann würde ich vier Plot-Panes aufmachen und einen Trace V(u_out)@1 , V(u_out)@2, V(u_out)@3, V(u_out)@4 plotten.

Die Plot-Settings kann man speichern.

Genau so könnte man auch Bauteilewerte ändern. Statt 1n schreibt man dann {CABC}

.step param CABC list 1n 4.7n 22n

Gruß Helmut

Reply to
Helmut Sennewald

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.