From 227d9d4877ed4483753d46dd7cb259de39e586d4 Mon Sep 17 00:00:00 2001 From: linuswck Date: Tue, 21 Jan 2025 11:54:11 +0800 Subject: [PATCH] laser: Short LD terminals when ld pwr is off --- src/device/boot.rs | 1 - src/laser_diode/laser_diode.rs | 19 ++++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/device/boot.rs b/src/device/boot.rs index b7b5f0a..7b99263 100644 --- a/src/device/boot.rs +++ b/src/device/boot.rs @@ -71,7 +71,6 @@ pub fn bootup( let current_source = LdCtrl::new(current_source_phy); let mut laser = LdDrive::new(current_source, perif.ADC3, perif.TIM2.counter(&clocks), pd_mon_phy); laser.setup(); - laser.ld_open(); laser.ld_set_i(ElectricCurrent::new::(0.0)); laser.set_pd_i_limit(ElectricCurrent::new::(2.5)); laser.set_pd_mon_calibrated_vdda(thermostat.get_calibrated_vdda()); diff --git a/src/laser_diode/laser_diode.rs b/src/laser_diode/laser_diode.rs index be024f6..3bde502 100644 --- a/src/laser_diode/laser_diode.rs +++ b/src/laser_diode/laser_diode.rs @@ -99,22 +99,33 @@ impl LdDrive { Settings::DAC_OUT_V_MAX, ); LdCurrentOutCtrlTimer::reset(); - self.ld_short(); + self.ctrl.ld_short_enable(); } pub fn ld_short(&mut self) { - self.ctrl.ld_short_enable(); + if LdPwrExcProtector::get_status().pwr_engaged { + self.ctrl.ld_short_enable(); + } self.settings.ld_terms_short = true; } pub fn ld_open(&mut self) { - self.ctrl.ld_short_disable(); + if LdPwrExcProtector::get_status().pwr_engaged { + self.ctrl.ld_short_disable(); + } self.settings.ld_terms_short = false; } pub fn power_up(&mut self) { let prev_i_set = self.settings.ld_drive_current; LdCurrentOutCtrlTimer::reset(); + + if self.settings.ld_terms_short { + self.ctrl.ld_short_enable(); + } else { + self.ctrl.ld_short_disable(); + } + let _ = self.ctrl.set_i( ElectricCurrent::new::(0.0), Settings::LD_DRIVE_TRANSIMPEDANCE, @@ -132,6 +143,8 @@ impl LdDrive { pub fn power_down(&mut self) { LdPwrExcProtector::pwr_off(); self.settings.pwr_on = false; + // Short the laser diode terminals at power off state for electrical protection + self.ctrl.ld_short_enable(); } pub fn get_pd_i(&mut self) -> ElectricCurrent {