aboutsummaryrefslogtreecommitdiff
path: root/examples/rp/src/bin/adc_dma.rs
blob: b42c13fde3ab8f5efab52d6c03bb049ddb82d043 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//! This example shows how to use the RP2040 ADC with DMA, both single- and multichannel reads.
//! For multichannel, the samples are interleaved in the buffer:
//! `[ch1, ch2, ch3, ch4, ch1, ch2, ch3, ch4, ...]`
#![no_std]
#![no_main]

use defmt::*;
use embassy_executor::Spawner;
use embassy_rp::adc::{Adc, Channel, Config, InterruptHandler};
use embassy_rp::bind_interrupts;
use embassy_rp::gpio::Pull;
use embassy_time::{Duration, Ticker};
use {defmt_rtt as _, panic_probe as _};

bind_interrupts!(struct Irqs {
    ADC_IRQ_FIFO => InterruptHandler;
});

#[embassy_executor::main]
async fn main(_spawner: Spawner) {
    let p = embassy_rp::init(Default::default());
    info!("Here we go!");

    let mut adc = Adc::new(p.ADC, Irqs, Config::default());
    let mut dma = p.DMA_CH0;
    let mut pin = Channel::new_pin(p.PIN_26, Pull::Up);
    let mut pins = [
        Channel::new_pin(p.PIN_27, Pull::Down),
        Channel::new_pin(p.PIN_28, Pull::None),
        Channel::new_pin(p.PIN_29, Pull::Up),
        Channel::new_temp_sensor(p.ADC_TEMP_SENSOR),
    ];

    const BLOCK_SIZE: usize = 100;
    const NUM_CHANNELS: usize = 4;
    let mut ticker = Ticker::every(Duration::from_secs(1));
    loop {
        // Read 100 samples from a single channel
        let mut buf = [0_u16; BLOCK_SIZE];
        let div = 479; // 100kHz sample rate (48Mhz / 100kHz - 1)
        adc.read_many(&mut pin, &mut buf, div, dma.reborrow()).await.unwrap();
        info!("single: {:?} ...etc", buf[..8]);

        // Read 100 samples from 4 channels interleaved
        let mut buf = [0_u16; { BLOCK_SIZE * NUM_CHANNELS }];
        let div = 119; // 100kHz sample rate (48Mhz / 100kHz * 4ch - 1)
        adc.read_many_multichannel(&mut pins, &mut buf, div, dma.reborrow())
            .await
            .unwrap();
        info!("multi:  {:?} ...etc", buf[..NUM_CHANNELS * 2]);

        ticker.next().await;
    }
}