First working version with slow efc
This commit is contained in:
parent
da7f998847
commit
9afa0ae91f
54
src/main.rs
54
src/main.rs
|
@ -7,7 +7,18 @@ extern crate panic_semihosting;
|
||||||
use cortex_m_rt::entry;
|
use cortex_m_rt::entry;
|
||||||
use embedded_hal::digital::v2::OutputPin;
|
use embedded_hal::digital::v2::OutputPin;
|
||||||
use rtt_target::{rprintln, rtt_init_print};
|
use rtt_target::{rprintln, rtt_init_print};
|
||||||
use stm32f1xx_hal::{delay::Delay, pac, pac::TIM1, pac::TIM2, prelude::*, rcc::Enable, rcc::Reset};
|
use stm32f1xx_hal::{
|
||||||
|
delay::Delay,
|
||||||
|
pac,
|
||||||
|
pac::TIM1,
|
||||||
|
pac::TIM2,
|
||||||
|
prelude::*,
|
||||||
|
rcc::Enable,
|
||||||
|
rcc::Reset,
|
||||||
|
timer::{Tim3NoRemap, Timer},
|
||||||
|
};
|
||||||
|
|
||||||
|
const target_freq: f64 = 10.0f64;
|
||||||
|
|
||||||
#[entry]
|
#[entry]
|
||||||
fn main() -> ! {
|
fn main() -> ! {
|
||||||
|
@ -41,6 +52,15 @@ fn main() -> ! {
|
||||||
// in order to configure the port. For pins 0-7, crl should be passed instead.
|
// in order to configure the port. For pins 0-7, crl should be passed instead.
|
||||||
let mut led = gpioc.pc13.into_push_pull_output(&mut gpioc.crh);
|
let mut led = gpioc.pc13.into_push_pull_output(&mut gpioc.crh);
|
||||||
|
|
||||||
|
let mut afio = dp.AFIO.constrain(&mut rcc.apb2);
|
||||||
|
let mut gpioa = dp.GPIOA.split(&mut rcc.apb2);
|
||||||
|
let pwm_pin = gpioa.pa6.into_alternate_push_pull(&mut gpioa.crl);
|
||||||
|
let mut pwm = Timer::tim3(dp.TIM3, &clocks, &mut rcc.apb1)
|
||||||
|
.pwm::<Tim3NoRemap, _, _, _>(pwm_pin, &mut afio.mapr, 10.khz())
|
||||||
|
.split();
|
||||||
|
|
||||||
|
pwm.enable();
|
||||||
|
|
||||||
// Setup timers
|
// Setup timers
|
||||||
let tim1 = dp.TIM1;
|
let tim1 = dp.TIM1;
|
||||||
|
|
||||||
|
@ -101,6 +121,8 @@ fn main() -> ! {
|
||||||
|
|
||||||
let mut last_ic = 0u32;
|
let mut last_ic = 0u32;
|
||||||
let mut avg = 10f64;
|
let mut avg = 10f64;
|
||||||
|
let max_pwm = pwm.get_max_duty() as f64;
|
||||||
|
let mut cur_pwm = max_pwm / 2.0;
|
||||||
|
|
||||||
// Skip the first measurement, it will be garbage
|
// Skip the first measurement, it will be garbage
|
||||||
while !tim1.sr.read().cc1if().bit_is_set() || !tim2.sr.read().cc1if().bit_is_set() {
|
while !tim1.sr.read().cc1if().bit_is_set() || !tim2.sr.read().cc1if().bit_is_set() {
|
||||||
|
@ -130,14 +152,32 @@ fn main() -> ! {
|
||||||
last_ic = sum_ic;
|
last_ic = sum_ic;
|
||||||
|
|
||||||
let freq = (diff_ic as f64) / 1_000_000f64;
|
let freq = (diff_ic as f64) / 1_000_000f64;
|
||||||
|
let diff = freq - avg;
|
||||||
|
if diff > 0.000_030 || diff < -0.000_030 {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
avg = avg * 0.99 + freq * 0.01;
|
avg = avg * 0.99 + freq * 0.01;
|
||||||
|
|
||||||
|
let error = target_freq - avg;
|
||||||
|
cur_pwm += error * 100000.0;
|
||||||
|
cur_pwm = if cur_pwm < 0.0 {
|
||||||
|
0.0
|
||||||
|
} else if cur_pwm > max_pwm {
|
||||||
|
max_pwm
|
||||||
|
} else {
|
||||||
|
cur_pwm
|
||||||
|
};
|
||||||
|
|
||||||
|
pwm.set_duty(cur_pwm as u16);
|
||||||
|
|
||||||
rprintln!("Counters:");
|
rprintln!("Counters:");
|
||||||
rprintln!("ic1: {}", ic1);
|
rprintln!("ic1:\t{}", ic1);
|
||||||
rprintln!("ic2: {}", ic2);
|
rprintln!("ic2:\t{}", ic2);
|
||||||
rprintln!("sum_ic: {}", sum_ic);
|
rprintln!("sum_ic:\t{}", sum_ic);
|
||||||
rprintln!("diff_ic: {}", diff_ic);
|
rprintln!("diff_ic:\t{}", diff_ic);
|
||||||
rprintln!("freq: {} MHz", freq);
|
rprintln!("freq:\t{} MHz", freq);
|
||||||
rprintln!("avg: {} MHz", avg);
|
rprintln!("avg:\t{} MHz", avg);
|
||||||
|
rprintln!("pwm:\t{}", cur_pwm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue