aboutsummaryrefslogtreecommitdiff
path: root/examples/rp235x/src/bin/adc.rs
diff options
context:
space:
mode:
authorCurly <[email protected]>2025-02-23 07:33:58 -0800
committerCurly <[email protected]>2025-02-23 07:33:58 -0800
commit3932835998802fc3abf7cce4f736e072858ebfd1 (patch)
tree5dd714b99bc74a03556c58809237c88691c293bb /examples/rp235x/src/bin/adc.rs
parentc3c67db93e627a4fafe5e1a1123e5cbb4abafe47 (diff)
rename `rp23` (?) folder to `rp235x`; fix `ci.sh` to use `rp235x` folder
Diffstat (limited to 'examples/rp235x/src/bin/adc.rs')
-rw-r--r--examples/rp235x/src/bin/adc.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/examples/rp235x/src/bin/adc.rs b/examples/rp235x/src/bin/adc.rs
new file mode 100644
index 000000000..b7324f755
--- /dev/null
+++ b/examples/rp235x/src/bin/adc.rs
@@ -0,0 +1,48 @@
1//! This example test the ADC (Analog to Digital Conversion) of the RP2350A pins 26, 27 and 28.
2//! It also reads the temperature sensor in the chip.
3
4#![no_std]
5#![no_main]
6
7use defmt::*;
8use embassy_executor::Spawner;
9use embassy_rp::adc::{Adc, Channel, Config, InterruptHandler};
10use embassy_rp::bind_interrupts;
11use embassy_rp::gpio::Pull;
12use embassy_time::Timer;
13use {defmt_rtt as _, panic_probe as _};
14
15bind_interrupts!(struct Irqs {
16 ADC_IRQ_FIFO => InterruptHandler;
17});
18
19#[embassy_executor::main]
20async fn main(_spawner: Spawner) {
21 let p = embassy_rp::init(Default::default());
22 let mut adc = Adc::new(p.ADC, Irqs, Config::default());
23
24 let mut p26 = Channel::new_pin(p.PIN_26, Pull::None);
25 let mut p27 = Channel::new_pin(p.PIN_27, Pull::None);
26 let mut p28 = Channel::new_pin(p.PIN_28, Pull::None);
27 let mut ts = Channel::new_temp_sensor(p.ADC_TEMP_SENSOR);
28
29 loop {
30 let level = adc.read(&mut p26).await.unwrap();
31 info!("Pin 26 ADC: {}", level);
32 let level = adc.read(&mut p27).await.unwrap();
33 info!("Pin 27 ADC: {}", level);
34 let level = adc.read(&mut p28).await.unwrap();
35 info!("Pin 28 ADC: {}", level);
36 let temp = adc.read(&mut ts).await.unwrap();
37 info!("Temp: {} degrees", convert_to_celsius(temp));
38 Timer::after_secs(1).await;
39 }
40}
41
42fn convert_to_celsius(raw_temp: u16) -> f32 {
43 // According to chapter 4.9.5. Temperature Sensor in RP2040 datasheet
44 let temp = 27.0 - (raw_temp as f32 * 3.3 / 4096.0 - 0.706) / 0.001721;
45 let sign = if temp < 0.0 { -1.0 } else { 1.0 };
46 let rounded_temp_x10: i16 = ((temp * 10.0) + 0.5 * sign) as i16;
47 (rounded_temp_x10 as f32) / 10.0
48}