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 .2, .8, .2, .8
   
   CALL Draw_Log_Chart(F1, F2, ZMIN, ZMAX)
   
   !
   ! Calculate and present impedance plot
   !
   SET COLOR "RED"
   LET Freq = F1
   DO
      CALL Calc_Series_RLC((R), (L), (C), (Freq), ZRect, ZPolar)
      PLOT log10(Freq),ZPolar(1);
      LET Freq = Freq * 1.1
   
   LOOP until Freq > F2
   
   SET WINDOW LOG10(F1), LOG10(F2), AMIN, AMAX
   !
   ! Calculate and present impedance plot
   !
   LET Freq = F1
   SET COLOR "GREEN"
   DO
      CALL Calc_Series_RLC((R), (L), (C), (Freq), ZRect, ZPolar)
      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),22/24*(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/6*(right-left),19/24*(top-bottom): Str$(AMAX)
   PLOT TEXT, AT 5/6*(right-left),19/24*(top-bottom): Str$(ZMAX)
   PLOT TEXT, AT 1/6*(right-left),9/48*(top-bottom): Str$(AMIN)
   PLOT TEXT, AT 5/6*(right-left),9/48*(top-bottom): Str$(ZMIN)
   PLOT TEXT, AT 5/24*(right-left),3/24*(top-bottom): Str$(F1)
   PLOT TEXT, AT 1/2*(right-left),3/24*(top-bottom): "FREQUENCY"
   PLOT TEXT, AT 19/24*(right-left),3/24*(top-bottom): Str$(F2)
   PLOT TEXT, AT 3/24*(right-left),1/2*(top-bottom): "ANGLE"
   PLOT TEXT, AT 21/24*(right-left),1/2*(top-bottom): "IMPEDANCE"

END SUB

