#driver #codec #增量编码器 #线性编码器 #旋转编码器

无需 std quadrature-encoder

支持全步、半步和四倍步进的全增量编码器驱动程序硬件级实现

2 个版本

0.1.1 2024 年 6 月 5 日
0.1.0 2024 年 5 月 20 日

174嵌入式开发

MPL-2.0 许可证

96KB
1.5K SLoC

quadrature-encoder

Crates.io Crates.io Crates.io docs.rs

支持全步、半步和四倍步进的增量编码器驱动程序的硬件级实现。


增量编码器

use quadrature_encoder::{FullStep, IncrementalEncoder};

let mut encoder: IncrementalEncoder<...> = Default::new(pin_clk, pin_dt);

// Update the encoder with pulse trains `a` and `b` and handle the result:
match encoder.poll() {
    Ok(Some(movement)) => println!("Movement detected: {movement:?}."),
    Ok(None) => println!("No movement detected."),
    Err(error) => println!("Error detected: {error:?}."),
}

// Or, if you only care about correctly detected movement:
if let Some(movement) = encoder.poll().unwrap_or_default() {
    println!("Movement detected: {movement:?}.")
}

println!("Encoder is at position: {:?}.", encoder.position());

请参阅示例目录以获取更全面的示例。

索引增量编码器

当检测到 idx 引脚上的上升沿时,索引编码器会重置其位置。

use quadrature_encoder::{IndexedIncrementalEncoder};

let mut encoder: IndexedIncrementalEncoder<...> = Default::new(pin_clk, pin_dt, pin_idx);

// Update the encoder with pulse trains `a`, `b` and `z` and handle the result:
match encoder.poll() {
    Ok(Some(movement)) => println!("Movement detected: {movement:?}."),
    Ok(None) => println!("No movement detected."),
    Err(error) => println!("Error detected: {error:?}."),
}

// Or, if you only care about correctly detected movement:
if let Some(movement) = encoder.poll().unwrap_or_default() {
    println!("Movement detected: {movement:?}.")
}

println!("Encoder is at position: {:?}.", encoder.position());

请参阅示例目录以获取更全面的示例。

便利别名

由于完整的类型名 IncrementalEncoder<Mode, ..., Step, T> 可能相当复杂,因此提供了一些便利类型别名,用于最常见的用例

旋转编码器

use quadrature_encoder::{RotaryEncoder, IndexedRotaryEncoder};

let mut encoder: RotaryEncoder::new(pin_clk, pin_dt);
let mut indexed_encoder: IndexedRotaryEncoder::new(pin_clk, pin_dt, pin_idx);

线性编码器

use quadrature_encoder::{LinearEncoder, IndexedLinearEncoder};

let mut encoder: LinearEncoder::new(pin_clk, pin_dt);
let mut indexed_encoder: IndexedLinearEncoder::new(pin_clk, pin_dt, pin_idx);

解码策略

全步解码

全步编码器能够在每个正交周期中检测到多达 1 个变化。

use quadrature_encoder::{FullStep, IncrementalEncoder};

let mut encoder: IncrementalEncoder<_, _, FullStep> = Default::new(...);

半步解码

全步编码器能够在每个正交周期中检测到多达 2 个变化。

use quadrature_encoder::{HalfStep, IncrementalEncoder};

let mut encoder: IncrementalEncoder<_, _, HalfStep> = Default::new(...);

四倍步解码

全步编码器能够在每个正交周期中检测到多达 4 个变化。

use quadrature_encoder::{QuadStep, IncrementalEncoder};

let mut encoder: IncrementalEncoder<_, _, QuadStep> = Default::new(...);

文档

请参阅 docs.rs 上的文档。

贡献

请阅读 CONTRIBUTING.md 以了解我们的 行为准则
以及向我们的提交 pull 请求的过程。

版本控制

我们使用 SemVer 进行版本控制。有关可用版本,请参阅此存储库的 标签

许可证

本项目采用 MPL-2.0 许可证 – 有关详细信息,请参阅 LICENSE.md 文件。

依赖项

~210KB