laser_diode: use analog wdg fns
This commit is contained in:
parent
c3022e9db1
commit
af283b17ac
|
@ -1,5 +1,7 @@
|
|||
use miniconf::Miniconf;
|
||||
use stm32f4xx_hal::pac::ADC2;
|
||||
use crate::laser_diode::ld_ctrl::LdCtrl;
|
||||
use crate::laser_diode::analog_wdg::{LdAnalogWdg, self};
|
||||
use core::{marker::PhantomData, f64::NAN};
|
||||
|
||||
use uom::si::{
|
||||
|
@ -60,7 +62,9 @@ pub struct LdDrive{
|
|||
}
|
||||
|
||||
impl LdDrive{
|
||||
pub fn new(current_source: LdCtrl)-> Self{
|
||||
pub fn new(current_source: LdCtrl, pins_adc: ADC2, phy: analog_wdg::LdAnalogWdgPhy)-> Self {
|
||||
LdAnalogWdg::setup(pins_adc, phy);
|
||||
|
||||
LdDrive {
|
||||
ctrl: current_source,
|
||||
settings: Settings::default()
|
||||
|
@ -68,19 +72,11 @@ impl LdDrive{
|
|||
}
|
||||
|
||||
pub fn setup(&mut self) {
|
||||
self.power_down();
|
||||
LdAnalogWdg::pwr_disengage();
|
||||
self.ld_set_i(ElectricCurrent::new::<milliampere>(0.0));
|
||||
self.ld_short();
|
||||
}
|
||||
|
||||
pub fn power_up(&mut self){
|
||||
self.ctrl.power_up();
|
||||
}
|
||||
|
||||
pub fn power_down(&mut self){
|
||||
self.ctrl.power_down();
|
||||
}
|
||||
|
||||
pub fn get_ld_drive_current(&mut self) -> ElectricCurrent{
|
||||
self.settings.ld_drive_current
|
||||
}
|
||||
|
@ -97,8 +93,16 @@ impl LdDrive{
|
|||
self.ctrl.ld_short_disable();
|
||||
}
|
||||
|
||||
pub fn power_up(&mut self){
|
||||
LdAnalogWdg::pwr_engage();
|
||||
}
|
||||
|
||||
pub fn power_down(&mut self){
|
||||
LdAnalogWdg::pwr_disengage();
|
||||
}
|
||||
|
||||
pub fn get_pd_i(&mut self) -> ElectricCurrent {
|
||||
self.ctrl.get_pd_mon_v() * Settings::PD_MON_TRANSCONDUCTANCE
|
||||
LdAnalogWdg::get_pd_v() * Settings::PD_MON_TRANSCONDUCTANCE
|
||||
}
|
||||
|
||||
pub fn ld_set_i(&mut self, i: ElectricCurrent) -> ElectricCurrent {
|
||||
|
@ -107,4 +111,30 @@ impl LdDrive{
|
|||
self.settings.ld_drive_current = ld_i_set;
|
||||
ld_i_set
|
||||
}
|
||||
|
||||
// Set the calibrated VDDA value obtained from ADC1 calibration
|
||||
pub fn set_pd_mon_calibrated_vdda(val_cal: u32) {
|
||||
LdAnalogWdg::set_calibrated_vdda(val_cal)
|
||||
}
|
||||
|
||||
pub fn pd_mon_status() -> analog_wdg::AlarmStatus {
|
||||
LdAnalogWdg::get_alarm_status()
|
||||
}
|
||||
|
||||
pub fn pd_mon_clear_alarm(&mut self) {
|
||||
LdAnalogWdg::clear_alarm_status();
|
||||
}
|
||||
|
||||
pub fn pd_mon_engage(){
|
||||
LdAnalogWdg::enable_watchdog_interrupt()
|
||||
}
|
||||
|
||||
pub fn pd_mon_disengage(){
|
||||
LdAnalogWdg::disable_watchdog_interrupt()
|
||||
}
|
||||
|
||||
pub fn set_ld_power_limit(pwr_limit: Power){
|
||||
// LdAnalogWdg::set_htr(convert pwr_limit to raw adc code)
|
||||
unimplemented!()
|
||||
}
|
||||
}
|
|
@ -1,17 +1,12 @@
|
|||
use stm32f4xx_hal::{
|
||||
adc::{
|
||||
config::{self, AdcConfig},
|
||||
Adc,
|
||||
},
|
||||
gpio::{gpioa::*, gpiob::*, gpiod::*, Alternate, Output, PushPull, Analog, PD9},
|
||||
gpio::{gpioa::*, gpiob::*, gpiod::*, Alternate, Output, PushPull},
|
||||
hal::{blocking::spi::Transfer, digital::v2::OutputPin},
|
||||
pac::{SPI2, ADC2},
|
||||
pac::SPI2,
|
||||
spi::{NoMiso, Spi, TransferModeNormal},
|
||||
};
|
||||
|
||||
use uom::si::{
|
||||
ratio::ratio,
|
||||
electric_potential::millivolt,
|
||||
f64::{ElectricPotential, ElectricCurrent},
|
||||
};
|
||||
|
||||
|
@ -19,8 +14,6 @@ use crate::laser_diode::max5719::{self, Dac};
|
|||
use crate::laser_diode::laser_diode::TransimpedanceUnit;
|
||||
|
||||
pub trait ChannelPins {
|
||||
type PdMonPin;
|
||||
type CurrentSourceLdoEn: OutputPin;
|
||||
type CurrentSourceShort: OutputPin;
|
||||
type Max5719Load: OutputPin;
|
||||
type Max5719Cs: OutputPin;
|
||||
|
@ -29,15 +22,11 @@ pub trait ChannelPins {
|
|||
|
||||
pub struct LdCtrlPhy<C: ChannelPins> {
|
||||
pub dac: Dac<C::Max5719Spi, C::Max5719Cs, C::Max5719Load>,
|
||||
pub current_source_ldo_en_pin: C::CurrentSourceLdoEn,
|
||||
pub current_source_short_pin: C::CurrentSourceShort,
|
||||
pub pd_mon_pin : C::PdMonPin,
|
||||
}
|
||||
pub struct Channel0;
|
||||
|
||||
impl ChannelPins for Channel0 {
|
||||
type PdMonPin = PA3<Analog>;
|
||||
type CurrentSourceLdoEn = PD9<Output<PushPull>>;
|
||||
type CurrentSourceShort = PA4<Output<PushPull>>;
|
||||
type Max5719Load = DacLoad;
|
||||
type Max5719Cs = DacCs;
|
||||
|
@ -48,38 +37,17 @@ type DacSpi = Spi<SPI2, (PB10<Alternate<5>>, NoMiso, PB15<Alternate<5>>), Transf
|
|||
type DacCs = PD8<Output<PushPull>>;
|
||||
type DacLoad = PB14<Output<PushPull>>;
|
||||
|
||||
|
||||
pub struct LdCtrl{
|
||||
pub phy: LdCtrlPhy<Channel0>,
|
||||
pub pins_adc: Adc<ADC2>
|
||||
}
|
||||
|
||||
impl LdCtrl {
|
||||
pub fn new(phy_ch0: LdCtrlPhy<Channel0>, adc2: ADC2) -> Self {
|
||||
let config = AdcConfig::default()
|
||||
.clock(config::Clock::Pclk2_div_2)
|
||||
.default_sample_time(config::SampleTime::Cycles_480);
|
||||
|
||||
let pins_adc = Adc::adc2(adc2, true, config);
|
||||
|
||||
pub fn new(phy_ch0: LdCtrlPhy<Channel0>) -> Self {
|
||||
LdCtrl {
|
||||
phy: phy_ch0,
|
||||
pins_adc: pins_adc,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn power_up(&mut self) {
|
||||
self.phy.current_source_ldo_en_pin.set_high();
|
||||
}
|
||||
|
||||
#[deprecated(note=
|
||||
"To be removed when rev0_3 has arrived
|
||||
Rev0_2 has hardware connection bug for LD_EN.
|
||||
LD_EN will always be enabled.")]
|
||||
pub fn power_down(&mut self) {
|
||||
self.phy.current_source_ldo_en_pin.set_low();
|
||||
}
|
||||
|
||||
// LD Terminals are shorted together
|
||||
pub fn ld_short_enable(&mut self) {
|
||||
self.phy.current_source_short_pin.set_low();
|
||||
|
@ -90,15 +58,6 @@ impl LdCtrl {
|
|||
self.phy.current_source_short_pin.set_high();
|
||||
}
|
||||
|
||||
pub fn get_pd_mon_v(&mut self) -> ElectricPotential{
|
||||
let sample = self.pins_adc.convert(
|
||||
&self.phy.pd_mon_pin,
|
||||
stm32f4xx_hal::adc::config::SampleTime::Cycles_480,
|
||||
);
|
||||
let mv = self.pins_adc.sample_to_millivolts(sample as u16);
|
||||
ElectricPotential::new::<millivolt>(mv as f64)
|
||||
}
|
||||
|
||||
pub fn set_dac(&mut self, voltage: ElectricPotential, dac_out_v_max: ElectricPotential) -> ElectricPotential {
|
||||
let value = ((voltage / dac_out_v_max).get::<ratio>()
|
||||
* (max5719::MAX_VALUE as f64)) as u32;
|
||||
|
|
|
@ -74,7 +74,6 @@ fn main() -> ! {
|
|||
wd.feed();
|
||||
|
||||
info!("looping");
|
||||
info!("curr_ld_power: {:?}", mili_watt_fmt.with(laser.get_ld_power_output()));
|
||||
info!("curr_ld_drive_cuurent: {:?}", mili_amp_fmt.with(laser.get_ld_drive_current()));
|
||||
|
||||
info!("curr_dac_vfb: {:?}", volt_fmt.with(thermostat.get_dac_vfb()));
|
||||
|
|
Loading…
Reference in New Issue