PROGRAM Series_RLC_Circuit

   LIBRARY "CMPLXLIB*", "CIRLIB*"
   DECLARE FUNCTION RLC$, CABS, CANG, REAL, IMAG
   SET MODE "LACEHIGH8"

   LET R     =  50       ! Ohms
   LET C     =  1E-6     ! Farads
   LET L     =  2E-3     ! Henrys
   LET F1    =  100      ! Hertz
   LET F2    =  100000   ! Hertz
   LET ZMIN  =  0        ! Ohms
   LET ZMAX  =  1000     ! Ohms
   LET AMIN  = -90       ! Degrees
   LET AMAX  =  90       ! Degrees
   LET Zo    =  50       ! Ohms
   LET ZPlot =  1        ! Windor number
   LET APlot =  2        ! Window number
   LET SPlot =  3        ! Window number
   
   OPEN #ZPlot : screen .55, 1, .55, 1
   CALL Generate_Log_Chart(F1, F2, ZMIN, ZMAX)
   SET COLOR "RED"
   
   OPEN #APlot : screen .55, 1, 0, .45
   CALL Generate_Log_Chart(F1, F2, AMIN, AMAX)
   SET COLOR "GREEN"
   
   OPEN #SPlot : screen 0, .5, .3, 1
   CALL Generate_Smith_Chart(Zo)
   SET COLOR "YELLOW"
 
   WINDOW #0  
   CALL Page_Title(F1, F2, ZMIN, ZMAX, AMIN, AMAX)
   
   ! Calculate and present impedance plot
   !
   WINDOW #ZPlot
   LET Freq = F1
   DO
      PLOT LOG10(Freq),CABS(RLC$(R,L,C,Freq));
      LET Freq = Freq * 1.1
   
   LOOP until Freq > F2
   
   ! Calculate and present phase angle plot
   !
   WINDOW #APlot
   LET Freq = F1
   DO
      PLOT LOG10(Freq),CANG(RLC$(R,L,C,Freq))*180/PI;
      LET Freq = Freq * 1.1
   
   LOOP until Freq > F2

   ! Calculate and present Smith plot
   !
   WINDOW #SPlot
   LET Freq = F1
   DO
      LET Result$ = RLC$(R,L,C,Freq)
      CALL SmithPlot(REAL(Result$), IMAG(Result$))
      LET Freq = Freq * 1.1
   
   LOOP until Freq > F2

   WINDOW #0
   ASK WINDOW left,right,bottom,top
   SET TEXT JUSTIFY "CENTER", "BASE"
   PLOT TEXT, AT 12/48*(right-left),3/96*(top-bottom): "R =" & Str$(R) & " L =" & Str$(L) & " C =" & Str$(C)
   
END



FUNCTION RLC$(R, L, C, F)

   LIBRARY "CMPLXLIB*"
   DECLARE FUNCTION COMP$

   LET OMEGA = 2*PI*F

   ! Return impedance as a complex number
   !
   IF F = 0 OR C = 0 THEN
      LET RLC$ = COMP$(R,-1E9)
   ELSE
      LET RLC$ = COMP$(R, OMEGA*L - 1/(OMEGA*C))
   END IF

END FUNCTION


SUB Page_Title(F1, F2, ZMIN, ZMAX, AMIN, AMAX)

    ASK WINDOW left,right,bottom,top
    SET TEXT JUSTIFY "CENTER", "BASE"

    PLOT TEXT, AT 24/48*(right-left),93/96*(top-bottom): USING$(">######",ZMAX)
    PLOT TEXT, AT 25/48*(right-left),26/48*(top-bottom): USING$("#",0)
    PLOT TEXT, AT 37/48*(right-left),92/96*(top-bottom): "IMPEDANCE"

    PLOT TEXT, AT 37/48*(right-left),40/96*(top-bottom): "PHASE ANGLE"
    PLOT TEXT, AT 25/48*(right-left),40/96*(top-bottom): "+90"
    PLOT TEXT, AT 25/48*(right-left),0/96*(top-bottom): "-90"

    PLOT TEXT, AT 12/48*(right-left),20/96*(top-bottom): "Series RLC circuit"
    PLOT TEXT, AT 12/48*(right-left),15/96*(top-bottom): "Frequency Domain Analysis"
    PLOT TEXT, AT 12/48*(right-left),10/96*(top-bottom): "in True BASIC"
    PLOT TEXT, AT 26/48*(right-left),48/96*(top-bottom): str$(F1)
    PLOT TEXT, AT 37/48*(right-left),48/96*(top-bottom): "Frequency"
    PLOT TEXT, AT 46/48*(right-left),48/96*(top-bottom): str$(F2)

END SUB

