Updating lockin demo after testing
This commit is contained in:
parent
1ebbe0f6d7
commit
ab7d725235
|
@ -9,10 +9,12 @@ const DAC_SEQUENCE: [f32; 8] =
|
||||||
|
|
||||||
use dsp::{iir, iir_int, lockin::Lockin};
|
use dsp::{iir, iir_int, lockin::Lockin};
|
||||||
use hardware::{Adc1Input, Dac0Output, Dac1Output, AFE0, AFE1};
|
use hardware::{Adc1Input, Dac0Output, Dac1Output, AFE0, AFE1};
|
||||||
use stabilizer::hardware;
|
use stabilizer::{ADC_SAMPLE_TICKS, hardware};
|
||||||
|
|
||||||
const SCALE: f32 = ((1 << 15) - 1) as f32;
|
const SCALE: f32 = ((1 << 15) - 1) as f32;
|
||||||
|
|
||||||
|
const PHASE_SCALING: f32 = 1e12;
|
||||||
|
|
||||||
#[rtic::app(device = stm32h7xx_hal::stm32, peripherals = true, monotonic = rtic::cyccnt::CYCCNT)]
|
#[rtic::app(device = stm32h7xx_hal::stm32, peripherals = true, monotonic = rtic::cyccnt::CYCCNT)]
|
||||||
const APP: () = {
|
const APP: () = {
|
||||||
struct Resources {
|
struct Resources {
|
||||||
|
@ -34,8 +36,18 @@ const APP: () = {
|
||||||
// Configure the microcontroller
|
// Configure the microcontroller
|
||||||
let (mut stabilizer, _pounder) = hardware::setup(c.core, c.device);
|
let (mut stabilizer, _pounder) = hardware::setup(c.core, c.device);
|
||||||
|
|
||||||
|
// The desired corner frequency is always
|
||||||
|
let desired_corner_frequency = 10e3;
|
||||||
|
let gain = 1000.0;
|
||||||
|
|
||||||
|
// Calculate the IIR corner freuqency parameter as a function of the sample rate.
|
||||||
|
let corner_frequency = {
|
||||||
|
let sample_rate = 1.0 / (10e-9 * ADC_SAMPLE_TICKS as f32);
|
||||||
|
desired_corner_frequency / sample_rate
|
||||||
|
};
|
||||||
|
|
||||||
let lockin = Lockin::new(
|
let lockin = Lockin::new(
|
||||||
&iir_int::IIRState::lowpass(1e-3, 0.707, 2.), // TODO: expose
|
&iir_int::IIRState::lowpass(corner_frequency, 0.707, gain), // TODO: expose
|
||||||
);
|
);
|
||||||
|
|
||||||
// Enable ADC/DAC events
|
// Enable ADC/DAC events
|
||||||
|
@ -82,7 +94,8 @@ const APP: () = {
|
||||||
|
|
||||||
// DAC0 always generates a fixed sinusoidal output.
|
// DAC0 always generates a fixed sinusoidal output.
|
||||||
for (i, value) in DAC_SEQUENCE.iter().enumerate() {
|
for (i, value) in DAC_SEQUENCE.iter().enumerate() {
|
||||||
let y = value * i16::MAX as f32;
|
// Full-scale gives a +/- 12V amplitude waveform. Scale it down to give +/- 100mV.
|
||||||
|
let y = value * i16::MAX as f32 / 120.0;
|
||||||
// Note(unsafe): The DAC_SEQUENCE values are guaranteed to be normalized.
|
// Note(unsafe): The DAC_SEQUENCE values are guaranteed to be normalized.
|
||||||
let y = unsafe { y.to_int_unchecked::<i16>() };
|
let y = unsafe { y.to_int_unchecked::<i16>() };
|
||||||
|
|
||||||
|
@ -90,7 +103,6 @@ const APP: () = {
|
||||||
dac_samples[0][i] = y as u16 ^ 0x8000;
|
dac_samples[0][i] = y as u16 ^ 0x8000;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Verify that the DAC code is always generated at T=0
|
|
||||||
let pll_phase = 0i32;
|
let pll_phase = 0i32;
|
||||||
let pll_frequency = 1i32 << (32 - 3); // 1/8 of the sample rate
|
let pll_frequency = 1i32 << (32 - 3); // 1/8 of the sample rate
|
||||||
|
|
||||||
|
@ -120,7 +132,7 @@ const APP: () = {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Filter phase through an IIR.
|
// Filter phase through an IIR.
|
||||||
phase = c.resources.iir.update(&mut c.resources.iir_state, phase);
|
phase = c.resources.iir.update(&mut c.resources.iir_state, phase) * PHASE_SCALING;
|
||||||
|
|
||||||
for value in dac_samples[1].iter_mut() {
|
for value in dac_samples[1].iter_mut() {
|
||||||
*value = phase as u16 ^ 0x8000
|
*value = phase as u16 ^ 0x8000
|
||||||
|
|
Loading…
Reference in New Issue