max1968: Add IIR filter to Tec Readings

This commit is contained in:
linuswck 2025-01-23 16:15:28 +08:00
parent d8ddd5fb24
commit 5909ead681
3 changed files with 17 additions and 3 deletions

View File

@ -162,7 +162,7 @@ fn main() -> ! {
laser.power_down(); laser.power_down();
thermostat.power_down(); thermostat.power_down();
} }
thermostat.process_tec_readings();
thermostat.start_tec_readings_conversion(); thermostat.start_tec_readings_conversion();
} }

View File

@ -78,6 +78,8 @@ pub struct MAX1968 {
pub pins_adc: Adc<ADC1>, pub pins_adc: Adc<ADC1>,
pub dma_adc: DMA_Transfer<Stream2<DMA2>, 1, Adc<ADC2>, PeripheralToMemory, &'static mut [u16; 16]>, pub dma_adc: DMA_Transfer<Stream2<DMA2>, 1, Adc<ADC2>, PeripheralToMemory, &'static mut [u16; 16]>,
pub dac_out_range: ElectricPotential, pub dac_out_range: ElectricPotential,
vtec_volt_iir: u16,
itec_volt_iir: u16,
prev_vtec_volt: ElectricPotential, prev_vtec_volt: ElectricPotential,
prev_itec_volt: ElectricPotential, prev_itec_volt: ElectricPotential,
} }
@ -243,6 +245,8 @@ impl MAX1968 {
pins_adc: pins_adc1, pins_adc: pins_adc1,
dma_adc: dma_adc, dma_adc: dma_adc,
dac_out_range: dac_out_range, dac_out_range: dac_out_range,
vtec_volt_iir: 1861, // VTEC value centers at 1.5V
itec_volt_iir: 1861, // ITEC value centers at 1.5V
prev_vtec_volt: ElectricPotential::new::<millivolt>(0.0), prev_vtec_volt: ElectricPotential::new::<millivolt>(0.0),
prev_itec_volt: ElectricPotential::new::<millivolt>(0.0), prev_itec_volt: ElectricPotential::new::<millivolt>(0.0),
} }
@ -261,6 +265,10 @@ impl MAX1968 {
} }
pub fn get_tec_readings(&mut self) -> (ElectricPotential, ElectricPotential) { pub fn get_tec_readings(&mut self) -> (ElectricPotential, ElectricPotential) {
(self.prev_vtec_volt, self.prev_itec_volt)
}
pub fn cal_tec_readings(&mut self) -> (ElectricPotential, ElectricPotential) {
if unsafe { DMA_TRANSFER_COMPLETE } { if unsafe { DMA_TRANSFER_COMPLETE } {
let buffer: &[u16; 16]; let buffer: &[u16; 16];
unsafe { unsafe {
@ -276,18 +284,20 @@ impl MAX1968 {
itec += *data; itec += *data;
} }
itec = itec >> 3; itec = itec >> 3;
self.itec_volt_iir = (7 * self.itec_volt_iir + itec) >> 3;
let mut vtec: u16 = 0; let mut vtec: u16 = 0;
for data in buffer.into_iter().skip(1).step_by(2) { for data in buffer.into_iter().skip(1).step_by(2) {
vtec += *data; vtec += *data;
} }
vtec = vtec >> 3; vtec = vtec >> 3;
self.vtec_volt_iir = (7 * self.vtec_volt_iir + vtec) >> 3;
unsafe { unsafe {
ADC2_LOCAL_BUFFER = *buffer; ADC2_LOCAL_BUFFER = *buffer;
} }
self.prev_vtec_volt = ElectricPotential::new::<millivolt>(sample_to_millivolts(vtec) as f32); self.prev_vtec_volt = ElectricPotential::new::<millivolt>(sample_to_millivolts(self.vtec_volt_iir) as f32);
self.prev_itec_volt = ElectricPotential::new::<millivolt>(sample_to_millivolts(itec) as f32); self.prev_itec_volt = ElectricPotential::new::<millivolt>(sample_to_millivolts(self.itec_volt_iir) as f32);
} }
(self.prev_vtec_volt, self.prev_itec_volt) (self.prev_vtec_volt, self.prev_itec_volt)
} }

View File

@ -158,6 +158,10 @@ impl Thermostat {
self.max1968.dma_adc_start_conversion(); self.max1968.dma_adc_start_conversion();
} }
pub fn process_tec_readings(&mut self) {
self.max1968.cal_tec_readings();
}
fn tec_setup(&mut self) { fn tec_setup(&mut self) {
self.power_down(); self.power_down();