From 792342f9b22ad9bd3d009e163c251d16373337a1 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 | 54 ++++++++++---------------------------------- src/config.rs | 8 +++---- 3 files changed, 23 insertions(+), 46 deletions(-) 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 {