PROGRAM Series_RLC_Circuit

  SET MODE "LACEHIGH4"
  DIM ZRect(2), ZPolar(2)

   LET R    =  50
   LET C    =  1E-6
   LET L    =  2E-3
   LET F1   =  100
   LET F2   =  100000
   LET ZMIN =  0
   LET ZMAX =  1000
   LET AMIN = -90
   LET AMAX =  90

   CALL Page_Title(F1, F2, ZMIN, ZMAX, AMIN, AMAX)
   
   OPEN #1 : SCREEN .1, .5, .15, .7
   CALL Draw_Log_Chart(F1, F2, ZMIN, ZMAX)
   SET COLOR "RED"
   
   OPEN #2 : SCREEN .58, .98, .15, .7
   CALL Draw_Log_Chart(F1, F2, AMIN, AMAX)
   SET COLOR "GREEN"
   
   ! Calculate and present impedance plot
   !
   LET Freq = F1
   DO
      CALL Calc_Series_RLC(R, L, C, Freq, ZRect, ZPolar)
   
      WINDOW #1
      PLOT log10(Freq),ZPolar(1);
   
      WINDOW #2
      PLOT log10(Freq),ZPolar(2);
   
      LET Freq = Freq * 1.1
   
   LOOP until Freq > F2

END

SUB Draw_Log_Chart(Low_Freq, High_Freq, Low_Linear, High_Linear)

    ! Simple error checking
    !
    IF Low_Freq < 0 OR High_Freq <= Low_Freq THEN EXIT SUB

    ! Scaling the screen
    !
    LET xmin = LOG10(Low_Freq)
    LET xmax = LOG10(High_Freq)
    LET ymin = Low_Linear
    LET ymax = High_Linear
    LET Delta_Linear = (High_Linear-Low_Linear)/10
    LET MaxCycle = int(LOG10(High_Freq)-LOG10(Low_Freq))
    SET WINDOW xmin, xmax, ymin, ymax

    ! Drawing horizontal lines
    !
    FOR y = ymin TO ymax STEP Delta_Linear
        PLOT xmin,y; xmax,y
    NEXT y

    ! Drawing vertical lines
    !
    FOR freq = Low_Freq TO 10*Low_Freq step Low_Freq
        FOR Cycle = 0 to MaxCycle
            LET x = LOG10(10^Cycle * freq)
            PLOT x,ymin; x,ymax
        NEXT Cycle
    NEXT freq

END SUB

SUB Calc_Series_RLC(R, L, C, F, ZRect(), ZPolar())

   OPTION ANGLE DEGREES

   ! Solve inductive reactance
   !
   LET XL = 2*PI*F*L

   ! Trap numerical overflow
   !
   IF F = 0 OR C = 0 THEN
      LET ZRect(1)  =  R
      LET ZRect(2)  = -MAXNUM
      LET ZPolar(1) =  MAXNUM
      LET ZPolar(2) = -90
      EXIT SUB
   END IF

   ! Solve capacitive reactance
   !
   LET XC = 1/(2*PI*F*C)

   ! Solve reactance
   !
   LET X  = XL - XC

   ! Solve impedance, rectangluar and polar forms
   !
   IF R >= 0 THEN
      LET ZRect(1)  = R
      LET ZRect(2)  = X
      LET ZPolar(1) = SQR(R^2 + X^2)
      IF R = 0 THEN
         IF X < 0 THEN
            LET ZPolar(2) = -90
         ELSEIF X > 0 THEN
            LET ZPolar(2) = 90
         ELSE
            LET ZPolar(2) = 0
         END IF
      ELSE
         LET ZPolar(2) = ATN(X/R)
      END IF
   ELSE
      ! We don't handle negative resistances
      LET ZRect(1) = 0
      LET ZRect(2) = 0
      LET ZPolar(1) = 0
      LET ZPolar(2) = 0
   END IF

END SUB

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

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

   PLOT TEXT, AT 1/2*(right-left),11/12*(top-bottom): "IMPEDANCE AND PHASE ANGLE VERSUS FREQUENCY"
   PLOT TEXT, AT 1/2*(right-left),21/24*(top-bottom): "FOR SERIES RLC CIRCUIT"  
   PLOT TEXT, AT 1/24*(right-left),33/48*(top-bottom): Using$("#####",ZMAX)
   PLOT TEXT, AT 13/24*(right-left),33/48*(top-bottom): Using$("###",AMAX)
   PLOT TEXT, AT 1/24*(right-left),7/48*(top-bottom): Using$("#####",ZMIN)
   PLOT TEXT, AT 13/24*(right-left),7/48*(top-bottom): Using$("+##",AMIN)
   PLOT TEXT, AT 13/24*(right-left),20/48*(top-bottom): Using$("+##",0)
   PLOT TEXT, AT 5/48*(right-left),5/48*(top-bottom): Str$(F1)
   PLOT TEXT, AT 14/48*(right-left),5/48*(top-bottom): "FREQUENCY"
   PLOT TEXT, AT 24/48*(right-left),5/48*(top-bottom): Str$(F2)
   PLOT TEXT, AT 28/48*(right-left),5/48*(top-bottom): Str$(F1)
   PLOT TEXT, AT 38/48*(right-left),5/48*(top-bottom): "FREQUENCY"
   PLOT TEXT, AT 46/48*(right-left),5/48*(top-bottom): Str$(F2)
   PLOT TEXT, AT 19/24*(right-left),9/12*(top-bottom): "PHASE ANGLE"
   PLOT TEXT, AT 7/24*(right-left),9/12*(top-bottom): "IMPEDANCE"
   
END SUB

