From a8465a7e63b2cc8ccbe211b7f61c8307ab65ac92 Mon Sep 17 00:00:00 2001 From: atse Date: Fri, 16 Aug 2024 12:24:23 +0800 Subject: [PATCH] Show and save set value for PWM limits Show in PwmSummary the set value, before all PWM duty calculations instead of the machine value after the calculations. Also save the set value into the flash store instead of the machine value. --- src/channel_state.rs | 7 +++++++ src/channels.rs | 50 +++++++++++--------------------------------- src/config.rs | 8 +++---- 3 files changed, 23 insertions(+), 42 deletions(-) diff --git a/src/channel_state.rs b/src/channel_state.rs index 4820131..7ee1d7f 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, }; @@ -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, @@ -48,6 +50,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 977a6f5..3cba9a5 100644 --- a/src/channels.rs +++ b/src/channels.rs @@ -361,48 +361,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 max = ElectricCurrent::new::(3.0); - let duty = self.get_pwm(channel, PwmPin::MaxIPos); - duty * max + ElectricCurrent::new::(self.channel_state(channel).pwm_limits.max_i_pos) } pub fn get_max_i_neg(&mut self, channel: usize) -> ElectricCurrent { - let max = ElectricCurrent::new::(3.0); - let duty = self.get_pwm(channel, PwmPin::MaxINeg); - duty * max + ElectricCurrent::new::(self.channel_state(channel).pwm_limits.max_i_neg) } // Get current passing through TEC @@ -444,22 +412,28 @@ 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).get::(); + let max_i_pos = max_i_pos.min(MAX_TEC_I).max(ElectricCurrent::zero()); + let duty = (max_i_pos / max).get::(); let duty = self.set_pwm(channel, PwmPin::MaxIPos, duty); + self.channel_state(channel).pwm_limits.max_i_pos = max_i_pos.get::(); (duty * max, 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).get::(); + let max_i_neg = max_i_neg.min(MAX_TEC_I).max(ElectricCurrent::zero()); + let duty = (max_i_neg / max).get::(); let duty = self.set_pwm(channel, PwmPin::MaxINeg, duty); + self.channel_state(channel).pwm_limits.max_i_neg = max_i_neg.get::(); (duty * max, max) } diff --git a/src/config.rs b/src/config.rs index 2a9e25e..fb9f49c 100644 --- a/src/config.rs +++ b/src/config.rs @@ -72,10 +72,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 {