1
Fork 0

send ambient temperature to northbridge

This commit is contained in:
Andy Killorin 2025-02-09 13:49:13 -05:00
parent 025b05e3de
commit 1457a035ee
Signed by: ank
GPG key ID: 23F9463ECB67FE8C

View file

@ -5,7 +5,7 @@ use core::{panic::PanicInfo, sync::atomic::Ordering};
use common::{Command, Response, SensorData, BAUDRATE};
use embassy_executor::Spawner;
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_rp::{adc::{self, Adc}, bind_interrupts, block::ImageDef, gpio::{Level, Output, Pull}, peripherals::{ADC, ADC_TEMP_SENSOR, 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};
@ -58,7 +58,9 @@ 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();
Timer::after_secs(13).await; // pi 0 serial ports act strange during the boot process
spawner.spawn(bus_voltage_monitor(p.ADC, p.PIN_28, p.ADC_TEMP_SENSOR)).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);
@ -193,14 +195,25 @@ fn calc_speed(speed: f32) -> u16 {
}
#[embassy_executor::task]
async fn bus_voltage_monitor(adc: ADC, bus: PIN_28) {
async fn bus_voltage_monitor(adc: ADC, bus: PIN_28, temp: ADC_TEMP_SENSOR) {
let mut adc = Adc::new(adc, Irqs, adc::Config::default());
let mut bus_voltage = adc::Channel::new_pin(bus, Pull::None);
let mut ts = adc::Channel::new_temp_sensor(temp);
// from embassy examples
fn convert_to_celsius(raw_temp: u16) -> f32 {
let temp = 27.0 - (raw_temp as f32 * 3.3 / 4096.0 - 0.706) / 0.001721;
let sign = if temp < 0.0 { -1.0 } else { 1.0 };
let rounded_temp_x10: i16 = ((temp * 10.0) + 0.5 * sign) as i16;
(rounded_temp_x10 as f32) / 10.0
}
loop {
let level = adc.read(&mut bus_voltage).await.unwrap();
// empirically calculated against $20 microcenter voltmeter (10k & 33k divider circuit)
SENSOR_DATA.send(SensorData::BusVoltage(level as f32 / 251.6763848397)).await;
let temp = adc.read(&mut ts).await.unwrap();
SENSOR_DATA.send(SensorData::AmbientTemperature(convert_to_celsius(temp))).await;
Timer::after_millis(3).await;
}
}