diff --git a/electronics/src/builtin_voltage.rs b/electronics/src/builtin_voltage.rs new file mode 100644 index 00000000..d8299197 --- /dev/null +++ b/electronics/src/builtin_voltage.rs @@ -0,0 +1,36 @@ +// Copyright (c) 2023 Xu Shaohua . All rights reserved. +// Use of this source is governed by General Public License that can be found +// in the LICENSE file. + +// TEMPERATURE (unit = K) +pub const T: f64 = 300.0; +pub const BOLTZMANN: f64 = 1.380_649e-23; +pub const ELECTRON_VOLT: f64 = 1.602_176_634e-19; + +/// This function can calculate the Builtin Voltage of a pn junction diode. +/// +/// This is calculated from the given three values. +/// +/// # Parameters +/// - `donor_conc` - donor concentration +/// - `acceptor_conc` - acceptor concentration +/// - `intrinsic_conc` - intrinsic concentration +#[must_use] +pub fn builtin_voltage(donor_conc: f64, acceptor_conc: f64, intrinsic_conc: f64) -> f64 { + debug_assert!(donor_conc > 0.0); + debug_assert!(acceptor_conc > 0.0); + debug_assert!(intrinsic_conc > 0.0); + debug_assert!(donor_conc > intrinsic_conc); + debug_assert!(acceptor_conc > intrinsic_conc); + BOLTZMANN * T * ((donor_conc * acceptor_conc) / intrinsic_conc.powi(2)).ln() / ELECTRON_VOLT +} + +#[cfg(test)] +mod tests { + use super::builtin_voltage; + + #[test] + fn test_builtin_voltage() { + assert_eq!(builtin_voltage(1e17, 1e17, 1e10), 0.833370010652644); + } +} diff --git a/electronics/src/lib.rs b/electronics/src/lib.rs index 1569889f..b01a123a 100644 --- a/electronics/src/lib.rs +++ b/electronics/src/lib.rs @@ -11,5 +11,6 @@ )] //pub mod apparent_power; +pub mod builtin_voltage; pub mod electric_power; pub mod ohms_law;