ac_coupled_amplifier/
ac_coupled_amplifier.rs1use reda_spsim::{netlist::Circuit, probe::Drawer, simulate::ngspice::NgSpiceShared};
2use reda_spsim::{Model, SineVoltage, TranCommandBuilder};
3use reda_unit::{num, u};
4
5fn 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}