From ef4c18417684920726edaa6d0d01c85acc3a0abd Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Wed, 17 Feb 2021 21:46:29 +0100 Subject: Calibrate S meter --- sw/picardy/src/main.rs | 37 +++++++++++++++++++++++++++++-------- sw/picardy/src/ui.rs | 4 ++-- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/sw/picardy/src/main.rs b/sw/picardy/src/main.rs index a6a3e4a..22b894b 100644 --- a/sw/picardy/src/main.rs +++ b/sw/picardy/src/main.rs @@ -292,14 +292,8 @@ fn main() -> ! { } previous_vfo = vfo; - let s_meter_value: u16 = adc2.read(&mut s_meter).unwrap(); - - // Avoid 0 because of log10 - let s_meter_value = f32::from(if s_meter_value == 0 { 1 } else { s_meter_value }); - - // ADC is 12-bit, convert to dB full-scale - let s_meter_value = 10f32 * log10f::log10f(f32::from(s_meter_value) / 4092f32); - let s_meter_value = s_meter_value as i32; + let s_meter_adc_value: u16 = adc2.read(&mut s_meter).unwrap(); + let s_meter_value = s_meter_from_adc(s_meter_adc_value); let t_now = ticks_now(); if last_s_meter_update_time + 10 < t_now { update_disp_required = s_meter_value != last_s_meter_value; @@ -322,6 +316,33 @@ fn main() -> ! { } } +fn s_meter_from_adc(adc : u16) -> u8 { + // Avoid 0 because of log10 + let adc = f32::from(if adc == 0 { 1 } else { adc }); + // ADC is 12-bit, convert to dB full-scale + let adc_db = 10f32 * log10f::log10f(adc / 4092f32); + + /* Hand-calibrated lookup table */ + if adc_db <= -35f32 { + 1 + } + else if adc_db <= -20f32 { + 4 + } + else if adc_db <= -12f32 { + 5 + } + else if adc_db <= -8f32 { + 6 + } + else if adc_db <= -7f32 { + 7 + } + else { + 9 + } +} + #[interrupt] fn TIM2() { let timer = unsafe { &mut *CLOCK_TIMER.as_mut_ptr() }; diff --git a/sw/picardy/src/ui.rs b/sw/picardy/src/ui.rs index 9d5a4e4..0170813 100644 --- a/sw/picardy/src/ui.rs +++ b/sw/picardy/src/ui.rs @@ -278,7 +278,7 @@ impl UI { } } -pub fn update_disp(lcd: &mut HD44780, state: &State, delay: &mut Delay, s_meter_value: i32, bfo_tune_fail: bool) +pub fn update_disp(lcd: &mut HD44780, state: &State, delay: &mut Delay, s_meter_value: u8, bfo_tune_fail: bool) { let mut string = arrayvec::ArrayString::<[_; 16]>::new(); @@ -298,7 +298,7 @@ pub fn update_disp(lcd: &mut HD44780, state: if string.len() <= 16 - 4 { // Avoids crash when frequency is very negative - write!(string, "S{:3}", s_meter_value).unwrap(); + write!(string, " S{:1}", s_meter_value).unwrap(); } lcd.set_cursor_pos(0, delay).unwrap(); -- cgit v1.2.3