/* Verilog-A large-signal model for a fixed-fixed beam RF MEMS capacitive switch, switched capacitor and varactor. Content of RF_MEMS_CAPACITOR.va. Open-source code covered by BSD license. The Verilog-A large signal model can be used for operating point, small signal (AC, SP) and large signal (HB, PSS, QPSS) simulations, using ADS, SpectreRF or Qucs. It includes large-signal electromechanical effects, as well as small-signal Brownian noise. It does not include electro-thermal effects yet. Electromechanical: C-V hysteresis, hold-down, self-actuation, displacement-compensated squeeze-film damping Noise: Brownian noise 5th of September, 2011 Check for update: http://www-personal.umich.edu/~vcaeken Reference: "Modeling RF MEMS Devices", by K. Van Caekenberghe, IEEE Microwave Magazine, vol. 13, no. 1, pp. 83-110, Jan.-Feb. 2012 */ `include "disciplines.vams" `include "constants.vams" module RF_MEMS_CAPACITOR (in,out); inout in, out; electrical in, out; kinematic z, velocity; // Dimensions parameter real g_0=2e-6 from (0:inf); // nominal gap height [m] parameter real l=300e-6 from (0:inf); // beam length [m] parameter real t=0.5e-6 from (0:inf); // beam thickness [m] parameter real t_d=0.2e-6 from [0:inf); // dielectric thickness [m] parameter real w=80e-6 from (0:inf); // beam width [m] parameter real W=100e-6 from (0:inf); // electrode width [m] // Material parameters: beam (gold) parameter real nu=0.44 from [0:inf); // Poisson ratio [] parameter real rho=19.2e3 from (0:inf); // mass density [kg/m^3] parameter real sigma=100e6 from [0:inf); // residual stres [Pa] parameter real E=78e9 from (0:inf); // Young's modulus [Pa] // Material parameters: dielectric (silicon nitride) parameter real epsilon_r=7.6 from [1:inf); // dielectric constant [] // Material parameters: gas (air): parameter real lambda = 1.5e-7 from [0:inf); // mean-free path [m] parameter real mu = 1.845e-5 from (0:inf); // viscosity coefficient [kg/(m.s)] // van der Waals and nuclear force coefficients parameter real c_1=10e-80 from [0:inf); // van der Waals force coefficient [N.m] parameter real c_2=10e-75 from [0:inf); // nuclear force coefficient [N.m^8] real A, b, C, C_d, C_u, F_c, F_e, F_s, f_m_0, IIP3, k_1, k_3, m, Q_e, Q_m, t_s_max, t_s_min, V_H, V_P, V_S; analog begin @ ( initial_step ) begin A=W*w; $strobe("\n%M: A (electrode area [m^2]) = %E",A); m=0.4*rho*l*t*w; $strobe("%M: m (effective beam mass [kg]) = %E",m); k_1=32*E*w*pow(t/l,3)*27/49+8*sigma*(1-nu)*w*t/l*3/5; $strobe("%M: k_1 (spring constant [N/m]) = %E",k_1); k_3=pow(`M_PI,4)*E*w*t/(8*pow(l,3)); $strobe("%M: k_3 (stretching constant [N/m^3]) = %E",k_3); V_H=sqrt(2*k_1*g_0*pow(t_d/epsilon_r,2)/(`P_EPS0*epsilon_r*A)); $strobe("%M: V_H (pull-in voltage [V]) = %E",V_H); V_P=sqrt(8*k_1*pow(g_0+t_d/epsilon_r,3)/(27*A*`P_EPS0)); $strobe("%M: V_P (pull-in voltage [V]) = %E",V_P); f_m_0=sqrt(k_1/m)/(2*`M_PI); $strobe("%M: f_m_0 (mechanical resonant frequency [Hz]) = %E",f_m_0); Q_m=sqrt(E*rho)*pow(t,2)*pow(g_0,3)/(mu*pow(w*l/2,2)); $strobe("%M: Q_m (mechanical quality factor []) = %E",Q_m); V_S=V_P; t_s_max=27*pow(V_P,2)/(4*2*`M_PI*f_m_0*Q_m*pow(V_S,2)); $strobe("%M: t_s_max (maximum switching time [s], V_S = V_P) = %E",t_s_max); t_s_min=3.67*V_P/(V_S*sqrt(k_1/m)); $strobe("%M: t_s_min (minimum switching time [s], V_S = V_P) = %E",t_s_min); C_u=`P_EPS0*A/(g_0+t_d/epsilon_r); $strobe("%M: C_u (up-state capacitance [F]) = %E",C_u); C_d=`P_EPS0*A/(t_d/epsilon_r); $strobe("%M: C_d (down-state capacitance [F]) = %E",C_d); IIP3=10*log(2*k_1*pow(g_0,2)/(`M_PI*10e9*pow(C_u*50,2)))+30; $strobe("%M: IIP3 (third order intercept [dBm], C=C_u, delta_f < f_m_0, f=10 GHz, Z=50 Ohm) = %E",IIP3); end // b: damping coefficient [N.s/m] (displacement-compensated squeeze-film damping) Q_e=Q_m*pow(1.1-pow(g_0*tanh(Pos(z)/g_0)/g_0,2),1.5)*(1+9.9638*pow(lambda/(g_0-g_0*tanh(Pos(z)/g_0)),1.159)); $strobe("\n%M: Q_e (displacement-compensated mechanical quality factor []) = %E",Q_e); b=k_1/(2*`M_PI*f_m_0*Q_e); $strobe("%M: b (damping coefficient [N.s/m]) = %E",b); // Forces F_c=c_1*A/pow(g_0-g_0*tanh(Pos(z)/g_0)+1e-9,3)-c_2*A/pow(g_0-g_0*tanh(Pos(z)/g_0)+1e-9,10); $strobe("%M: F_c (attractive van der Waals and repulsive nuclear forces [N]) = %E",F_c); F_e=`P_EPS0*A*pow(V(out,in),2)/2/pow(g_0+t_d/epsilon_r-Pos(z),2); //F_e=`P_EPS0*A*pow(V(out,in),2)/2/pow(g_0+t_d/epsilon_r-g_0*tanh(Pos(z)/g_0),2); // Envelope simulation $strobe("%M: F_e (electrostatic force [N]) = %E",F_e); F_s=k_1*Pos(z)+k_3*pow(Pos(z),3); //F_s=k_1*g_0*tanh(Pos(z)/g_0)+k_3*pow(g_0*tanh(Pos(z)/g_0),3); // Envelope simulation $strobe("%M: F_s (spring force [N]) = %E",F_s); // Nonlinear time-varying state-space description Pos(velocity):ddt(Pos(z))==Pos(velocity); Pos(z):ddt(Pos(velocity))==1/m*(-b*Pos(velocity)-F_s+F_e+F_c+white_noise(4*`P_K*$temperature*b, "BROWNIAN_NOISE")); if (Pos(z)