summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2020-12-03 21:28:08 +1100
committerDamien Zammit <damien@zamaudio.com>2020-12-03 21:28:08 +1100
commite2fa01a01ec30d6c55783d979c1c8ea541856e46 (patch)
tree549cb274b61513dd24566ffd06de00eaebef858b
parente8058b60888280fd4aab47baaec48cdf3a36fb6e (diff)
ZamTube: Use thevenin equivalent for tube as a voltage generator + variable resistorzamtube-optimise
-rw-r--r--plugins/ZamTube/triode.cpp48
1 files 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.;
}
+