max1968: Add IIR filter to Tec Readings
This commit is contained in:
parent
d8ddd5fb24
commit
5909ead681
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user