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