/** * pca9685.h * PCA9685 16通道PWM驱动器完整头文件 */ #ifndef PCA9685_H #define PCA9685_H #include #include /* 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