mirror of
https://github.com/embassy-rs/embassy.git
synced 2024-11-28 17:52:28 +00:00
Enables adc v4 averaging support.
The Adc v4 peripheral includes a hardware oversampler. This PR adds an averaging interface that keeps most of the current interface backwards compatible while allowing for the common use-case of hardware-averaging. A more comprehensive oversampler interface may be exposed in the future.
This commit is contained in:
parent
cfe8561550
commit
3883a5b2de
@ -126,6 +126,21 @@ impl Prescaler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Number of samples used for averaging.
|
||||||
|
pub enum Averaging {
|
||||||
|
Disabled,
|
||||||
|
Samples2,
|
||||||
|
Samples4,
|
||||||
|
Samples8,
|
||||||
|
Samples16,
|
||||||
|
Samples32,
|
||||||
|
Samples64,
|
||||||
|
Samples128,
|
||||||
|
Samples256,
|
||||||
|
Samples512,
|
||||||
|
Samples1024,
|
||||||
|
}
|
||||||
|
|
||||||
impl<'d, T: Instance> Adc<'d, T> {
|
impl<'d, T: Instance> Adc<'d, T> {
|
||||||
/// Create a new ADC driver.
|
/// Create a new ADC driver.
|
||||||
pub fn new(adc: impl Peripheral<P = T> + 'd) -> Self {
|
pub fn new(adc: impl Peripheral<P = T> + 'd) -> Self {
|
||||||
@ -252,6 +267,29 @@ impl<'d, T: Instance> Adc<'d, T> {
|
|||||||
T::regs().cfgr().modify(|reg| reg.set_res(resolution.into()));
|
T::regs().cfgr().modify(|reg| reg.set_res(resolution.into()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set hardware averaging.
|
||||||
|
pub fn set_averaging(&mut self, averaging: Averaging) {
|
||||||
|
let (enable, samples, right_shift) = match averaging {
|
||||||
|
Averaging::Disabled => (false, 0, 0),
|
||||||
|
Averaging::Samples2 => (true, 1, 1),
|
||||||
|
Averaging::Samples4 => (true, 3, 2),
|
||||||
|
Averaging::Samples8 => (true, 7, 3),
|
||||||
|
Averaging::Samples16 => (true, 15, 4),
|
||||||
|
Averaging::Samples32 => (true, 31, 5),
|
||||||
|
Averaging::Samples64 => (true, 63, 6),
|
||||||
|
Averaging::Samples128 => (true, 127, 7),
|
||||||
|
Averaging::Samples256 => (true, 255, 8),
|
||||||
|
Averaging::Samples512 => (true, 511, 9),
|
||||||
|
Averaging::Samples1024 => (true, 1023, 10),
|
||||||
|
};
|
||||||
|
|
||||||
|
T::regs().cfgr2().modify(|reg| {
|
||||||
|
reg.set_rovse(enable);
|
||||||
|
reg.set_osvr(samples);
|
||||||
|
reg.set_ovss(right_shift);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
/// Perform a single conversion.
|
/// Perform a single conversion.
|
||||||
fn convert(&mut self) -> u16 {
|
fn convert(&mut self) -> u16 {
|
||||||
T::regs().isr().modify(|reg| {
|
T::regs().isr().modify(|reg| {
|
||||||
|
Loading…
Reference in New Issue
Block a user