diff --git a/src/laser_diode/current_sources.rs b/src/laser_diode/current_sources.rs index f54afe5..4515fb7 100644 --- a/src/laser_diode/current_sources.rs +++ b/src/laser_diode/current_sources.rs @@ -9,7 +9,13 @@ use stm32f4xx_hal::{ spi::{NoMiso, Spi, TransferModeNormal}, }; +use uom::si::{ + ratio::ratio, + f64::{ElectricPotential, ElectricCurrent}, +}; + use crate::laser_diode::max5719::{self, Dac}; +use crate::laser_diode::ld_drive::transimpedance_unit; pub trait ChannelPins { type PdMonPin; @@ -82,4 +88,16 @@ impl CurrentSource { pub fn ld_short_disable(&mut self) { self.phy.current_source_short_pin.set_high(); } + + pub fn set_dac(&mut self, voltage: ElectricPotential, dac_out_v_max: ElectricPotential) -> ElectricPotential { + let value = ((voltage / dac_out_v_max).get::() + * (max5719::MAX_VALUE as f64)) as u32; + self.phy.dac.set(value).unwrap(); + voltage + } + + pub fn set_i(&mut self, current: ElectricCurrent, transimpedance: transimpedance_unit, dac_out_v_max: ElectricPotential) -> ElectricCurrent { + let v = current * transimpedance; + self.set_dac(current * transimpedance, dac_out_v_max) / transimpedance + } } \ No newline at end of file diff --git a/src/laser_diode/ld_drive.rs b/src/laser_diode/ld_drive.rs index d8ff846..0408ce4 100644 --- a/src/laser_diode/ld_drive.rs +++ b/src/laser_diode/ld_drive.rs @@ -85,4 +85,9 @@ impl LD_Drive{ self.ctrl.ld_short_disable(); } + pub fn ld_set_i(&mut self, i: ElectricCurrent) -> ElectricCurrent { + let ld_i_set = self.ctrl.set_i(i, Settings::LD_DRIVE_TRANSIMPEDANCE, Settings::DAC_OUT_V_MAX); + self.settings.ld_drive_current = ld_i_set; + ld_i_set + } } \ No newline at end of file