#smoothing #potentiometer #signal #analog #movement #pot #input

无std pot-conditioner

模拟电位计读数信号调节器

1 个不稳定版本

0.1.0 2023年2月26日

#5 in #pot

MIT 许可协议

10KB
120

pot-conditioner

no_std Rust 包,用于改善连接到嵌入式系统ADC的模拟电位计读数。

关于

使用电位计作为参数控制是一个常见任务。由于电气和机械不稳定性有多个原因,ADC的读数通常不稳定,并且随着时间的推移在一定范围内变化。这可能导致各种问题,尤其是在基于事件架构生成消息时。该包旨在通过多种方式调节ADC输入信号来改善读数

  • 通过dyn-smooth 包实现自适应噪声过滤。
  • 通过backlash 包补偿机械不稳定性。
  • 运动检测。
  • 值缩放。

使用示例

此示例展示了使用典型12位内置ADC的设置,如各种MCU中可用。根据个别组件和噪声环境,可实现的结果可能会有所不同。

use pot_conditioner::PotConditioner;

// Sampling rate in Hz. Should be in range 50-1000Hz.
const SAMPLING_RATE: i32 = 100;

// Minimum and maximum values from ADC. It is recommended to use some margin here.
const ADC_RANGE: (i32, i32) = (10, 4085);

// Minimum and maximum output values.
const OUTPUT_RANGE: (i32, i32) = (0, 1023);

/// Threshold for movement detection. Should be as low as possible, but high
/// enough to prevent accidential detection.
const MOVEMENT_THRESHOLD: i32 = 30;

// Create an instance of the conditioner.
let mut pot = PotConditioner::new(SAMPLING_RATE, ADC_RANGE, OUTPUT_RANGE);

// Set the threshold for the movement detection.
pot.set_movement_threshold(MOVEMENT_THRESHOLD);

// Some dummy input values. In reality, read them from the ADC.
let input_values = [503, 847, 1050, 1030, 1052, 1049, 1047, 1052, 1050];

for (tick, input_value) in input_values.into_iter().enumerate() {
    let output_value = pot.update(input_value, tick as u64);
    println!("{}", output_value);

    // Movement is detected when the threshold is reached.
    if pot.moved() {
        println!("Movement detected.");
    }
}

进一步建议

  • 如果您的ADC支持内部过采样,请启用此功能以获取更少噪声的输入信号。
  • 使用基于时间的动态检测阈值,在一段时间未使用电位计后使其对电位计不那么敏感。这也可以提高对长期漂移(例如,由温度变化引起)的免疫力。

测试

运行 cargo test 以进行单元测试。使用 --nocapture 标志以显示测试输出。

许可协议

在MIT许可协议下发布。对项目的任何贡献都必须在相同的许可条件下提供。

作者:Oliver Rockstedt [email protected]

依赖项

~31KB