Average out reads instead of waiting for stability
Reading until the error falls into a certain tolerance might cause bootlooping as the ADC values just might never settle. Average it out instead.
This commit is contained in:
parent
2591bff0e2
commit
2e9c1d1467
@ -169,17 +169,6 @@ impl<'a> Channels<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn read_dac_feedback_until_stable(&mut self, channel: usize, tolerance: ElectricPotential) -> ElectricPotential {
|
|
||||||
let mut prev = self.read_dac_feedback(channel);
|
|
||||||
loop {
|
|
||||||
let current = self.read_dac_feedback(channel);
|
|
||||||
if (current - prev).abs() < tolerance {
|
|
||||||
return current;
|
|
||||||
}
|
|
||||||
prev = current;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn read_itec(&mut self, channel: usize) -> ElectricPotential {
|
pub fn read_itec(&mut self, channel: usize) -> ElectricPotential {
|
||||||
match channel {
|
match channel {
|
||||||
0 => {
|
0 => {
|
||||||
@ -265,11 +254,14 @@ impl<'a> Channels<'a> {
|
|||||||
/// thermostat.
|
/// thermostat.
|
||||||
pub fn calibrate_dac_value(&mut self, channel: usize) {
|
pub fn calibrate_dac_value(&mut self, channel: usize) {
|
||||||
let samples = 50;
|
let samples = 50;
|
||||||
|
let target_voltage = {
|
||||||
let mut target_voltage = ElectricPotential::new::<volt>(0.0);
|
let mut target_voltage = ElectricPotential::new::<volt>(0.0);
|
||||||
for _ in 0..samples {
|
for _ in 0..samples {
|
||||||
target_voltage += self.read_vref(channel);
|
target_voltage += self.read_vref(channel);
|
||||||
}
|
}
|
||||||
target_voltage /= samples as f64;
|
target_voltage /= samples as f64;
|
||||||
|
target_voltage
|
||||||
|
};
|
||||||
let mut start_value = 1;
|
let mut start_value = 1;
|
||||||
let mut best_error = ElectricPotential::new::<volt>(100.0);
|
let mut best_error = ElectricPotential::new::<volt>(100.0);
|
||||||
|
|
||||||
@ -287,7 +279,14 @@ impl<'a> Channels<'a> {
|
|||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
|
|
||||||
let dac_feedback = self.read_dac_feedback_until_stable(channel, ElectricPotential::new::<volt>(0.001));
|
let dac_feedback = {
|
||||||
|
let mut dac_feedback = ElectricPotential::new::<volt>(0.0);
|
||||||
|
for _ in 0..samples {
|
||||||
|
dac_feedback += self.read_dac_feedback(channel);
|
||||||
|
}
|
||||||
|
dac_feedback /= samples as f64;
|
||||||
|
dac_feedback
|
||||||
|
};
|
||||||
let error = target_voltage - dac_feedback;
|
let error = target_voltage - dac_feedback;
|
||||||
if error < ElectricPotential::new::<volt>(0.0) {
|
if error < ElectricPotential::new::<volt>(0.0) {
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user