From bbcaab13bc074d8223b43d8e05682b708c192d78 Mon Sep 17 00:00:00 2001 From: crispaudio Date: Mon, 8 Sep 2025 09:10:16 +0200 Subject: mspm0-adc: add adc with examples --- examples/mspm0g3507/src/bin/adc.rs | 48 ++++++++++++++++++++++++++++++++++++++ examples/mspm0l1306/src/bin/adc.rs | 48 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 examples/mspm0g3507/src/bin/adc.rs create mode 100644 examples/mspm0l1306/src/bin/adc.rs (limited to 'examples') diff --git a/examples/mspm0g3507/src/bin/adc.rs b/examples/mspm0g3507/src/bin/adc.rs new file mode 100644 index 000000000..fed8b9dd3 --- /dev/null +++ b/examples/mspm0g3507/src/bin/adc.rs @@ -0,0 +1,48 @@ +#![no_std] +#![no_main] + +use defmt::*; +use embassy_executor::Spawner; +use embassy_mspm0::adc::{self, Adc, AdcChannel, AdcConfig, Resolution, Vrsel}; +use embassy_mspm0::{bind_interrupts, peripherals, Config}; +use embassy_time::Timer; +use {defmt_rtt as _, panic_halt as _}; + +bind_interrupts!(struct Irqs { + ADC0 => adc::InterruptHandler; +}); + +#[embassy_executor::main] +async fn main(_spawner: Spawner) -> ! { + info!("Hello world!"); + let p = embassy_mspm0::init(Config::default()); + + let adc_config = AdcConfig { + resolution: Resolution::BIT12, + vr_select: Vrsel::VddaVssa, + sample_time: 50, + }; + + // Configure adc with sequence 0 to 1 + let mut adc = Adc::new_async(p.ADC0, adc_config, Irqs); + let pin1 = p.PA22.degrade_adc(); + let pin2 = p.PB20.degrade_adc(); + let sequence = [(&pin1, Vrsel::VddaVssa), (&pin2, Vrsel::VddaVssa)]; + let mut readings = [0u16; 2]; + let mut pin3 = p.PA27; + + loop { + let r = adc.read_channel(&mut pin3).await; + info!("Raw adc PA27: {}", r); + // With a voltage range of 0-3.3V and a resolution of 12 bits, the raw value can be + // approximated to voltage (~0.0008 per step). + let mut x = r as u32; + x = x * 8; + info!("Adc voltage PA27: {},{:#04}", x / 10_000, x % 10_000); + // Read a sequence of channels + adc.read_sequence(sequence.into_iter(), &mut readings).await; + info!("Raw adc sequence: {}", readings); + + Timer::after_millis(400).await; + } +} diff --git a/examples/mspm0l1306/src/bin/adc.rs b/examples/mspm0l1306/src/bin/adc.rs new file mode 100644 index 000000000..9ede31fed --- /dev/null +++ b/examples/mspm0l1306/src/bin/adc.rs @@ -0,0 +1,48 @@ +#![no_std] +#![no_main] + +use defmt::*; +use embassy_executor::Spawner; +use embassy_mspm0::adc::{self, Adc, AdcChannel, AdcConfig, Resolution, Vrsel}; +use embassy_mspm0::{bind_interrupts, peripherals, Config}; +use embassy_time::Timer; +use {defmt_rtt as _, panic_halt as _}; + +bind_interrupts!(struct Irqs { + ADC0 => adc::InterruptHandler; +}); + +#[embassy_executor::main] +async fn main(_spawner: Spawner) -> ! { + info!("Hello world!"); + let p = embassy_mspm0::init(Config::default()); + + let adc_config = AdcConfig { + resolution: Resolution::BIT12, + vr_select: Vrsel::VddaVssa, + sample_time: 50, + }; + + // Configure adc with sequence 0 to 1 + let mut adc = Adc::new_async(p.ADC0, adc_config, Irqs); + let pin1 = p.PA22.degrade_adc(); + let pin2 = p.PA20.degrade_adc(); + let sequence = [(&pin1, Vrsel::VddaVssa), (&pin2, Vrsel::VddaVssa)]; + let mut readings = [0u16; 2]; + let mut pin3 = p.PA27; + + loop { + let r = adc.read_channel(&mut pin3).await; + info!("Raw adc PA27: {}", r); + // With a voltage range of 0-3.3V and a resolution of 12 bits, the raw value can be + // approximated to voltage (~0.0008 per step). + let mut x = r as u32; + x = x * 8; + info!("Adc voltage PA27: {},{:#04}", x / 10_000, x % 10_000); + // Read a sequence of channels + adc.read_sequence(sequence.into_iter(), &mut readings).await; + info!("Raw adc sequence: {}", readings); + + Timer::after_millis(400).await; + } +} -- cgit From 7b9fe7e6398a8bce236da904b251b4cb424150fb Mon Sep 17 00:00:00 2001 From: crispaudio Date: Tue, 9 Sep 2025 22:21:10 +0200 Subject: mspm0-adc: remove dynamic vrsel and cleanup --- examples/mspm0g3507/src/bin/adc.rs | 10 ++-------- examples/mspm0l1306/src/bin/adc.rs | 10 ++-------- 2 files changed, 4 insertions(+), 16 deletions(-) (limited to 'examples') diff --git a/examples/mspm0g3507/src/bin/adc.rs b/examples/mspm0g3507/src/bin/adc.rs index fed8b9dd3..73711c75c 100644 --- a/examples/mspm0g3507/src/bin/adc.rs +++ b/examples/mspm0g3507/src/bin/adc.rs @@ -3,7 +3,7 @@ use defmt::*; use embassy_executor::Spawner; -use embassy_mspm0::adc::{self, Adc, AdcChannel, AdcConfig, Resolution, Vrsel}; +use embassy_mspm0::adc::{self, Adc, AdcChannel, Vrsel}; use embassy_mspm0::{bind_interrupts, peripherals, Config}; use embassy_time::Timer; use {defmt_rtt as _, panic_halt as _}; @@ -17,14 +17,8 @@ async fn main(_spawner: Spawner) -> ! { info!("Hello world!"); let p = embassy_mspm0::init(Config::default()); - let adc_config = AdcConfig { - resolution: Resolution::BIT12, - vr_select: Vrsel::VddaVssa, - sample_time: 50, - }; - // Configure adc with sequence 0 to 1 - let mut adc = Adc::new_async(p.ADC0, adc_config, Irqs); + let mut adc = Adc::new_async(p.ADC0, Default::default(), Irqs); let pin1 = p.PA22.degrade_adc(); let pin2 = p.PB20.degrade_adc(); let sequence = [(&pin1, Vrsel::VddaVssa), (&pin2, Vrsel::VddaVssa)]; diff --git a/examples/mspm0l1306/src/bin/adc.rs b/examples/mspm0l1306/src/bin/adc.rs index 9ede31fed..a0c2c0cff 100644 --- a/examples/mspm0l1306/src/bin/adc.rs +++ b/examples/mspm0l1306/src/bin/adc.rs @@ -3,7 +3,7 @@ use defmt::*; use embassy_executor::Spawner; -use embassy_mspm0::adc::{self, Adc, AdcChannel, AdcConfig, Resolution, Vrsel}; +use embassy_mspm0::adc::{self, Adc, AdcChannel, Vrsel}; use embassy_mspm0::{bind_interrupts, peripherals, Config}; use embassy_time::Timer; use {defmt_rtt as _, panic_halt as _}; @@ -17,14 +17,8 @@ async fn main(_spawner: Spawner) -> ! { info!("Hello world!"); let p = embassy_mspm0::init(Config::default()); - let adc_config = AdcConfig { - resolution: Resolution::BIT12, - vr_select: Vrsel::VddaVssa, - sample_time: 50, - }; - // Configure adc with sequence 0 to 1 - let mut adc = Adc::new_async(p.ADC0, adc_config, Irqs); + let mut adc = Adc::new_async(p.ADC0, Default::default(), Irqs); let pin1 = p.PA22.degrade_adc(); let pin2 = p.PA20.degrade_adc(); let sequence = [(&pin1, Vrsel::VddaVssa), (&pin2, Vrsel::VddaVssa)]; -- cgit From 31b5a3f0a4fafd425aef34b9d6fb93ead851b4c6 Mon Sep 17 00:00:00 2001 From: crispaudio Date: Sun, 14 Sep 2025 01:34:49 +0200 Subject: mspm0-adc: implement From for AnyAdcChannel --- examples/mspm0g3507/src/bin/adc.rs | 9 +++------ examples/mspm0l1306/src/bin/adc.rs | 9 +++------ 2 files changed, 6 insertions(+), 12 deletions(-) (limited to 'examples') diff --git a/examples/mspm0g3507/src/bin/adc.rs b/examples/mspm0g3507/src/bin/adc.rs index 73711c75c..ceccc7c02 100644 --- a/examples/mspm0g3507/src/bin/adc.rs +++ b/examples/mspm0g3507/src/bin/adc.rs @@ -3,7 +3,7 @@ use defmt::*; use embassy_executor::Spawner; -use embassy_mspm0::adc::{self, Adc, AdcChannel, Vrsel}; +use embassy_mspm0::adc::{self, Adc, Vrsel}; use embassy_mspm0::{bind_interrupts, peripherals, Config}; use embassy_time::Timer; use {defmt_rtt as _, panic_halt as _}; @@ -19,14 +19,11 @@ async fn main(_spawner: Spawner) -> ! { // Configure adc with sequence 0 to 1 let mut adc = Adc::new_async(p.ADC0, Default::default(), Irqs); - let pin1 = p.PA22.degrade_adc(); - let pin2 = p.PB20.degrade_adc(); - let sequence = [(&pin1, Vrsel::VddaVssa), (&pin2, Vrsel::VddaVssa)]; + let sequence = [(&p.PA22.into(), Vrsel::VddaVssa), (&p.PB20.into(), Vrsel::VddaVssa)]; let mut readings = [0u16; 2]; - let mut pin3 = p.PA27; loop { - let r = adc.read_channel(&mut pin3).await; + let r = adc.read_channel(&p.PA27).await; info!("Raw adc PA27: {}", r); // With a voltage range of 0-3.3V and a resolution of 12 bits, the raw value can be // approximated to voltage (~0.0008 per step). diff --git a/examples/mspm0l1306/src/bin/adc.rs b/examples/mspm0l1306/src/bin/adc.rs index a0c2c0cff..2806b98cc 100644 --- a/examples/mspm0l1306/src/bin/adc.rs +++ b/examples/mspm0l1306/src/bin/adc.rs @@ -3,7 +3,7 @@ use defmt::*; use embassy_executor::Spawner; -use embassy_mspm0::adc::{self, Adc, AdcChannel, Vrsel}; +use embassy_mspm0::adc::{self, Adc, Vrsel}; use embassy_mspm0::{bind_interrupts, peripherals, Config}; use embassy_time::Timer; use {defmt_rtt as _, panic_halt as _}; @@ -19,14 +19,11 @@ async fn main(_spawner: Spawner) -> ! { // Configure adc with sequence 0 to 1 let mut adc = Adc::new_async(p.ADC0, Default::default(), Irqs); - let pin1 = p.PA22.degrade_adc(); - let pin2 = p.PA20.degrade_adc(); - let sequence = [(&pin1, Vrsel::VddaVssa), (&pin2, Vrsel::VddaVssa)]; + let sequence = [(&p.PA22.into(), Vrsel::VddaVssa), (&p.PA20.into(), Vrsel::VddaVssa)]; let mut readings = [0u16; 2]; - let mut pin3 = p.PA27; loop { - let r = adc.read_channel(&mut pin3).await; + let r = adc.read_channel(&p.PA27).await; info!("Raw adc PA27: {}", r); // With a voltage range of 0-3.3V and a resolution of 12 bits, the raw value can be // approximated to voltage (~0.0008 per step). -- cgit