monitor DPLL lock
This commit is contained in:
parent
110c55aefc
commit
743e5278a3
@ -12,6 +12,9 @@ pub struct Dpll {
|
||||
|
||||
phase: i64,
|
||||
phase_unwrapped: i64,
|
||||
|
||||
was_locked: bool,
|
||||
wait_lock: Option<u32>
|
||||
}
|
||||
|
||||
impl Dpll {
|
||||
@ -30,7 +33,9 @@ impl Dpll {
|
||||
ftw: init_ftw,
|
||||
integrator: init_ftw,
|
||||
phase: 0,
|
||||
phase_unwrapped: 0
|
||||
phase_unwrapped: 0,
|
||||
was_locked: false,
|
||||
wait_lock: Some(0)
|
||||
}
|
||||
}
|
||||
|
||||
@ -47,12 +52,36 @@ impl Dpll {
|
||||
self.ftw_min, self.ftw_max);
|
||||
self.ftw = clamp(self.integrator + (pe*self.kp >> 32),
|
||||
self.ftw_min, self.ftw_max);
|
||||
|
||||
if pe.abs() <= (self.ftw + self.ftw/3) {
|
||||
if let Some(wait_lock) = self.wait_lock {
|
||||
if wait_lock < 1000000 {
|
||||
self.wait_lock = Some(wait_lock + 1);
|
||||
} else {
|
||||
self.wait_lock = None;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
self.wait_lock = Some(0);
|
||||
}
|
||||
|
||||
if self.locked() & !self.was_locked {
|
||||
eprintln!("DPLL locked");
|
||||
}
|
||||
if !self.locked() & self.was_locked {
|
||||
eprintln!("DPLL lost lock");
|
||||
}
|
||||
self.was_locked = self.locked();
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_phase_unwrapped(&self) -> i64 {
|
||||
self.phase_unwrapped
|
||||
}
|
||||
|
||||
pub fn locked(&self) -> bool {
|
||||
self.wait_lock.is_none()
|
||||
}
|
||||
}
|
||||
|
||||
pub struct PositionTracker {
|
||||
|
@ -42,11 +42,13 @@ fn main() {
|
||||
let mut decimator = noptica::Decimator::new(config.decimation);
|
||||
noptica::sample(&config.sample_command, |rising, _falling| {
|
||||
refpll.tick(rising & (1 << config.bit_ref) != 0);
|
||||
if refpll.locked() {
|
||||
if rising & (1 << config.bit_meas) != 0 {
|
||||
let position = position_tracker.edge(refpll.get_phase_unwrapped());
|
||||
if let Some(position_avg) = decimator.input(position) {
|
||||
println!("{}", position_avg);
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -59,6 +59,7 @@ fn do_calibrate(config: &Config) {
|
||||
|
||||
noptica::sample(&config.sample_command, |rising, _falling| {
|
||||
refpll.tick(rising & (1 << config.bit_ref) != 0);
|
||||
if refpll.locked() {
|
||||
if rising & (1 << config.bit_meas) != 0 {
|
||||
let position = position_tracker.edge(refpll.get_phase_unwrapped());
|
||||
if position > position_max {
|
||||
@ -77,6 +78,11 @@ fn do_calibrate(config: &Config) {
|
||||
position_min = i64::max_value();
|
||||
position_max = i64::min_value();
|
||||
}
|
||||
} else {
|
||||
sample_count = 0;
|
||||
position_min = i64::max_value();
|
||||
position_max = i64::min_value();
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@ -121,6 +127,7 @@ fn do_wavemeter(config: &Config) {
|
||||
|
||||
noptica::sample(&config.sample_command, |rising, _falling| {
|
||||
refpll.tick(rising & (1 << config.bit_ref) != 0);
|
||||
if refpll.locked() {
|
||||
let position = if rising & (1 << config.bit_meas) != 0 {
|
||||
Some(position_tracker.edge(refpll.get_phase_unwrapped()))
|
||||
} else {
|
||||
@ -131,6 +138,7 @@ fn do_wavemeter(config: &Config) {
|
||||
let fringe_position = motion_tracker.extrapolated_position();
|
||||
println!("{}", (fringe_position as f64)/(noptica::Dpll::TURN as f64));
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user