ここでは,プッシュプル出力段の設計に役立つRのプログラムを紹介します.
1 Ip.pp.comp <-
2 function (p, Ebb, Eg0, Eg.step, Eg.max=0)
3 {
4 # プッシュプル出力段の合成プレート特性
5 # @param p 真空管パラメータ
6 # @param Ebb プレート供給電圧
7 # @param Eg0 グリッドバイアス電圧
8 # @param Eg.step グリッド電圧のきざみ
9 # @param Eg.max 最大グリッド電圧
10 # @return
11 # $Ep1 V1のプレート電圧
12 # $Eg1 V1のグリッド電圧
13 # $Ip1 V1のプレート電流
14 # $Ep2 V2のプレート電圧
15 # $Eg2 V2のグリッド電圧
16 # $Ip2 V2のプレート電流
17 # $Egc 合成プレート特性のV1のグリッド電圧
18 # $Ipc 合成プレート電流
19
20 Ep1 <- seq(0, 2*Ebb, by=2) # V1のプレート電圧
21 Eg1 <- seq(Eg.max, by=-Eg.step, len=ceiling(2*(Eg.max-Eg0)/Eg.step)+1)
22 # V1のグリッド電圧
23 # 最大グリッド電圧からステップごとに負の最大励振まで
24 Ip1 <- touter(Ip, p, Ep1, Eg1) # V1のプレート電流
25 Ep2 <- 2*Ebb - Ep1
26 Eg2 <- rev(Eg1)
27 Ip2 <- -touter(Ip, p, Ep2, Eg2)
28
29 x <- c(seq(Eg0, 2*Eg0-Eg.max, by=-Eg.step), 2*Eg0-Eg.max)
30 Egc <- unique(c(-rev(x-Eg0)+Eg0, x))
31 Ipc <- touter(Ip, p, Ep1, Egc) - touter(Ip, p, Ep2, rev(Egc))
32 list(Ep1=Ep1, Eg1=Eg1, Ip1=Ip1, Ep2=Ep2, Eg2=Eg2, Ip2=Ip2, Egc=Egc, Ipc=Ipc)
33 }
1 Ipp.pp.comp <-
2 function (p, Ebb, Eg0, Eg.step, Eg2=Ebb, rUL=0)
3 {
4 # プッシュプル出力段の合成プレート特性
5 # @param p 真空管パラメータ
6 # @param Ebb プレート供給電圧
7 # @param Eg0 グリッドバイアス電圧
8 # @param Eg.step グリッド電圧のきざみ
9 # @param rUL UL巻線タップ比率
10 # @return
11 # $Ep1 V1のプレート電圧
12 # $Eg1 V1のグリッド電圧
13 # $Ip1 V1のプレート電流
14 # $Ep2 V1のプレート電圧
15 # $Eg2 V2のグリッド電圧
16 # $Ip2 V2のプレート電流
17 # $Egc 合成特性を求める際のV1のグリッド電圧
18 # $Ipc 合成プレート電流
19
20 Ep1 <- seq(0, 2*Ebb, by=2)
21 Eg11 <- seq(0, by=-Eg.step, len=ceiling(-2*Eg0/Eg.step)+1)
22 Eg21 <- Eg2 + (Ep1-Ebb) * rUL
23 Ip1 <- touter(Ipp, p, Ep1, Eg11, Eg21)
24
25 Ep2 <- 2*Ebb - Ep1
26 Eg12 <- rev(Eg11)
27 Eg22 <- Eg2 + (Ep2-Ebb) * rUL
28 Ip2 <- -touter(Ipp, p, Ep2, Eg12, Eg22)
29 x <- c(seq(Eg0, 2*Eg0, by=-Eg.step), 2*Eg0)
30 Egc <- unique(c(-rev(x-Eg0)+Eg0, x))
31 Ipc <- touter(Ipp, p, Ep1, Egc, Eg21) +
32 touter(Ig2, p, Ep1, Egc, Eg21)*rUL -
33 touter(Ipp, p, Ep2, rev(Egc), Eg22) -
34 touter(Ig2, p, Ep2, rev(Egc), Eg22)*rUL
35 list(Ep1=Ep1, Eg1=Eg11, Ip1=Ip1, Ep2=Ep2, Eg2=Eg12, Ip2=Ip2,
36 Egc=Egc, Ipc=Ipc)
37 }
多極管の場合は, rUL を指定することで,UL接続の合成特性も求めることができます.
1 g.plate.pp <-
2 function(Ip, Ipmax, drawEg=TRUE, col=c("red", "darkgreen", "orange"),
3 xname="Ep", yname="Ip", zname="Eg", ...)
4 {
5 # 合成プレート特性のグラフを描く
6 # @param Ip Ip.pp.comp, Ipp.pp.comp で作成したプレート電流などが入ったリスト
7 # @param Ipmax y軸の最大値
8 # @param drawEg グリッド電圧を表示するかどうか
9 # @param col グラフの色
10 # @param xname x軸の名前(単位は V, kV で自動的に付加)
11 # @param yname y軸の名前(単位は mA, A で自動的に付加)
12 # @param zname グリッド電圧の名前(単位は V で自動的に付加)
13 # @param ... matplot に渡す追加のパラメータ
14
15 # 各真空管単独のプレート特性を描く
16 xlim <- range(Ip$Ep1)
17 ylim <- c(-Ipmax, Ipmax)
18 xat1 <- pretty(xlim, 8)
19 xlab1 <- eunit1(xat1, "V")
20 xat2 <- pretty(range(Ip$Ep2), 8)
21 xlab2 <- eunit1(xat2, "V")
22 ylab <- eunit1(pretty(ylim), "A")
23 matplot(Ip$Ep1, Ip$Ip1, type="l",
24 col=col[1], lty=1, ylim=ylim, lwd=0.4,
25 xaxs="i", yaxs="i",
26 xaxt="n", yaxt="n",
27 xlab=paste0(xname, "2 ", xlab2$unit),
28 ylab=paste(yname, ylab$unit), ...)
29 matlines(Ip$Ep1, Ip$Ip2, col=col[1], lty=1, lwd=0.4, ...)
30
31 # 合成プレート特性を描く
32 matlines(Ip$Ep1, Ip$Ipc, col=col[2], lty=1, ...)
33
34 axis(1, at=max(Ip$Ep2)-xlab2$at, lab=xlab2$lab)
35 axis(2, at=ylab$at, lab=ylab$lab)
36 axis(2, lab=FALSE, tck=1, lty=2, lwd=0.3)
37 axis(3, at=xlab1$at, lab=xlab1$lab)
38 axis(3, lab=FALSE, tck=1, lty=2, lwd=0.3)
39 mtext(paste0(xname, "1 ", xlab1$unit), line=3)
40
41 # Eg を書く
42 maxi <- apply(Ip$Ipc, 2, function(i) {
43 i[i > Ipmax] <- NA
44 max(seq(along=i)[is.finite(i)])
45 })
46 x <- pmin(Ip$Ep1[maxi], max(Ip$Ep1) * 0.99)
47 y <- pmin(Ip$Ipc[cbind(maxi, 1:ncol(Ip$Ipc))], Ipmax * 0.97)
48 lab <- format(round(Ip$Egc, 1))
49 lab[1] <- paste0(zname, "1=", lab[1], "V")
50 text(x, y, lab, adj=1)
51
52 mini <- apply(Ip$Ipc, 2, function(i) {
53 i[i < -Ipmax] <- NA
54 min(seq(along=i)[is.finite(i)])
55 })
56 x <- pmax(Ip$Ep1[mini], max(Ip$Ep1) * 0.01)
57 y <- pmax(Ip$Ipc[cbind(mini, 1:ncol(Ip$Ipc))], -Ipmax * 0.97)
58 lab <- format(round(rev(Ip$Egc), 1))
59 lab[1] <- paste0(zname, "2=", lab[1], "V")
60 text(x, y, lab, adj=0)
61 invisible()
62 }
Ip には,Ip.pp.comp や Ipp.pp.comp で作成した 結果を指定します.
例として2A3の合成プレート特性図を描いてみましょう.
Ebb <- 250 # プレート電源電圧 Eg0 <- -46 # グリッドバイアス ip <- Ip.pp.comp(t2A3, Ebb, Eg0, 10) g.plate.pp(ip, 0.2)図4.20のような特性図が描かれます.
6L6のUL接続合成プレート特性図を描いてみましょう.
Ebb <- 250 # プレート電源電圧 Eg0 <- -20 # グリッドバイアス rUL <- 0.43 # スクリーングリッドタップ比率 ip <- Ipp.pp.comp(t6L6T, Ebb, Eg0, 5, rUL=rUL) g.plate.pp(ip, 0.1)図4.21のような特性図が描かれます.
1 trans.pp <-
2 function(p, ei, Ep0, Eg0, RL, Eg20, rUL, rKF, MaxEp, Zp, Zk, Rbs)
3 {
4 # プッシュプル出力段の伝達特性
5 # @param p 真空管パラメータ
6 # @param ei 入力電圧
7 # @param Ep0 電源電圧
8 # @param Eg0 バイアス電圧
9 # @param RL 負荷インピーダンス(p-p間)
10 # @param Eg20 スクリーングリッド電圧
11 # @param rUL ULタップ比率(P-B間を1とする)
12 # @param rKF KNFタップ比率(P-B間を1とする)
13 # @param MaxEp 探索する最大プレート電圧
14 # @param Zp P-P間インピーダンス
15 # @param Zk K-K間インピーダンス
16 # @param Rbs ブートストラップ負荷抵抗値
17 # @param ig グリッド電流を求めるか
18 # @return
19 # $ep V1のプレート電圧
20 # $ip1 V1のプレート電流
21 # $ip2 V2のプレート電流
22 # $ig1 V1のグリッド電流
23 # $ig2 V2のグリッド電流
24 # $ig21 V1のスクリーングリッド電流
25 # $ig22 V2のスクリーングリッド電流
26 # $bUL P-Kに対するULタップ比率
27 # $bKF P-Kに対するKNFタップ比率
28 # $ibs1 ブートストラップによる出力電流
29 # $ibs2 ブートストラップによる出力電流
30
31 triode <- missing(rUL) && missing(Eg20)
32 if (missing(RL) && missing(Zp))
33 stop("RL or Zp must be specified.")
34 if (missing(RL)) {
35 if (!missing(Zk)) {
36 rKF <- sqrt(Zk / Zp)
37 } else if (missing(rKF)) {
38 rKF <- 0
39 }
40 RL <- Zp * (1 + rKF)^2
41 } else {
42 if (missing(rKF))
43 rKF <- 0
44 }
45 bKF <- rKF / (1 + rKF)
46 eRL <- RL/4 # 合成負荷抵抗値
47
48 # 交点を求めるための関数を準備する
49 if (triode) {
50 if (missing(Rbs)) {
51 f <- function(ep) {
52 dEp <- Ep0 - ep # プレート電圧の変化(*(-1))
53 ek <- dEp * bKF # カソード電位(グラウンド基準)
54 ip <- Ip.pp(p, ep, egi1-ek, Ep0, Eg0)
55 irl <- dEp / eRL # ロードラインによる電流
56 ip - irl
57 }
58 } else {
59 f <- function(ep) {
60 dEp <- Ep0 - ep # プレート電圧の変化(*(-1))
61 ek <- dEp * bKF # カソード電位(グラウンド基準)
62 ip <- Ip.pp(p, ep, egi1-ek, Ep0, Eg0) +
63 (egi1-ek-Eg0) / Rbs * bKF * 2
64 irl <- dEp / eRL # ロードラインによる電流
65 ip - irl
66 }
67 }
68 } else {
69 if (missing(Eg20))
70 Eg20 <- Ep0
71 if (missing(rUL))
72 rUL <- 0
73 bUL <- (rUL + rKF) / (1 + rKF) # P-Kに対するUL比率
74 if (missing(Rbs)) {
75 f <- function(ep) {
76 dEp <- Ep0 - ep # プレート電圧の変化(*(-1))
77 ek <- dEp * bKF # カソード電位(グラウンド基準)
78 ip <- Ip.pp(p, ep, egi1-ek, Ep0, Eg0, Eg20, bUL)
79 irl <- dEp / eRL # ロードラインによる電流
80 ip - irl
81 }
82 } else {
83 f <- function(ep) {
84 dEp <- Ep0 - ep # プレート電圧の変化(*(-1))
85 ek <- dEp * bKF # カソード電位(グラウンド基準)
86 ip <- Ip.pp(p, ep, egi1-ek, Ep0, Eg0, Eg20, bUL) +
87 (egi1-ek-Eg0) / Rbs * bKF * 2
88 irl <- dEp / eRL # ロードラインによる電流
89 ip - irl
90 }
91 }
92 }
93
94 if (missing(MaxEp))
95 MaxEp <- 2 * Ep0
96
97 ig1 <- ig2 <- ek1 <- ek2 <- ep <- ip1 <- ip2 <- rep(NA, length(ei))
98 ibs1 <- ibs2 <- rep(0, length(ei))
99 if (!triode)
100 ig21 <- ig22 <- ip1
101 for (i in seq(along=ei)) {
102 egi1 <- Eg0 + ei[i] # V1のグリッド電圧
103 egi2 <- Eg0 - ei[i] # V2のグリッド電圧
104 ep[i] <- ep1 <- uniroot(f, c(0, MaxEp))$root
105 ep2 <- 2*Ep0 - ep1 # V2のプレート電圧
106 dEp <- Ep0 - ep1
107 ek1[i] <- dEp * bKF # カソード電位(グラウンド基準)
108 ek2[i] <- -dEp * bKF # カソード電位(グラウンド基準)
109 if (triode) {
110 ip1[i] <- Ip(p, ep1, egi1-ek1[i])
111 ip2[i] <- -Ip(p, ep2, egi2-ek2[i])
112 ig1[i] <- Ig(p, ep1, egi1-ek1[i])
113 ig2[i] <- -Ig(p, ep2, egi2-ek2[i])
114 } else {
115 eg21 <- Eg20 - dEp*bUL # V1のスクリーングリッド電圧(カソード基準)
116 eg22 <- Eg20 + dEp*bUL # V2のスクリーングリッド電圧(カソード基準)
117 z <- Ipp.sub(p, ep1, egi1-ek1[i], eg21)
118 ip1[i] <- z$ip
119 ig1[i] <- z$ig
120 ig21[i] <- z$ig2
121 z <- Ipp.sub(p, ep2, egi2-ek2[i], eg22)
122 ip2[i] <- -z$ip
123 ig2[i] <- -z$ig
124 ig22[i] <- -z$ig2
125 }
126 if (!missing(Rbs)) {
127 ibs1[i] <- (egi1-ek1[i]-Eg0) / Rbs * bKF
128 ibs2[i] <- (egi2-ek2[i]-Eg0) / Rbs * bKF
129 }
130 }
131 if (triode)
132 list(ep=ep, ip1=ip1, ip2=ip2, ig1=ig1, ig2=ig2,
133 ek1=ek1, ek2=ek2, ibs1=ibs1, ibs2=ibs2, bKF=bKF)
134 else
135 list(ep=ep, ip1=ip1, ip2=ip2, ig1=ig1, ig2=ig2,
136 ek1=ek1, ek2=ek2, ig21=ig21, ig22=ig22, ibs1=ibs1, ibs2=ibs2,
137 bUL=bUL, bKF=bKF)
138 }
例として2A3の合成プレート特性図に各球のロードラインを描いてみましょう.
p <- Ip.pp.comp(t2A3, Ebb, Eg0, 10) g.plate.pp(ip, 0.2) ei <- seq(-Eg0, Eg0, len=21) # 入力電圧 RL <- 5000 # p-p間負荷 throughline(Ebb, 0, -1/(RL/4), col="blue") # 合成ロードライン tr <- trans.pp(t2A3, ei, Ebb, Eg0, RL) lines(tr$ep, tr$ip1, col="cyan") # V1のロードライン lines(tr$ep, tr$ip2, col="cyan")図4.22のような図が描かれます.
2A3プッシュプルの伝達特性を描いてみましょう.
Ebb <- 250
Eg0 <- -46
RL <- 5000 # p-p間負荷
ei <- seq(-Eg0, Eg0, len=21) # 入力電圧
tr <- trans.pp(t2A3, ei, Ebb, Eg0, RL)
ylim <- c(-0.15, 0.15)
matplot(ei, cbind(tr$ip1, tr$ip2, tr$ip1+tr$ip2), type="l", lty=1,
col=c("cyan", "cyan", "blue"), ylim=ylim,
xlab="Ei (V)", ylab="Ip (A)")
abline(v=0)
abline(h=0)
図4.23のような図が描かれます.
6L6UL接続の合成プレート特性図に各球のロードラインを描いてみましょう.
Ebb <- 250 # プレート電源電圧 Eg0 <- -20 # グリッドバイアス rUL <- 0.43 # スクリーングリッドタップ比率 ip <- Ipp.pp.comp(t6L6T, Ebb, Eg0, 5, r=rUL) g.plate.pp(ip, 0.1) ei <- seq(-Eg0, Eg0, len=21) # 入力電圧 RL <- 8000 # p-p間負荷 throughline(Ebb, 0, -1/(RL/4), col="blue") # 合成ロードライン tr <- trans.pp(t6L6T, ei, Ebb, Eg0, RL, rUL=rUL) lines(tr$ep, tr$ip1, col="cyan") # V1のロードライン lines(tr$ep, tr$ip2, col="cyan")図4.24のような図が描かれます. ayumi