#led-driver #pwm #driver #servo #led #led-controller #embedded-hal-driver

无需std pwm-pca9685

适用于PCA9685 I2C 16通道、12位PWM/伺服/LED控制器的平台无关Rust驱动程序

7个版本 (1个稳定版本)

1.0.0 2024年4月5日
0.3.1 2021年7月14日
0.3.0 2020年9月3日
0.2.0 2019年12月10日
0.1.0 2018年11月26日

#49 in 嵌入式开发

Download history 125/week @ 2024-04-21 93/week @ 2024-04-28 65/week @ 2024-05-05 87/week @ 2024-05-12 110/week @ 2024-05-19 84/week @ 2024-05-26 96/week @ 2024-06-02 61/week @ 2024-06-09 72/week @ 2024-06-16 99/week @ 2024-06-23 14/week @ 2024-06-30 107/week @ 2024-07-07 90/week @ 2024-07-14 75/week @ 2024-07-21 242/week @ 2024-07-28 131/week @ 2024-08-04

548 次每月下载
用于 4 个库(直接使用3个)

MIT/Apache

55KB
814 代码行

Rust PCA9685 16通道12位I2C PWM/伺服/LED驱动程序

crates.io Docs Minimum Supported Rust Version Build Status Coverage Status

这是一个基于 embedded-hal 特性的PCA9685 PWM/伺服/LED控制器的平台无关Rust驱动程序。如果启用 async 功能,此驱动程序还支持 embedded-hal-async 特性。

此驱动程序允许您

  • 启用/禁用设备。参见:enable()
  • 设置通道的 onoff 计数器或全部通道。参见:set_channel_on()
  • 一次性设置通道的 onoff 计数器。参见:set_channel_on_off()
  • 设置通道始终开启或关闭。参见:set_channel_full_on()
  • 一次性设置每个通道的 onoff 计数器。参见:set_all_on_off()
  • 一次性设置每个通道的 onoff 计数器以及始终开启/始终关闭标志。参见:set_all_channels()
  • 设置预分频值。参见:set_prescale()
  • 选择输出逻辑状态直接或反相。参见:set_output_logic_state()
  • 设置何时更改输出。参见:set_output_change_behavior()
  • 设置输出驱动配置。见:set_output_driver()
  • 设置输出禁用时的输出值。见:set_disabled_output_value()]
  • 选择EXTCLK引脚作为时钟源。见:use_external_clock()
  • 启用/禁用可编程地址。见:enable_programmable_address()
  • 设置可编程地址。见:set_programmable_address()
  • 更改驱动程序使用的地址。见:set_address()
  • 重启同时保持PWM寄存器内容。见:enable_restart_and_disable()

介绍性博客文章

设备

本设备是一个由I2C总线控制的16通道、12位PWM控制器。其输出可用于控制伺服电机或LED,例如。

每个通道输出都有自己的12位分辨率(4096步)固定频率独立PWM控制器,该控制器在24 Hz到1526 Hz的可编程频率下运行,占空比可从0%调整到100%。所有输出都设置为相同的PWM频率。

每个通道输出可以是关闭或开启(无PWM控制),或设置为各自的PWM控制器值。输出驱动器被编程为开漏,在5 V下具有25 mA的电流吸收能力,或者为总线型,在5 V下具有25 mA的吸收能力和10 mA的源能力。PCA9685在2.3 V至5.5 V的供电电压范围内运行,输入和输出耐5.5 V电压。LED可以直接连接到输出(高达25 mA,5.5 V),或通过外部驱动器和少量离散元件进行控制,以用于大电流、高电压LED等。它优化用于红/绿/蓝/黄(RGBA)颜色背光应用中的LED控制器。

数据手册:PCA9685

用法

请在此存储库中查找更多示例: driver-examples

要使用此驱动程序,导入此crate和embedded_hal实现,然后实例化适当的设备。

在此示例中,我们设置了通道0的PWM频率为60 Hz,占空比为50%。

use linux_embedded_hal::I2cdev;
use pwm_pca9685::{Address, Channel, Pca9685};

fn main() {
    let dev = I2cdev::new("/dev/i2c-1").unwrap();
    let address = Address::default();
    let mut pwm = Pca9685::new(dev, address).unwrap();

    // This corresponds to a frequency of 60 Hz.
    pwm.set_prescale(100).unwrap();

    // It is necessary to enable the device.
    pwm.enable().unwrap();

    // Turn on channel 0 at 0.
    pwm.set_channel_on(Channel::C0, 0).unwrap();

    // Turn off channel 0 at 2047, which is 50% in
    // the range `[0..4095]`.
    pwm.set_channel_off(Channel::C0, 2047).unwrap();

    let _dev = pwm.destroy(); // Get the I2C device back
}

相同的设置,但在RP2040上的Embassy框架中异步

# Cargo.toml
pwm-pca9685 = { version = "1.0.0", features = ["async"] }
#![no_std]
#![no_main]

use embassy_executor::Spawner;
use embassy_rp::{bind_interrupts, i2c};
use embassy_rp::peripherals::I2C0;
use embassy_time::Timer;
use panic_halt as _;
use pwm_pca9685::{Address, Channel, Pca9685};

bind_interrupts!(struct Irqs {
    I2C0_IRQ => i2c::InterruptHandler<I2C0>;
});

#[embassy_executor::main]
async fn main(_spawner: Spawner) {
    let p = embassy_rp::init(Default::default());
    let i2c = i2c::I2c::new_async(p.I2C0, p.PIN_1, p.PIN_0, Irqs, i2c::Config::default());

    let address = Address::default();
    let mut pwm = Pca9685::new(dev, address).await.unwrap();

    // This corresponds to a frequency of 60 Hz.
    pwm.set_prescale(100).await.unwrap();

    // It is necessary to enable the device.
    pwm.enable().await.unwrap();

    // Turn on channel 0 at 0.
    pwm.set_channel_on(Channel::C0, 0).await.unwrap();

    // Turn off channel 0 at 2047, which is 50% in
    // the range `[0..4095]`.
    pwm.set_channel_off(Channel::C0, 2047).await.unwrap();

    let _dev = pwm.destroy(); // Get the I2C device back
}

支持

有关问题、问题、功能请求和其他更改,请在此github项目中提交问题

许可

根据您的选择,许可如下

贡献

除非您明确声明,否则根据Apache-2.0许可中定义的,任何有意提交以包含在作品中并由您提交的贡献,应如上所述双重许可,不附加任何其他条款或条件。

依赖关系

~1.5MB
~38K SLoC