From 02a4856b9893e8dd936ec32606db2064e2294b12 Mon Sep 17 00:00:00 2001 From: JP Stringham Date: Sat, 24 Jan 2026 09:45:41 -0500 Subject: [PATCH] Various improvements, set to walk through charge duty for testing --- src/main.rs | 83 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 55 insertions(+), 28 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7194ab3..57377eb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -36,7 +36,7 @@ pub static BOOT2: [u8; 256] = rp2040_boot2::BOOT_LOADER_GENERIC_03H; const XTAL_FREQ_HZ: u32 = 12_000_000u32; // below this we won't be able to turn on the transistor (0.6v) -const MIN_DUTY: u16 = 12000; +const MIN_DUTY: u16 = 6000; #[rp2040_hal::entry] fn main() -> ! { @@ -75,19 +75,23 @@ fn main() -> ! { let mut adc_pin = hal::adc::AdcPin::new(pins.gpio26.into_floating_input()).unwrap(); let mut adc_fifo = adc .build_fifo() - .clock_divider(0xFFFF, 0xFF) .set_channel(&mut adc_pin) - .start(); + .clock_divider(47999, 0) + .start_paused(); let mut pwm_slices = hal::pwm::Slices::new(pac.PWM, &mut pac.RESETS); let pwm = &mut pwm_slices.pwm2; - pwm.set_div_int(125); + // info!("PWM Top: {}", pwm.get_top()); pwm.set_ph_correct(); pwm.enable(); let pwm_channel = &mut pwm.channel_a; pwm_channel.output_to(pins.gpio20); + pwm_channel.set_duty_cycle(MIN_DUTY); + + // calibrate + delay.delay_ms(2000); // let mut led_pin = pins.gpio25.into_push_pull_output(); @@ -95,36 +99,59 @@ fn main() -> ! { let mut power = 0; - let mut tick = 0u16; + let mut tick = 19u8; + + let mut peak_v = 0u32; loop { pwm_channel.set_duty_cycle(duty); - duty = duty.saturating_add(2000); - delay.delay_ms(10); - if adc_fifo.len() > 7 { - let mut samps = [0u16; 8]; + delay.delay_ms(500); + adc_fifo.clear(); + adc_fifo.resume(); - for i in 0..8 { - samps[i] = adc_fifo.read(); - } - - let avg = avg_fifo(&samps, false); - let voltage = (avg * 3300) / 4095; - - let new_power = (voltage * (duty - MIN_DUTY) as u32) / 0xFFF; - - if tick % 10 == 0 { - info!("{} duty, {}mV, {} power", duty, voltage, new_power); - } - tick = tick.wrapping_add(1); - - if new_power < power { - duty = MIN_DUTY.max(duty - 3000); - } - - power = new_power; + while adc_fifo.len() < 7 { + delay.delay_us(1); } + + adc_fifo.pause(); + + let mut samps = [0u16; 8]; + + for i in 0..8 { + samps[i] = adc_fifo.read(); + } + + let avg = avg_fifo(&samps, false); + let voltage = (avg * 3300) / 4095; + + let duty_as_pct = (duty - MIN_DUTY) as u32 * 100; + let duty_as_pct = duty_as_pct / (0xFFFF - MIN_DUTY) as u32; + + let new_power = (voltage * (1 + voltage / 100)) * duty_as_pct; + + tick = (tick + 1) % 20; + + if tick == 0 { + info!( + "{} duty, {}mV, {} power, {} peak", + duty_as_pct, voltage, new_power, peak_v + ); + } + + if duty_as_pct == 0 || voltage > peak_v { + peak_v = voltage; + } + + duty = duty.wrapping_add(1000); + duty = MIN_DUTY.max(duty); + // if voltage > (90 * peak_v) / 100 || new_power >= power { + // duty = duty.saturating_add(33); + // } else { + // duty = MIN_DUTY.max(duty - 32); + // } + + power = new_power; } }