Analog Circuits

Discharging capacitor

Shows how to connect to a switch with anchors.

../_images/analog_1_0.svg
d = schemdraw.Drawing()
V1 = d.add(elm.SourceV(label='5V'))
d.add(elm.Line(d='right', l=d.unit*.75))
S1 = d.add(elm.SwitchSpdt2(d='up', action='close', anchor='b', rgtlabel='$t=0$'))
d.add(elm.Line(d='right', xy=S1.c,  l=d.unit*.75))
d.add(elm.Resistor(d='down', label='$100\Omega$', botlabel=['+','$v_o$','-']))
d.add(elm.Line(to=V1.start))
d.add(elm.Capacitor(xy=S1.a, d='down', toy=V1.start, label='1$\mu$F'))
d.add(elm.Dot())
d.draw()

Capacitor Network

Shows how to use endpoints to specify exact start and end placement.

../_images/analog_2_0.svg
d = schemdraw.Drawing(fontsize=12)
A  = d.add(elm.Dot(label='a'))
C1 = d.add(elm.Capacitor(label='8nF'))
C2 = d.add(elm.Capacitor(label='18nF'))
C3 = d.add(elm.Capacitor(botlabel='8nF', d='down'))
C4 = d.add(elm.Capacitor(botlabel='32nF', d='left'))
C5 = d.add(elm.Capacitor(botlabel='40nF'))
B  = d.add(elm.Dot(label='b'))
C6 = d.add(elm.Capacitor(label='2.8nF', endpts=[C1.end,C5.start]))
C7 = d.add(elm.Capacitor(endpts=[C2.end,C5.start]))
C7.add_label('5.6nF', loc='center', ofst=[-.3,-.1], align=('right','bottom'))
d.draw()

ECE201-Style Circuit

This example demonstrate use of push() and pop() and using the ‘tox’ and ‘toy’ keywords.

../_images/analog_3_0.svg
d = schemdraw.Drawing(unit=2)  # unit=2 makes elements have shorter than normal leads
d.push()
R1 = d.add(elm.Resistor(d='down', label='20$\Omega$'))
V1 = d.add(elm.SourceV(d='down', reverse=True, label='120V'))
d.add(elm.Line(d='right', l=3))
d.add(elm.Dot())
d.pop()
d.add(elm.Line(d='right', l=3))
d.add(elm.Dot())
d.add(elm.SourceV(d='down', label='60V', reverse=True))
d.add(elm.Resistor(label='5$\Omega$'))
d.add(elm.DOT())
d.add(elm.Line(d='right', l=3))
d.add(elm.SourceI(d='up', label='36A'))
d.add(elm.Resistor(label='10$\Omega$'))
d.add(elm.DOT())
d.add(elm.Line(d='left', l=3, move_cur=False))
d.add(elm.Line(d='right', l=3))
d.add(elm.DOT())
R6 = d.add(elm.Resistor(d='down', toy=V1.end, label='6$\Omega$'))
d.add(elm.DOT())
d.add(elm.Line(d='left', l=3, move_cur=False))
d.add(elm.Resistor(d='right', xy=R6.start, label='1.6$\Omega$'))
d.add(elm.Dot(label='a'))
d.add(elm.Line(d='right', xy=R6.end))
d.add(elm.Dot(label='b'))
d.draw()

Loop Currents

Using the Drawing.loopI() method to add loop currents, and rotating a label to make it fit.

../_images/analog_4_0.svg
d = schemdraw.Drawing(unit=5)
V1 = d.add(elm.SourceV(label='$20V$'))
R1 = d.add(elm.Resistor(d='right', label='400$\Omega$'))
d.add(elm.Dot())
d.push()
R2 = d.add(elm.Resistor(d='down', botlabel='100$\Omega$', lblrotate=True))
d.add(elm.Dot())
d.pop()
L1 = d.add(elm.Line())
I1 = d.add(elm.SourceI(d='down', botlabel='1A'))
L2 = d.add(elm.Line(d='left', tox=V1.start))
d.loopI([R1,R2,L2,V1], '$I_1$', pad=1.25)
d.loopI([R1,I1,L2,R2], '$I_2$', pad=1.25)  # Use R1 as top element for both so they get the same height
d.draw()

AC Loop Analysis

Another good problem for ECE students…

../_images/analog_5_0.svg
d = schemdraw.Drawing()
I1 = d.add(elm.SourceI(label=r'$5\angle 0^{\circ}$A'))
d.add(elm.Dot())
d.push()
d.add(elm.Capacitor('right', label=r'$-j3\Omega$'))
d.add(elm.Dot())
d.push()
d.add(elm.Inductor('down', label=r'$j2\Omega$'))
d.add(elm.Dot())
d.pop()
d.add(elm.Resistor('right', label=r'$5\Omega$'))
d.add(elm.Dot())
V1 = d.add(elm.SourceV('down', reverse=True, botlabel=r'$5\angle -90^{\circ}$V'))
d.add(elm.Line('left', tox=I1.start))
d.pop()
d.add(elm.Line('up', l=d.unit*.8))
L1 = d.add(elm.Inductor('right', label=r'$j3\Omega$', tox=V1.start))
d.add(elm.Line('down', l=d.unit*.8))
l = d.labelI(L1, '$i_g$', top=False)
d.draw()

Infinite Transmission Line

Elements can be added inside for-loops if you need multiples. The ellipsis is just another circuit element, called DotDotDot since Ellipsis is a reserved keyword in Python. This also demonstrates the schemdraw.elements.ElementDrawing class to merge multiple elements into a single definition.

../_images/analog_6_0.svg
d1 = schemdraw.Drawing()
d1.add(elm.Resistor())
d1.push()
d1.add(elm.Capacitor('down'))
d1.add(elm.Line('left'))
d1.pop()

d2 = schemdraw.Drawing()
for i in range(3):
    d2.add(elm.ElementDrawing(d1))

d2.push()
d2.add(elm.Line(l=d2.unit/6))
d2.add(elm.DotDotDot)
d2.add(elm.ElementDrawing(d1))
d2.pop()
d2.here = [d2.here[0], d2.here[1]-d2.unit]
d2.add(elm.Line('right', l=d2.unit/6))
d2.add(elm.DotDotDot)
d2.draw()

Power supply

Notice the diodes added with the theta parameter to point them in the right directions. Also the use of newline characters inside resistor and capacitor labels.

../_images/analog_7_0.svg
d = schemdraw.Drawing(inches_per_unit=.5, unit=3)
D1 = d.add(elm.Diode(theta=-45))
d.add(elm.Dot)
D2 = d.add(elm.Diode(theta=225, reverse=True))
d.add(elm.Dot)
D3 = d.add(elm.Diode(theta=135, reverse=True))
d.add(elm.Dot)
D4 = d.add(elm.Diode(theta=45))
d.add(elm.Dot)

d.add(elm.Line('left', xy=D3.end, l=d.unit/2))
d.add(elm.Dot(open=True))
G = d.add(elm.Gap('up', toy=D1.start, label=['–', 'AC IN', '+']))
d.add(elm.Line('left', xy=D4.end, tox=G.start))
d.add(elm.Dot(open=True))

top = d.add(elm.Line('right', xy=D2.end, l=d.unit*3))
Q2 = d.add(elm.BjtNpn('up', circle=True, anchor='collector', label='Q2\n2n3055'))
d.add(elm.Line('down', xy=Q2.base, l=d.unit/2))
Q2b = d.add(elm.Dot)
d.add(elm.Line('left', l=d.unit/3))
Q1 = d.add(elm.BjtNpn('up', circle=True, anchor='emitter', label='Q1\n    2n3054'))
d.add(elm.Line('up', xy=Q1.collector, toy=top.center))
d.add(elm.Dot)

d.add(elm.Line('down', xy=Q1.base, l=d.unit/2))
d.add(elm.Dot)
d.add(elm.Zener('down', reverse=True, botlabel='D2\n500mA'))
d.add(elm.Dot)
G = d.add(elm.Ground())
d.add(elm.Line('left'))
d.add(elm.Dot)
d.add(elm.Capacitor('up', polar=True, botlabel='C2\n100$\mu$F\n50V', reverse=True))
d.add(elm.Dot)
d.push()
d.add(elm.Line('right'))
d.pop()
d.add(elm.Resistor('up', toy=top.end, botlabel='R1\n2.2K\n50V'))
d.add(elm.Dot)

d.here = [d.here[0]-d.unit, d.here[1]]
d.add(elm.Dot)
d.add(elm.Capacitor('down', polar=True, toy=G.start, label='C1\n 1000$\mu$F\n50V', flip=True))
d.add(elm.Dot)
d.add(elm.Line('left', xy=G.start, tox=D4.start))
d.add(elm.Line('up', toy=D4.start))

d.add(elm.Resistor('right', xy=Q2b.center, label='R2', botlabel='56$\Omega$ 1W'))
d.add(elm.Dot())
d.push()
d.add(elm.Line('up', toy=top.start))
d.add(elm.Dot())
d.add(elm.Line('left', tox=Q2.emitter))
d.pop()
d.add(elm.Capacitor('down', polar=True, toy=G.start, botlabel='C3\n470$\mu$F\n50V'))
d.add(elm.Dot)
d.add(elm.Line('left', tox=G.start, move_cur=False))
d.add(elm.Line('right'))
d.add(elm.Dot)
d.add(elm.Resistor('up', toy=top.center, botlabel='R3\n10K\n1W'))
d.add(elm.Dot)
d.add(elm.Line('left', move_cur=False))
d.add(elm.Line('right'))
d.add(elm.Dot(open=True))
d.add(elm.Gap('down', toy=G.start, label=['+', '$V_{out}$', '–']))
d.add(elm.Dot(open=True))
d.add(elm.Line('left'))
d.draw()