rsiot/drivers_i2c/ads1115/config.rs
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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
//! Типы данных для конфигурации устройства ADS1115
use std::time::Duration;
use bitvec::prelude::*;
use crate::message::Message;
/// Конфигурация входного значения
#[derive(Clone)]
pub struct InputConfig<TMsg> {
/// Выбор входа для измерения
pub mux_config: MuxConfig,
/// Диапазон измерения
pub amplifier: Amplifier,
/// Периодичность вызова
pub period: Duration,
/// Функция преобразования измеренного значения в вольтах, в исходящее сообщение
pub fn_output: fn(f64) -> Option<Message<TMsg>>,
}
/// Выбор входа для измерения
#[derive(Clone)]
#[allow(non_camel_case_types)]
pub enum MuxConfig {
/// AINp = AIN0 and AINn = GND
Single_0,
/// AINp = AIN1 and AINn = GND
Single_1,
/// AINp = AIN2 and AINn = GND
Single_2,
/// AINp = AIN3 and AINn = GND
Single_3,
/// AINp = AIN0 and AINn = AIN1
Diff_0_1,
/// AINp = AIN0 and AINn = AIN3
Diff_0_3,
/// AINp = AIN1 and AINn = AIN3
Diff_1_3,
/// AINp = AIN2 and AINn = AIN3
Diff_2_3,
}
/// Диапазон измерения. Задает максимальное значение для масштабирования. Напряжение на входе не
/// должно превышать Vdd + 0,3В!
#[derive(Clone)]
#[allow(non_camel_case_types)]
pub enum Amplifier {
/// ±6.144V
V_6_144,
/// ±4.096V
V_4_096,
/// ±2.048V
V_2_048,
/// ±1.024V
V_1_024,
/// ±0.512V
V_0_512,
/// ±0.256V
V_0_256,
}
impl Amplifier {
/// Максимальное значение преобразования АЦП
pub fn max_value(&self) -> f64 {
match self {
Amplifier::V_6_144 => 6.144,
Amplifier::V_4_096 => 4.096,
Amplifier::V_2_048 => 2.048,
Amplifier::V_1_024 => 1.024,
Amplifier::V_0_512 => 0.512,
Amplifier::V_0_256 => 0.256,
}
}
}
/// Преобразование конфигурации в байты для передачи в ADS1115
pub fn config_to_bytes(mux_config: &MuxConfig, aplifier: &Amplifier) -> [u8; 2] {
let mut config: [u8; 2] = [0, 0];
let config_bits = config.view_bits_mut::<Lsb0>();
// OS: begin single conversion
config_bits.set(15, true);
// MUX: input multiplexer configuration
match mux_config {
MuxConfig::Diff_0_1 => {
config_bits.set(14, false);
config_bits.set(13, false);
config_bits.set(12, false);
}
MuxConfig::Diff_0_3 => {
config_bits.set(14, false);
config_bits.set(13, false);
config_bits.set(12, true);
}
MuxConfig::Diff_1_3 => {
config_bits.set(14, false);
config_bits.set(13, true);
config_bits.set(12, false);
}
MuxConfig::Diff_2_3 => {
config_bits.set(14, false);
config_bits.set(13, true);
config_bits.set(12, true);
}
MuxConfig::Single_0 => {
config_bits.set(14, true);
config_bits.set(13, false);
config_bits.set(12, false);
}
MuxConfig::Single_1 => {
config_bits.set(14, true);
config_bits.set(13, false);
config_bits.set(12, true);
}
MuxConfig::Single_2 => {
config_bits.set(14, true);
config_bits.set(13, true);
config_bits.set(12, false);
}
MuxConfig::Single_3 => {
config_bits.set(14, true);
config_bits.set(13, true);
config_bits.set(12, true);
}
}
// PGA: programmable gain amplifier configuration
match aplifier {
Amplifier::V_6_144 => {
config_bits.set(11, false);
config_bits.set(10, false);
config_bits.set(9, false);
}
Amplifier::V_4_096 => {
config_bits.set(11, false);
config_bits.set(10, false);
config_bits.set(9, true);
}
Amplifier::V_2_048 => {
config_bits.set(11, false);
config_bits.set(10, true);
config_bits.set(9, false);
}
Amplifier::V_1_024 => {
config_bits.set(11, false);
config_bits.set(10, true);
config_bits.set(9, true);
}
Amplifier::V_0_512 => {
config_bits.set(11, true);
config_bits.set(10, false);
config_bits.set(9, false);
}
Amplifier::V_0_256 => {
config_bits.set(11, true);
config_bits.set(10, false);
config_bits.set(9, true);
}
}
// MODE: device operating mode
config_bits.set(8, true);
// DR: data rate
config_bits.set(7, true);
config_bits.set(6, false);
config_bits.set(5, false);
// COMP_MODE
config_bits.set(4, false);
// COMP_POLE
config_bits.set(3, false);
// COMP_LAT
config_bits.set(2, false);
// COMP_QUE
config_bits.set(1, true);
config_bits.set(0, true);
config.swap(0, 1);
config
}
#[cfg(test)]
mod tests {
use super::*;
/// Запуск:
///
/// ```bash
/// cargo test --target x86_64-unknown-linux-gnu --lib --features executor --features cmp_esp -- drivers_i2c::ads1115::config::tests::test1 --exact --show-output
/// ```
#[test]
fn test1() {
let config = config_to_bytes(&MuxConfig::Diff_0_1, &Amplifier::V_2_048);
assert_eq!(config, [0x85, 0x83]);
}
}