ac_coupled_amplifier/
ac_coupled_amplifier.rs

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