PROGRAM Series_RLC_Circuit

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

   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
   
   CALL Construct_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), -90, 90
   !
   ! Calculate and present angle plot
   !
   SET COLOR "GREEN"
   LET Freq = F1
   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 Construct_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

   ! 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

   LET OMEGA = 2*PI*F

   ! Solve inductive reactance
   !
   LET XL = OMEGA*L

   ! Solve capacitive reactance
   !
   LET XC = 1/(OMEGA*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

