pd_mon: add fns to convert between pwr and current

This commit is contained in:
linuswck 2024-01-26 12:10:52 +08:00
parent e22f424531
commit 9d8a553669
2 changed files with 18 additions and 12 deletions

View File

@ -2,7 +2,8 @@ use miniconf::Miniconf;
use stm32f4xx_hal::pac::ADC2; use stm32f4xx_hal::pac::ADC2;
use crate::laser_diode::ld_ctrl::LdCtrl; use crate::laser_diode::ld_ctrl::LdCtrl;
use crate::laser_diode::ld_pwr_exc_protector::{LdPwrExcProtector, self}; use crate::laser_diode::ld_pwr_exc_protector::{LdPwrExcProtector, self};
use core::{marker::PhantomData, f64::NAN}; use crate::laser_diode::pd_mon;
use core::marker::PhantomData;
use uom::si::{ use uom::si::{
electric_current::milliampere, electric_current::milliampere,
@ -43,7 +44,8 @@ impl Settings{
pub struct Settings { pub struct Settings {
ld_drive_current: ElectricCurrent, ld_drive_current: ElectricCurrent,
ld_drive_current_limit: ElectricCurrent, ld_drive_current_limit: ElectricCurrent,
pd_i_to_out_pwr: IToPowerUnit, #[miniconf(defer)]
pd_responsitivity: pd_mon::Parameters,
} }
impl Default for Settings { impl Default for Settings {
@ -51,7 +53,7 @@ impl Default for Settings {
Self { Self {
ld_drive_current: ElectricCurrent::new::<milliampere>(0.0), ld_drive_current: ElectricCurrent::new::<milliampere>(0.0),
ld_drive_current_limit: ElectricCurrent::new::<milliampere>(0.0), ld_drive_current_limit: ElectricCurrent::new::<milliampere>(0.0),
pd_i_to_out_pwr: IToPowerUnit {dimension: PhantomData, units: PhantomData, value: NAN} pd_responsitivity: pd_mon::Parameters::default(),
} }
} }
} }
@ -125,16 +127,17 @@ impl LdDrive{
LdPwrExcProtector::clear_alarm_status(); LdPwrExcProtector::clear_alarm_status();
} }
pub fn set_pd_responsitivity(&mut self, responsitivity: pd_mon::ResponsitivityUnit){
self.settings.pd_responsitivity.responsitivity = responsitivity;
}
pub fn set_ld_power_limit(&mut self, pwr_limit: Power){ pub fn set_ld_power_limit(&mut self, pwr_limit: Power){
// LdPwrExcProtector::set_trigger_threshold_v(convert pwr_limit to raw adc code) LdPwrExcProtector::set_trigger_threshold_v(self.settings.pd_responsitivity
unimplemented!() .get_ld_i_from_ld_pwr(pwr_limit) / Settings::PD_MON_TRANSCONDUCTANCE
);
} }
pub fn set_pd_i_limit(&mut self, i: ElectricCurrent){ pub fn set_pd_i_limit(&mut self, i: ElectricCurrent){
LdPwrExcProtector::set_trigger_threshold_v(i / Settings::PD_MON_TRANSCONDUCTANCE); LdPwrExcProtector::set_trigger_threshold_v(i / Settings::PD_MON_TRANSCONDUCTANCE);
} }
pub fn set_pd_v_limit(&mut self, v: ElectricPotential){
LdPwrExcProtector::set_trigger_threshold_v(v);
}
} }

View File

@ -12,19 +12,22 @@ use miniconf::Miniconf;
// Ampere / Watt // Ampere / Watt
pub type ResponsitivityUnit = Quantity<ISQ<N2, N1, P3, P1, Z0, Z0, Z0>, SI<f64>, f64>; pub type ResponsitivityUnit = Quantity<ISQ<N2, N1, P3, P1, Z0, Z0, Z0>, SI<f64>, f64>;
/// Steinhart-Hart equation Photodiode
#[derive(Clone, Debug, PartialEq, Miniconf)] #[derive(Clone, Debug, PartialEq, Miniconf)]
pub struct Parameters { pub struct Parameters {
/// Responsitivity
pub responsitivity: ResponsitivityUnit, pub responsitivity: ResponsitivityUnit,
pub i_dark: ElectricCurrent, pub i_dark: ElectricCurrent,
} }
impl Parameters { impl Parameters {
pub fn get_ld_output_power(&self, i: ElectricCurrent) -> Power { pub fn get_ld_pwr_from_ld_i(&self, i: ElectricCurrent) -> Power {
let ld_power = (i - self.i_dark) / self.responsitivity; let ld_power = (i - self.i_dark) / self.responsitivity;
ld_power ld_power
} }
pub fn get_ld_i_from_ld_pwr(&self, pwr: Power) -> ElectricCurrent {
let ld_i = pwr * self.responsitivity + self.i_dark;
ld_i
}
} }
impl Default for Parameters { impl Default for Parameters {