Subsections

4.5 Rのプログラム

ここでは,プッシュプル出力段の設計に役立つRのプログラムを紹介します.

4.5.1 合成プレート特性

4.5.1.0.1 三極管の合成プレート特性を求める Ip.pp.comp

    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 }

4.5.1.0.2 多極管の合成プレート特性を求める Ipp.pp.comp

    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接続の合成特性も求めることができます.

4.5.1.0.3 合成プレート特性を描く

    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.compIpp.pp.comp で作成した 結果を指定します.

例として2A3の合成プレート特性図を描いてみましょう.

Ebb <- 250      # プレート電源電圧
Eg0 <- -46      # グリッドバイアス
ip <- Ip.pp.comp(t2A3, Ebb, Eg0, 10)
g.plate.pp(ip, 0.2)
4.20のような特性図が描かれます.
図 4.20: 2A3の合成プレート特性図を描く
\includegraphics{figs/2A3_pp_plate.ps}

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のような特性図が描かれます.
図 4.21: 6L6のUL接続合成プレート特性図を描く
\includegraphics{figs/6L6_ulpp_plate.ps}

4.5.2 ロードラインと伝達特性

4.5.2.0.1 プッシュプルの伝達特性を求める trans.pp

    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のような図が描かれます.
図 4.22: 2A3のロードラインを描く
\includegraphics{figs/2A3_pp_ll.ps}

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のような図が描かれます.
図 4.23: 2A3プッシュプルの伝達特性を描く
\includegraphics{figs/2A3_pp_trans.ps}

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のような図が描かれます.
図 4.24: 6L6UL接続のロードラインを描く
\includegraphics{figs/6L6_ulpp_ll.ps}
ayumi
2016-03-07