Switched to integer math to save flash space
This commit is contained in:
parent
c2b7bf9e1e
commit
6dd49234df
|
@ -66,7 +66,7 @@ mod app {
|
||||||
buffer: Vec<u8, USB_BUFFER_SIZE>,
|
buffer: Vec<u8, USB_BUFFER_SIZE>,
|
||||||
}
|
}
|
||||||
|
|
||||||
const TARGET_FREQ: f64 = 10.0f64;
|
const TARGET_FREQ: u64 = 10_000_000_000; // in millihertz
|
||||||
|
|
||||||
#[init]
|
#[init]
|
||||||
fn init(cx: init::Context) -> (Shared, Local) {
|
fn init(cx: init::Context) -> (Shared, Local) {
|
||||||
|
@ -288,11 +288,11 @@ mod app {
|
||||||
|
|
||||||
let mut last_ic = ic2 << 16 | ic1;
|
let mut last_ic = ic2 << 16 | ic1;
|
||||||
|
|
||||||
let mut samples: [f64; WINDOW_LEN] = [10.0; WINDOW_LEN];
|
let mut samples: [u64; WINDOW_LEN] = [10_000_000_000; WINDOW_LEN];
|
||||||
let mut short_avg: f64 = 10.0;
|
let mut short_avg: u64 = 10_000_000_000;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let mut last_freq = 10.0f64;
|
let mut last_freq: u64 = 10_000_000_000;
|
||||||
|
|
||||||
let mut count = 0;
|
let mut count = 0;
|
||||||
while count < WINDOW_LEN {
|
while count < WINDOW_LEN {
|
||||||
|
@ -317,26 +317,28 @@ mod app {
|
||||||
|
|
||||||
last_ic = sum_ic;
|
last_ic = sum_ic;
|
||||||
|
|
||||||
let freq = (diff_ic as f64) / 1_000_000f64;
|
let freq = (diff_ic as u64) * 1000;
|
||||||
defmt::info!("freq:\t{} MHz", freq);
|
defmt::info!("freq:\t{} mHz", freq as i64);
|
||||||
|
defmt::info!("last_freq:\t{} mHz", last_freq as i64);
|
||||||
|
|
||||||
let diff = freq - last_freq;
|
let diff = freq as i64 - last_freq as i64;
|
||||||
last_freq = freq;
|
last_freq = freq;
|
||||||
if diff > 0.000_100 || diff < -0.000_100 {
|
if diff.abs() > 50_000 {
|
||||||
defmt::info!("Out of range, dropping sample.");
|
defmt::info!("Out of range, dropping sample.");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
samples[count] = freq;
|
samples[count] = freq;
|
||||||
short_avg = 0.0;
|
short_avg = 0;
|
||||||
for i in 0..WINDOW_LEN {
|
for i in 0..WINDOW_LEN {
|
||||||
short_avg += samples[i] / WINDOW_LEN as f64;
|
short_avg += samples[i];
|
||||||
}
|
}
|
||||||
defmt::info!("short_avg:\t{} MHz", short_avg);
|
short_avg = short_avg / WINDOW_LEN as u64;
|
||||||
|
defmt::info!("short_avg:\t{} mHz", short_avg);
|
||||||
|
|
||||||
cx.shared.device_status.lock(|device_status| {
|
cx.shared.device_status.lock(|device_status| {
|
||||||
device_status.measured_frequency = freq;
|
device_status.measured_frequency = (freq as f64) / 1_000_000_000.0;
|
||||||
device_status.average_frequency = short_avg;
|
device_status.average_frequency = (short_avg as f64) / 1_000_000_000.0;
|
||||||
device_status.pwm = cur_pwm as u16;
|
device_status.pwm = cur_pwm as u16;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -344,14 +346,12 @@ mod app {
|
||||||
board_led.toggle();
|
board_led.toggle();
|
||||||
}
|
}
|
||||||
|
|
||||||
defmt::info!("short_avg:\t{} MHz", short_avg);
|
let diff = TARGET_FREQ as i64 - short_avg as i64;
|
||||||
|
if diff.abs() > 100 {
|
||||||
let diff = (TARGET_FREQ - short_avg) * 1_000_000.0;
|
cur_pwm += (diff * 30 / 1000) as i32;
|
||||||
if diff > 0.1 || diff < -0.1 {
|
} else if diff < -10 {
|
||||||
cur_pwm += (diff * 30.0) as i32;
|
|
||||||
} else if diff < -0.01 {
|
|
||||||
cur_pwm -= 1;
|
cur_pwm -= 1;
|
||||||
} else if diff > 0.01 {
|
} else if diff > 10 {
|
||||||
cur_pwm += 1;
|
cur_pwm += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue