ここでは,プッシュプル出力段の設計に役立つ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