1 个不稳定版本
0.1.0 | 2023年2月26日 |
---|
#5 in #pot
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