From e2fa01a01ec30d6c55783d979c1c8ea541856e46 Mon Sep 17 00:00:00 2001 From: Damien Zammit Date: Thu, 3 Dec 2020 21:28:08 +1100 Subject: ZamTube: Use thevenin equivalent for tube as a voltage generator + variable resistor --- plugins/ZamTube/triode.cpp | 48 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/plugins/ZamTube/triode.cpp b/plugins/ZamTube/triode.cpp index ac5ff6e..d48f097 100644 --- a/plugins/ZamTube/triode.cpp +++ b/plugins/ZamTube/triode.cpp @@ -5,7 +5,8 @@ using std::abs; #define DUMP(x) x -T Triode::compute(T a, T R, T Vg, T Vk) { +#if 0 +T Triode::compute_old(T a, T R, T Vg, T Vk) { T VakGuess = 100.; T Vgk = Vg - Vk; T Vak = VakGuess; @@ -22,6 +23,7 @@ T Triode::compute(T a, T R, T Vg, T Vk) { //printf("Vgate=%f Vk=%f Vgk=%f b=%f\n", Vgate, Vk, Vgk, b); return b; } +#endif T Triode::getIa(T Vgk, T Vpk) const { if (Vpk < 0.0) { @@ -47,16 +49,43 @@ T Triode::iterateNewtonRaphson(T x, T dx, T Vgk, T a, T R) const { return xNew; } + +T Triode::compute(T a, T R, T Vg, T Vk) { + T mu1, vp2, vgg, evgg, evgg1, levgg1, powkx, pkxvg; + T dIpVp, ra; + T Vp, Ip, Vpk, Vgk, b; + + Vgk = Vk - Vg; + Vpk = -mu * Vgk; + Ip = getIa(Vgk, Vpk); + + b = Vpk - R*Ip; + Vp = a - R*Ip; + + mu1 = 1.0/mu; + vp2 = sqrt(Vp*Vp + kvb); + vgg = Vg / vp2 + mu1; + evgg = exp(kp*vgg); + evgg1 = 1. + evgg; + levgg1 = log1p(evgg); + powkx = pow(Vp*levgg1/kp, kx - 1.0); + pkxvg = kx*powkx*evgg; + + dIpVp = pkxvg/(vp2*evgg1); + ra = kg1 / dIpVp; + if (ra < 1.) + ra = 1.; + + //dIpVg = Vp*pkxvg*(vgg/(kp*evgg1) - levgg1/(kp*kp)); + //gm = dIpVg / kg1; + + b = Vpk - (R + 0.1/ra)*Ip; + return b; + +} + Triode::Triode() { - /* good for low gain, broken at high gain - kvb = 300.; - mu = 103.2; - kx = 1.26; - kg1 = 446.0; - kp = 3.4; - */ - //12AX7 RSD-1 (custom) mu = 100.; kx = 1.4; @@ -64,3 +93,4 @@ Triode::Triode() kp = 600.; kvb = 300.; } + -- cgit v1.2.3