forked from M-Labs/thermostat
Fix the calibration sequence
This fixes a wrong calibration of VREF on startup which wrongly initiated current through TEC to be over ~1 A on some new v2.2.2 boards.
This commit is contained in:
parent
c6040899dd
commit
bf9a1488ec
@ -22,6 +22,7 @@ use crate::{
|
|||||||
pins::{self, Channel0VRef, Channel1VRef},
|
pins::{self, Channel0VRef, Channel1VRef},
|
||||||
steinhart_hart,
|
steinhart_hart,
|
||||||
};
|
};
|
||||||
|
use crate::timer::sleep;
|
||||||
|
|
||||||
pub enum PinsAdcReadTarget {
|
pub enum PinsAdcReadTarget {
|
||||||
VREF,
|
VREF,
|
||||||
@ -269,17 +270,6 @@ impl Channels {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn read_dac_feedback_until_stable(&mut self, channel: usize, tolerance: ElectricPotential) -> ElectricPotential {
|
|
||||||
let mut prev = self.adc_read(channel, PinsAdcReadTarget::DacVfb, 1);
|
|
||||||
loop {
|
|
||||||
let current = self.adc_read(channel, PinsAdcReadTarget::DacVfb, 1);
|
|
||||||
if (current - prev).abs() < tolerance {
|
|
||||||
return current;
|
|
||||||
}
|
|
||||||
prev = current;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Calibrates the DAC output to match vref of the MAX driver to reduce zero-current offset of the MAX driver output.
|
/// Calibrates the DAC output to match vref of the MAX driver to reduce zero-current offset of the MAX driver output.
|
||||||
///
|
///
|
||||||
/// The thermostat DAC applies a control voltage signal to the CTLI pin of MAX driver chip to control its output current.
|
/// The thermostat DAC applies a control voltage signal to the CTLI pin of MAX driver chip to control its output current.
|
||||||
@ -306,7 +296,7 @@ impl Channels {
|
|||||||
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);
|
||||||
|
|
||||||
for step in (0..18).rev() {
|
for step in (5..18).rev() {
|
||||||
let mut prev_value = start_value;
|
let mut prev_value = start_value;
|
||||||
for value in (start_value..=ad5680::MAX_VALUE).step_by(1 << step) {
|
for value in (start_value..=ad5680::MAX_VALUE).step_by(1 << step) {
|
||||||
match channel {
|
match channel {
|
||||||
@ -318,8 +308,9 @@ impl Channels {
|
|||||||
}
|
}
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
|
sleep(10);
|
||||||
|
|
||||||
let dac_feedback = self.read_dac_feedback_until_stable(channel, ElectricPotential::new::<volt>(0.001));
|
let dac_feedback = self.adc_read(channel, PinsAdcReadTarget::DacVfb, 64);
|
||||||
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;
|
||||||
|
@ -113,10 +113,6 @@ fn main() -> ! {
|
|||||||
.pclk2(64.mhz())
|
.pclk2(64.mhz())
|
||||||
.freeze();
|
.freeze();
|
||||||
|
|
||||||
let mut wd = IndependentWatchdog::new(dp.IWDG);
|
|
||||||
wd.start(WATCHDOG_INTERVAL.ms());
|
|
||||||
wd.feed();
|
|
||||||
|
|
||||||
timer::setup(cp.SYST, clocks);
|
timer::setup(cp.SYST, clocks);
|
||||||
|
|
||||||
let (pins, mut leds, mut eeprom, eth_pins, usb, fan, hwrev, hw_settings) = Pins::setup(
|
let (pins, mut leds, mut eeprom, eth_pins, usb, fan, hwrev, hw_settings) = Pins::setup(
|
||||||
@ -150,6 +146,10 @@ fn main() -> ! {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut wd = IndependentWatchdog::new(dp.IWDG);
|
||||||
|
wd.start(WATCHDOG_INTERVAL.ms());
|
||||||
|
wd.feed();
|
||||||
|
|
||||||
let mut fan_ctrl = FanCtrl::new(fan, hw_settings);
|
let mut fan_ctrl = FanCtrl::new(fan, hw_settings);
|
||||||
|
|
||||||
// default net config:
|
// default net config:
|
||||||
|
Loading…
Reference in New Issue
Block a user