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 嵌入式开发
548 次每月下载
用于 4 个库(直接使用3个)
55KB
814 代码行
Rust PCA9685 16通道12位I2C PWM/伺服/LED驱动程序
这是一个基于 embedded-hal
特性的PCA9685 PWM/伺服/LED控制器的平台无关Rust驱动程序。如果启用 async
功能,此驱动程序还支持 embedded-hal-async
特性。
此驱动程序允许您
- 启用/禁用设备。参见:
enable()
。 - 设置通道的 on 和 off 计数器或全部通道。参见:
set_channel_on()
。 - 一次性设置通道的 on 和 off 计数器。参见:
set_channel_on_off()
。 - 设置通道始终开启或关闭。参见:
set_channel_full_on()
。 - 一次性设置每个通道的 on 和 off 计数器。参见:
set_all_on_off()
。 - 一次性设置每个通道的 on 和 off 计数器以及始终开启/始终关闭标志。参见:
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 License,版本2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则根据Apache-2.0许可中定义的,任何有意提交以包含在作品中并由您提交的贡献,应如上所述双重许可,不附加任何其他条款或条件。
依赖关系
~1.5MB
~38K SLoC