3-phase rectifier

The three-phase diode rectifier given below is connected to a three-phase ac voltage source. The inductor $L_d$ is large enough so that the current through it is ripple free.
  1. Plot the DC voltage ($V_{pm}$), diode current, and ac source current.
  2. What is the duration for which a diode conducts in one fundamental cycle of the input voltage?
  3. What is the average value of $V_{pm}$ and $i_R$?
  4. What is the peak-to-peak ripple voltage across $L_d$?
  5. What is the power delivered to the resistor and to the battery?
  6. Find the RMS values of the diode current and ac line current.
  7. What is the RMS value of the fundamental component of the ac line current?
  8. Compute the THD of the ac line current.
  9. Find the input power factor.
  10. Which are the dominant harmonics in the ac line current?
InĀ [1]:
from IPython.display import Image
Image(filename =r'rectifier_3ph_7_fig_1.png', width=450)
Out[1]:
No description has been provided for this image
InĀ [2]:
# run this cell to view the circuit file.
%pycat rectifier_3ph_7_orig.in

We now replace the strings such as \$R with the values of our choice by running the python script given below. It takes an existing circuit file rectifier_3ph_7_orig.in and produces a new circuit file rectifier_3ph_7.in, after replacing \$R (etc) with values of our choice.

InĀ [3]:
import gseim_calc as calc
import numpy as np

s_R = "20"
s_Vdc = "400"

VL = 400.0
A_sin = VL*np.sqrt(2/3)

s_A_sin = ("%11.4E"%(A_sin)).strip()

l = [
  ('$R', s_R),
  ('$Vdc', s_Vdc),
  ('$A_sin', s_A_sin),
]
calc.replace_strings_1("rectifier_3ph_7_orig.in", "rectifier_3ph_7.in", l)
print('rectifier_3ph_7.in is ready for execution')
rectifier_3ph_7.in is ready for execution
Execute the following cell to run GSEIM on rectifier_3ph_7.in.
InĀ [4]:
import os
import dos_unix
# uncomment for windows:
#dos_unix.d2u("rectifier_3ph_7.in")
os.system('run_gseim rectifier_3ph_7.in')
get_lib_elements: filename gseim_aux/xbe.aux
get_lib_elements: filename gseim_aux/ebe.aux
Circuit: filename = rectifier_3ph_7.in
Circuit: n_xbeu_vr = 0
Circuit: n_ebeu_nd = 8
main: i_solve = 0
ssw_allocate_1 (2): n_statevar=1
main: calling solve_trns
mat_ssw_1_e: n_statevar: 1
mat_ssw_1_e0: cct.n_ebeu: 13
Transient simulation starts...
i=0
i=1000
solve_ssw_e: ssw_iter_newton=0, rhs_ssw_norm=3.8597e+00
Transient simulation starts...
i=0
i=1000
solve_ssw_e: ssw_iter_newton=1, rhs_ssw_norm=3.0198e-14
solve_ssw_e: calling solve_ssw_1_e for one more trns step
Transient simulation starts...
i=0
i=1000
solve_ssw_1_e over (after trns step for output)
solve_ssw_e ends, slv.ssw_iter_newton=1
GSEIM: Program completed.
Out[4]:
0

The circuit file (rectifier_3ph_7.in) is created in the same directory as that used for launching Jupyter notebook. The last step (i.e., running GSEIM on rectifier_3ph_7.in) creates data files called rectifier_3ph_7_1.dat, etc. in the same directory. We can now use the python code below to compute/plot the various quantities of interest.

InĀ [5]:
import numpy as np
import matplotlib.pyplot as plt 
import gseim_calc as calc
from setsize import set_size

f_hz = 50.0
T = 1.0/f_hz

slv = calc.slv("rectifier_3ph_7.in")

i_slv = 0
i_out = 0
filename = slv.l_filename_all[i_slv][i_out]
print('filename:', filename)
u1 = np.loadtxt(filename)
t1 = u1[:, 0]

col_v_o = slv.get_index(i_slv,i_out,"v_o")
col_v_L = slv.get_index(i_slv,i_out,"v_L")
col_ID1 = slv.get_index(i_slv,i_out,"ID1")
col_ID2 = slv.get_index(i_slv,i_out,"ID2")
col_ID3 = slv.get_index(i_slv,i_out,"ID3")
col_ID4 = slv.get_index(i_slv,i_out,"ID4")
col_ID5 = slv.get_index(i_slv,i_out,"ID5")
col_ID6 = slv.get_index(i_slv,i_out,"ID6")
col_ISa = slv.get_index(i_slv,i_out,"ISa")
col_ISb = slv.get_index(i_slv,i_out,"ISb")
col_ISc = slv.get_index(i_slv,i_out,"ISc")
col_IRL = slv.get_index(i_slv,i_out,"IRL")

i_out = 1
filename = slv.l_filename_all[i_slv][i_out]
print('filename:', filename)
u2 = np.loadtxt(filename)
t2 = u2[:, 0]

col_P_RL  = slv.get_index(i_slv,i_out,"P_RL")
col_P_Vdc = slv.get_index(i_slv,i_out,"P_Vdc")
col_P_Vsa = slv.get_index(i_slv,i_out,"P_Vsa")
col_P_Vsb = slv.get_index(i_slv,i_out,"P_Vsb")
col_P_Vsc = slv.get_index(i_slv,i_out,"P_Vsc")

l_v_o   = calc.avg_rms_2(t1, u1[:,col_v_o  ], T, 2.0*T, 1.0e-5*T)
l_v_L   = calc.avg_rms_2(t1, u1[:,col_v_L  ], T, 2.0*T, 1.0e-5*T)
l_P_RL  = calc.avg_rms_2(t2, u2[:,col_P_RL ], T, 2.0*T, 1.0e-5*T)
l_P_Vsa = calc.avg_rms_2(t2, u2[:,col_P_Vsa], T, 2.0*T, 1.0e-5*T)
l_P_Vdc = calc.avg_rms_2(t2, u2[:,col_P_Vdc], T, 2.0*T, 1.0e-5*T)
l_ID1   = calc.avg_rms_2(t1, u1[:,col_ID1  ], T, 2.0*T, 1.0e-5*T)
l_ISa   = calc.avg_rms_2(t1, u1[:,col_ISa  ], T, 2.0*T, 1.0e-5*T)
l_IRL   = calc.avg_rms_2(t1, u1[:,col_IRL  ], T, 2.0*T, 1.0e-5*T)

l_VL1 = calc.min_max('rectifier_3ph_7_1.dat', 1, (col_v_L+1), 0.0, T)

print('average value of v_pm:'         , "%11.4E"%( l_v_o  [1][0]))
print('rms value of v_pm:'             , "%11.4E"%( l_v_o  [2][0]))
print('rms value of ID1:'              , "%11.4E"%( l_ID1  [2][0]))
print('rms value of ISa:'              , "%11.4E"%( l_ISa  [2][0]))
print('average value of IRL:'          , "%11.4E"%( l_IRL  [1][0]))
print('average power delivered to RL:' , "%11.4E"%( l_P_RL [1][0]))
print('average power delivered to Vdc:', "%11.4E"%(-l_P_Vdc[1][0]))
print('average power delivered by Vsa:', "%11.4E"%( l_P_Vsa[1][0]))

print('ripple voltage across L:', "%11.4E"%(l_VL1[1]-l_VL1[0]))

# get A_sin from the circuit file:
fin = open("rectifier_3ph_7.in", "r")
for line in fin:
    if 'name=Vsa' in line:
        for s in line.split():
            if s.startswith('a='):
                A_sin = float(s.split('=')[1])
fin.close()

Irms = l_ISa[2][0]
Vrms = A_sin/np.sqrt(2.0)
pf = l_P_Vsa[1][0]/(Vrms*Irms)

print('input power factor:', "%6.3f"%pf)

# time instants when the diode current crosses 1.0e-4:
l_cross_1_ID1, l_cross_2_ID1 = calc.cross_over_points_1(t1, u1[:,col_ID1], 0.0, T, 1.0e-2)
print('zero-crossing points of D1 current (positive slope):')
for tx in l_cross_1_ID1:
    print("  ", "%11.4E"%tx)
print('zero-crossing points of D1 current (negative slope):')
for tx in l_cross_2_ID1:
    print("  ", "%11.4E"%tx)
theta = (l_cross_2_ID1[0]-l_cross_1_ID1[0])*360.0/T
print('angle of conduction for D1:', "%7.2f"%theta, "degrees")

color1='red'
color2='goldenrod'
color3='blue'
color4='green'
color5='crimson'
color6='cornflowerblue'

fig, ax = plt.subplots(3, sharex=False)
plt.subplots_adjust(wspace=0, hspace=0.0)

set_size(5.5, 6, ax[0])

for i in range(3):
    ax[i].set_xlim(left=0.0, right=2.0*T*1e3)
    ax[i].grid(color='#CCCCCC', linestyle='solid', linewidth=0.5)

#ax[0].tick_params(labelbottom=False)
#ax[1].tick_params(labelbottom=False)
#ax[2].tick_params(labelbottom=False)

ax[0].plot(t1*1e3, u1[:,col_v_o], color=color4, linewidth=1.0, label="$v_{pm}$")

ax[1].plot(t1*1e3, u1[:,col_ID1], color=color1, linewidth=1.0, label="$I_{D1}$")
ax[1].plot(t1*1e3, u1[:,col_ID3], color=color2, linewidth=1.0, label="$I_{D3}$")
ax[1].plot(t1*1e3, u1[:,col_ID5], color=color3, linewidth=1.0, label="$I_{D5}$")

ax[2].plot(t1*1e3, u1[:,col_ISa], color=color1, linewidth=1.0, label="$I_{sa}$")
ax[2].plot(t1*1e3, u1[:,col_ISb], color=color2, linewidth=1.0, label="$I_{sb}$")
ax[2].plot(t1*1e3, u1[:,col_ISc], color=color3, linewidth=1.0, label="$I_{sc}$")

ax[2].set_xlabel('time (msec)', fontsize=12)

for i in range(3):
    ax[i].legend(loc = 'lower right',frameon = True, fontsize = 10, title = None,
      markerfirst = True, markerscale = 1.0, labelspacing = 0.5, columnspacing = 2.0,
      prop = {'size' : 12},)

plt.tight_layout()
plt.show()
filename: rectifier_3ph_7_1.dat
filename: rectifier_3ph_7_2.dat
average value of v_pm:  5.4019E+02
rms value of v_pm:  5.4067E+02
rms value of ID1:  4.0450E+00
rms value of ISa:  5.7205E+00
average value of IRL:  7.0095E+00
average power delivered to RL:  9.8267E+02
average power delivered to Vdc:  2.8038E+03
average power delivered by Vsa:  1.2614E+03
ripple voltage across L:  7.5767E+01
input power factor:  0.955
zero-crossing points of D1 current (positive slope):
    1.6600E-03
zero-crossing points of D1 current (negative slope):
    8.3400E-03
angle of conduction for D1:  120.24 degrees
No description has been provided for this image
InĀ [6]:
import numpy as np
import matplotlib.pyplot as plt 
import gseim_calc as calc
from setsize import set_size

f_hz = 50.0
T = 1.0/f_hz

slv = calc.slv("rectifier_3ph_7.in")

i_slv = 0
i_out = 0
filename = slv.l_filename_all[i_slv][i_out]
print('filename:', filename)
u1 = np.loadtxt(filename)
t1 = u1[:, 0]

col_v_o = slv.get_index(i_slv,i_out,"v_o")
col_v_L = slv.get_index(i_slv,i_out,"v_L")
col_ID1 = slv.get_index(i_slv,i_out,"ID1")
col_ID2 = slv.get_index(i_slv,i_out,"ID2")
col_ID3 = slv.get_index(i_slv,i_out,"ID3")
col_ID4 = slv.get_index(i_slv,i_out,"ID4")
col_ID5 = slv.get_index(i_slv,i_out,"ID5")
col_ID6 = slv.get_index(i_slv,i_out,"ID6")
col_ISa = slv.get_index(i_slv,i_out,"ISa")
col_ISb = slv.get_index(i_slv,i_out,"ISb")
col_ISc = slv.get_index(i_slv,i_out,"ISc")
col_IRL = slv.get_index(i_slv,i_out,"IRL")

# compute Fourier coeffs:

t_start = T 
t_end = 2.0*T

n_fourier = 20

coeff_ISa, thd_ISa = calc.fourier_coeff_1C(t1, u1[:,col_ISa], 
    t_start, t_end, 1.0e-8, n_fourier)

coeff_v_o, thd_v_o = calc.fourier_coeff_1C(t1, u1[:,col_v_o], 
    t_start, t_end, 1.0e-8, n_fourier)

print('THD in ac line current:', "%5.2f"%(thd_ISa*100.0), "%")
print("ac line current fundamental: RMS value: ", "%11.4E"%(coeff_ISa[1]/np.sqrt(2.0)))

x = np.linspace(0, n_fourier, n_fourier+1)

y_v_o = np.array(coeff_v_o)
y_ISa = np.array(coeff_ISa)

fig, ax = plt.subplots(2, sharex=False)
plt.subplots_adjust(wspace=0, hspace=0.0)
grid_color='#CCCCCC'

set_size(6, 4, ax[0])

delta = 5.0
x_major_ticks = np.arange(0.0, (float(n_fourier+1)), delta)
x_minor_ticks = np.arange(0.0, (float(n_fourier+1)), 1.0)

for i in range(2):
    ax[i].set_xlim(left=-1.0, right=float(n_fourier))
    ax[i].set_xticks(x_major_ticks)
    ax[i].set_xticks(x_minor_ticks, minor=True)
    ax[i].grid(visible=True, which='major', axis='x', color=grid_color, linestyle='-', zorder=0)

ax[0].set_ylabel('$V_{out}$',fontsize=14)
ax[1].set_ylabel('$i_{sa}$',fontsize=14)

bars1 = ax[0].bar(x, y_v_o, width=0.3, color='red',   label="$v_o$", zorder=3)
bars2 = ax[1].bar(x, y_ISa  , width=0.3, color='green', label="$i_{sa}$" , zorder=3)

plt.tight_layout()
plt.show()
filename: rectifier_3ph_7_1.dat
THD in ac line current: 31.12 %
ac line current fundamental: RMS value:   5.4621E+00
No description has been provided for this image

This notebook was contributed by Prof. Nakul Narayanan K, Govt. Engineering College, Thrissur. He may be contacted at nakul@gectcr.ac.in.