diff --git a/src/channel_state.rs b/src/channel_state.rs index 505c467..d4c46a1 100644 --- a/src/channel_state.rs +++ b/src/channel_state.rs @@ -16,6 +16,7 @@ use uom::si::{ use crate::{ ad7172, pid, + config::PwmLimits, steinhart_hart as sh, command_parser::{CenterPoint, Polarity}, }; @@ -32,6 +33,7 @@ pub struct ChannelState { pub center: CenterPoint, pub dac_value: ElectricPotential, pub i_set: ElectricCurrent, + pub pwm_limits: PwmLimits, pub pid_engaged: bool, pub pid: pid::Controller, pub sh: sh::Parameters, @@ -49,6 +51,11 @@ impl ChannelState { center: CenterPoint::Vref, dac_value: ElectricPotential::new::(0.0), i_set: ElectricCurrent::new::(0.0), + pwm_limits: PwmLimits { + max_v: 0.0, + max_i_pos: 0.0, + max_i_neg: 0.0, + }, pid_engaged: false, pid: pid::Controller::new(pid::Parameters::default()), sh: sh::Parameters::default(), diff --git a/src/channels.rs b/src/channels.rs index de8ecf9..d8300c0 100644 --- a/src/channels.rs +++ b/src/channels.rs @@ -357,52 +357,16 @@ impl Channels { } } - fn get_pwm(&self, channel: usize, pin: PwmPin) -> f64 { - fn get>(pin: &P) -> f64 { - let duty = pin.get_duty(); - let max = pin.get_max_duty(); - duty as f64 / (max as f64) - } - match (channel, pin) { - (_, PwmPin::ISet) => - panic!("i_set is no pwm pin"), - (0, PwmPin::MaxIPos) => - get(&self.pwm.max_i_pos0), - (0, PwmPin::MaxINeg) => - get(&self.pwm.max_i_neg0), - (0, PwmPin::MaxV) => - get(&self.pwm.max_v0), - (1, PwmPin::MaxIPos) => - get(&self.pwm.max_i_pos1), - (1, PwmPin::MaxINeg) => - get(&self.pwm.max_i_neg1), - (1, PwmPin::MaxV) => - get(&self.pwm.max_v1), - _ => - unreachable!(), - } - } - pub fn get_max_v(&mut self, channel: usize) -> ElectricPotential { - let max = 4.0 * ElectricPotential::new::(3.3); - let duty = self.get_pwm(channel, PwmPin::MaxV); - duty * max + ElectricPotential::new::(self.channel_state(channel).pwm_limits.max_v) } pub fn get_max_i_pos(&mut self, channel: usize) -> ElectricCurrent { - let duty = match self.channel_state(channel).polarity { - Polarity::Normal => self.get_pwm(channel, PwmPin::MaxIPos), - Polarity::Reversed => self.get_pwm(channel, PwmPin::MaxINeg), - }; - duty * MAX_TEC_I_DUTY_TO_CURRENT_RATE + ElectricCurrent::new::(self.channel_state(channel).pwm_limits.max_i_pos) } pub fn get_max_i_neg(&mut self, channel: usize) -> ElectricCurrent { - let duty = match self.channel_state(channel).polarity { - Polarity::Normal => self.get_pwm(channel, PwmPin::MaxINeg), - Polarity::Reversed => self.get_pwm(channel, PwmPin::MaxIPos), - }; - duty * MAX_TEC_I_DUTY_TO_CURRENT_RATE + ElectricCurrent::new::(self.channel_state(channel).pwm_limits.max_i_neg) } // Get current passing through TEC @@ -448,28 +412,34 @@ impl Channels { pub fn set_max_v(&mut self, channel: usize, max_v: ElectricPotential) -> (ElectricPotential, ElectricPotential) { let max = 4.0 * ElectricPotential::new::(3.3); - let duty = (max_v.min(MAX_TEC_V).max(ElectricPotential::zero()) / max).get::(); + let max_v = max_v.min(MAX_TEC_V).max(ElectricPotential::zero()); + let duty = (max_v / max).get::(); let duty = self.set_pwm(channel, PwmPin::MaxV, duty); + self.channel_state(channel).pwm_limits.max_v = max_v.get::(); (duty * max, max) } pub fn set_max_i_pos(&mut self, channel: usize, max_i_pos: ElectricCurrent) -> (ElectricCurrent, ElectricCurrent) { let max = ElectricCurrent::new::(3.0); - let duty = (max_i_pos.min(MAX_TEC_I).max(ElectricCurrent::zero()) / MAX_TEC_I_DUTY_TO_CURRENT_RATE).get::(); + let max_i_pos = max_i_pos.min(MAX_TEC_I).max(ElectricCurrent::zero()); + let duty = (max_i_pos / MAX_TEC_I_DUTY_TO_CURRENT_RATE).get::(); let duty = match self.channel_state(channel).polarity { Polarity::Normal => self.set_pwm(channel, PwmPin::MaxIPos, duty), Polarity::Reversed => self.set_pwm(channel, PwmPin::MaxINeg, duty), }; + self.channel_state(channel).pwm_limits.max_i_pos = max_i_pos.get::(); (duty * MAX_TEC_I_DUTY_TO_CURRENT_RATE, max) } pub fn set_max_i_neg(&mut self, channel: usize, max_i_neg: ElectricCurrent) -> (ElectricCurrent, ElectricCurrent) { let max = ElectricCurrent::new::(3.0); - let duty = (max_i_neg.min(MAX_TEC_I).max(ElectricCurrent::zero()) / MAX_TEC_I_DUTY_TO_CURRENT_RATE).get::(); + let max_i_neg = max_i_neg.min(MAX_TEC_I).max(ElectricCurrent::zero()); + let duty = (max_i_neg / MAX_TEC_I_DUTY_TO_CURRENT_RATE).get::(); let duty = match self.channel_state(channel).polarity { Polarity::Normal => self.set_pwm(channel, PwmPin::MaxINeg, duty), Polarity::Reversed => self.set_pwm(channel, PwmPin::MaxIPos, duty), }; + self.channel_state(channel).pwm_limits.max_i_neg = max_i_neg.get::(); (duty * MAX_TEC_I_DUTY_TO_CURRENT_RATE, max) } diff --git a/src/config.rs b/src/config.rs index 2d62624..65b511d 100644 --- a/src/config.rs +++ b/src/config.rs @@ -75,10 +75,10 @@ impl ChannelConfig { } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -struct PwmLimits { - max_v: f64, - max_i_pos: f64, - max_i_neg: f64, +pub struct PwmLimits { + pub max_v: f64, + pub max_i_pos: f64, + pub max_i_neg: f64, } impl PwmLimits {