diff --git a/southbridge/src/main.rs b/southbridge/src/main.rs index 2599bb2..87fc784 100644 --- a/southbridge/src/main.rs +++ b/southbridge/src/main.rs @@ -5,7 +5,7 @@ use core::{panic::PanicInfo, sync::atomic::Ordering}; use common::{Command, Response, SensorData, BAUDRATE}; use embassy_executor::Spawner; -use embassy_rp::{bind_interrupts, block::ImageDef, gpio::{Level, Output}, peripherals::{UART0, UART1, USB}, pwm::{self, Pwm}, uart::{BufferedInterruptHandler, BufferedUart, BufferedUartRx, BufferedUartTx, Config}, usb::Driver}; +use embassy_rp::{adc::{self, Adc}, bind_interrupts, block::ImageDef, gpio::{Level, Output, Pull}, peripherals::{ADC, PIN_28, UART0, UART1, USB}, pwm::{self, Pwm}, uart::{BufferedInterruptHandler, BufferedUart, BufferedUartRx, BufferedUartTx, Config}, usb::Driver}; use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, channel::Channel, once_lock::OnceLock}; use embassy_time::{with_deadline, with_timeout, Duration, Instant, Timer}; use embedded_io_async::{BufRead, Read, Write}; @@ -18,6 +18,7 @@ bind_interrupts!(struct Irqs { I2C1_IRQ => embassy_rp::i2c::InterruptHandler; USBCTRL_IRQ => embassy_rp::usb::InterruptHandler; UART1_IRQ => BufferedInterruptHandler; + ADC_IRQ_FIFO => adc::InterruptHandler; }); pub static COMMANDS: Channel = Channel::new(); @@ -57,6 +58,8 @@ async fn main(spawner: Spawner) { let stopped = drive_conf.clone(); let mut drive_pwm = Pwm::new_output_ab(p.PWM_SLICE0, p.PIN_16, p.PIN_17, stopped.clone()); + spawner.spawn(bus_voltage_monitor(p.ADC, p.PIN_28)).unwrap(); + let config = embassy_rp::i2c::Config::default(); let bus = embassy_rp::i2c::I2c::new_async(p.I2C1, p.PIN_19, p.PIN_18, Irqs, config); @@ -188,3 +191,15 @@ fn calc_speed(speed: f32) -> u16 { (COUNTS_PER_MS * ms) as u16 } + +#[embassy_executor::task] +async fn bus_voltage_monitor(adc: ADC, bus: PIN_28) { + let mut adc = Adc::new(adc, Irqs, adc::Config::default()); + let mut bus_voltage = adc::Channel::new_pin(bus, Pull::None); + + loop { + let level = adc.read(&mut bus_voltage).await.unwrap(); + SENSOR_DATA.send(SensorData::BusVoltage(level as f32)).await; + Timer::after_millis(3).await; + } +}