rsiot/drivers_i2c/ads1115/
config.rs

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