Skip to main content

ac_coupled_amplifier/
ac_coupled_amplifier.rs

1use reda_spice::{netlist::Circuit, probe::Drawer, simulate::ngspice::NgSpiceShared, Model, SineVoltage, TranCommandBuilder};
2use reda_unit::{num, u};
3
4/// https://pyspice.fabrice-salvaire.fr/releases/v1.4/examples/transistor/ac-coupled-amplifier.html
5fn main_result() -> Result<(), Box<dyn std::error::Error>> {
6    let mut circuit = Circuit::new("AC Coupled Amplifier");
7    
8    circuit.add_dc_voltage("power", "5", "0", u!(15 V));
9    let sine = SineVoltage::sin(u!(0.5 V), u!(1 kHz));
10    let period = sine.period();
11    circuit.add_sine_voltage("in", "in", "0", sine);
12    circuit.add_capacitor("1", "in", "2", u!(10 uF));
13    circuit.add_resistor("1", "5", "2", u!(100 kΩ));
14    circuit.add_resistor("2", "2", "0", u!(20 kΩ));
15    circuit.add_resistor("C", "5", "4", u!(10 kΩ));
16    circuit.add_bjt("1", "4", "2", "3", "bjt");
17    let mut model = Model::npn("bjt");
18    model.parameter("bf", 80.0);
19    model.parameter("cjc", num!(5 p));
20    model.parameter("rb", 100);
21    circuit.add_model(model);
22    circuit.add_resistor("E", "3", "0", u!(2 kΩ));
23    circuit.add_capacitor("2", "4", "out", u!(10 uF));
24    circuit.add_resistor("Load", "out", "0", u!(1 kΩ));
25
26    let simulate = NgSpiceShared::default()?;
27    let mut simulator = circuit.simulator(simulate);
28    let command = TranCommandBuilder::default()
29        .t_stop(2. * period)
30        .t_step(u!(5 us))
31        .build().unwrap();
32    let analysis = simulator.run_tran(&command)?;
33
34    analysis.draw_nodes(&Drawer::default(), &["in", "out"], "./images/ac-coupled-amplifier-nodes.png")?;
35    analysis.draw_all_branchs(&Drawer::default(), "./images/ac-coupled-amplifier-branchs.png")?;
36
37    Ok(())
38}
39
40fn main() {
41    if let Err(e) = main_result() {
42        eprintln!("{}", e);
43    }
44}