PROGRAM Series_RLC

   SET MODE "LACEHIGH4"

   DIM ZRectangular(2), ZPolar(2)

   LET R = 50
   LET C = 1E-6
   LET L = 2E-3
   LET F = 1000

   CALL Page_Title
   
   FOR F = 100 TO 4000 STEP 100
   
      CALL Calc_Series_RLC((R), (L), (C), (F), ZRectangular, ZPolar)
      CALL Display_Results((F), ZRectangular, ZPolar)
      IF F <> 1500 then PRINT
   
   NEXT F

END



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



SUB Display_Results(Freq, ZRect(), ZPolar())

   LET FORMAT$ = "#######  ######.######   +++++#.######  ######.######    +++#.######"
   PRINT USING FORMAT$ : Freq, ZRect(1), ZRect(2), ZPolar(1), ZPolar(2);

END SUB



SUB Page_Title

   PRINT "                     Analysis of series RLC circuit"
   PRINT "                       Impedance versus frequency"
   PRINT
   PRINT "Frequency   Resistance      Reactance      Impedance      Phase angle"
   PRINT "---------   ----------      ---------      ---------      -----------"

END SUB


