| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- /**
- * pca9685.h
- * PCA9685 16通道PWM驱动器完整头文件
- */
- #ifndef PCA9685_H
- #define PCA9685_H
- #include <stdint.h>
- #include <stdbool.h>
- /* I2C设备地址 */
- #define PCA9685_DEFAULT_ADDR 0x40
- #define PCA9685_GENERAL_CALL 0x00
- /* PCA9685寄存器定义 */
- #define PCA9685_MODE1 0x00
- #define PCA9685_MODE2 0x01
- #define PCA9685_SUBADR1 0x02
- #define PCA9685_SUBADR2 0x03
- #define PCA9685_SUBADR3 0x04
- #define PCA9685_ALLCALLADR 0x05
- #define PCA9685_LED0_ON_L 0x06
- #define PCA9685_LED0_ON_H 0x07
- #define PCA9685_LED0_OFF_L 0x08
- #define PCA9685_LED0_OFF_H 0x09
- #define PCA9685_ALL_LED_ON_L 0xFA
- #define PCA9685_ALL_LED_ON_H 0xFB
- #define PCA9685_ALL_LED_OFF_L 0xFC
- #define PCA9685_ALL_LED_OFF_H 0xFD
- #define PCA9685_PRESCALE 0xFE
- #define PCA9685_TESTMODE 0xFF
- /* MODE1寄存器位定义 */
- #define MODE1_RESTART 0x80
- #define MODE1_EXTCLK 0x40
- #define MODE1_AI 0x20
- #define MODE1_SLEEP 0x10
- #define MODE1_SUB1 0x08
- #define MODE1_SUB2 0x04
- #define MODE1_SUB3 0x02
- #define MODE1_ALLCALL 0x01
- /* MODE2寄存器位定义 */
- #define MODE2_INVRT 0x10
- #define MODE2_OCH 0x08
- #define MODE2_OUTDRV 0x04
- #define MODE2_OUTNE1 0x02
- #define MODE2_OUTNE0 0x01
- /* 参数 */
- #define PCA9685_PWM_RESOLUTION 4096
- #define PCA9685_OSC_FREQ 25000000
- #define PCA9685_MIN_FREQ 24
- #define PCA9685_MAX_FREQ 1526
- /* 错误码 */
- #define PCA9685_OK 0
- #define PCA9685_ERR_OPEN -1
- #define PCA9685_ERR_ADDR -2
- #define PCA9685_ERR_WRITE -3
- #define PCA9685_ERR_READ -4
- #define PCA9685_ERR_PARAM -5
- #define PCA9685_ERR_INIT -6
- /* 设备结构体 */
- typedef struct {
- int fd;
- uint8_t addr;
- float frequency;
- bool is_open;
- } pca9685_t;
- /* 函数声明 */
- int pca9685_init(pca9685_t *dev, const char *i2c_device, uint8_t addr);
- void pca9685_close(pca9685_t *dev);
- int pca9685_reset(pca9685_t *dev);
- int pca9685_write_byte(pca9685_t *dev, uint8_t reg, uint8_t data);
- int pca9685_read_byte(pca9685_t *dev, uint8_t reg, uint8_t *data);
- int pca9685_write_bytes(pca9685_t *dev, uint8_t reg, uint8_t *data, uint8_t len);
- int pca9685_set_pwm_freq(pca9685_t *dev, float freq);
- float pca9685_get_pwm_freq(pca9685_t *dev);
- int pca9685_set_pwm(pca9685_t *dev, uint8_t channel, uint16_t on, uint16_t off);
- int pca9685_set_pwm_duty(pca9685_t *dev, uint8_t channel, float duty_percent);
- int pca9685_set_pwm_percent(pca9685_t *dev, uint8_t channel, uint8_t percent);
- int pca9685_led_on(pca9685_t *dev, uint8_t channel);
- int pca9685_led_off(pca9685_t *dev, uint8_t channel);
- int pca9685_led_full_on(pca9685_t *dev, uint8_t channel);
- int pca9685_led_full_off(pca9685_t *dev, uint8_t channel);
- int pca9685_led_brightness(pca9685_t *dev, uint8_t channel, uint8_t brightness);
- int pca9685_all_off(pca9685_t *dev);
- int pca9685_all_on(pca9685_t *dev);
- int pca9685_all_brightness(pca9685_t *dev, uint8_t brightness);
- int pca9685_set_mode2(pca9685_t *dev, uint8_t mode2_val);
- int pca9685_set_open_drain(pca9685_t *dev, bool enable);
- int pca9685_set_output_invert(pca9685_t *dev, bool invert);
- void pca9685_print_status(pca9685_t *dev);
- int pca9685_verify_connection(pca9685_t *dev);
- #endif
|