pca9685.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /**
  2. * pca9685.h
  3. * PCA9685 16通道PWM驱动器完整头文件
  4. */
  5. #ifndef PCA9685_H
  6. #define PCA9685_H
  7. #include <stdint.h>
  8. #include <stdbool.h>
  9. /* I2C设备地址 */
  10. #define PCA9685_DEFAULT_ADDR 0x40
  11. #define PCA9685_GENERAL_CALL 0x00
  12. /* PCA9685寄存器定义 */
  13. #define PCA9685_MODE1 0x00
  14. #define PCA9685_MODE2 0x01
  15. #define PCA9685_SUBADR1 0x02
  16. #define PCA9685_SUBADR2 0x03
  17. #define PCA9685_SUBADR3 0x04
  18. #define PCA9685_ALLCALLADR 0x05
  19. #define PCA9685_LED0_ON_L 0x06
  20. #define PCA9685_LED0_ON_H 0x07
  21. #define PCA9685_LED0_OFF_L 0x08
  22. #define PCA9685_LED0_OFF_H 0x09
  23. #define PCA9685_ALL_LED_ON_L 0xFA
  24. #define PCA9685_ALL_LED_ON_H 0xFB
  25. #define PCA9685_ALL_LED_OFF_L 0xFC
  26. #define PCA9685_ALL_LED_OFF_H 0xFD
  27. #define PCA9685_PRESCALE 0xFE
  28. #define PCA9685_TESTMODE 0xFF
  29. /* MODE1寄存器位定义 */
  30. #define MODE1_RESTART 0x80
  31. #define MODE1_EXTCLK 0x40
  32. #define MODE1_AI 0x20
  33. #define MODE1_SLEEP 0x10
  34. #define MODE1_SUB1 0x08
  35. #define MODE1_SUB2 0x04
  36. #define MODE1_SUB3 0x02
  37. #define MODE1_ALLCALL 0x01
  38. /* MODE2寄存器位定义 */
  39. #define MODE2_INVRT 0x10
  40. #define MODE2_OCH 0x08
  41. #define MODE2_OUTDRV 0x04
  42. #define MODE2_OUTNE1 0x02
  43. #define MODE2_OUTNE0 0x01
  44. /* 参数 */
  45. #define PCA9685_PWM_RESOLUTION 4096
  46. #define PCA9685_OSC_FREQ 25000000
  47. #define PCA9685_MIN_FREQ 24
  48. #define PCA9685_MAX_FREQ 1526
  49. /* 错误码 */
  50. #define PCA9685_OK 0
  51. #define PCA9685_ERR_OPEN -1
  52. #define PCA9685_ERR_ADDR -2
  53. #define PCA9685_ERR_WRITE -3
  54. #define PCA9685_ERR_READ -4
  55. #define PCA9685_ERR_PARAM -5
  56. #define PCA9685_ERR_INIT -6
  57. /* 设备结构体 */
  58. typedef struct {
  59. int fd;
  60. uint8_t addr;
  61. float frequency;
  62. bool is_open;
  63. } pca9685_t;
  64. /* 函数声明 */
  65. int pca9685_init(pca9685_t *dev, const char *i2c_device, uint8_t addr);
  66. void pca9685_close(pca9685_t *dev);
  67. int pca9685_reset(pca9685_t *dev);
  68. int pca9685_write_byte(pca9685_t *dev, uint8_t reg, uint8_t data);
  69. int pca9685_read_byte(pca9685_t *dev, uint8_t reg, uint8_t *data);
  70. int pca9685_write_bytes(pca9685_t *dev, uint8_t reg, uint8_t *data, uint8_t len);
  71. int pca9685_set_pwm_freq(pca9685_t *dev, float freq);
  72. float pca9685_get_pwm_freq(pca9685_t *dev);
  73. int pca9685_set_pwm(pca9685_t *dev, uint8_t channel, uint16_t on, uint16_t off);
  74. int pca9685_set_pwm_duty(pca9685_t *dev, uint8_t channel, float duty_percent);
  75. int pca9685_set_pwm_percent(pca9685_t *dev, uint8_t channel, uint8_t percent);
  76. int pca9685_led_on(pca9685_t *dev, uint8_t channel);
  77. int pca9685_led_off(pca9685_t *dev, uint8_t channel);
  78. int pca9685_led_full_on(pca9685_t *dev, uint8_t channel);
  79. int pca9685_led_full_off(pca9685_t *dev, uint8_t channel);
  80. int pca9685_led_brightness(pca9685_t *dev, uint8_t channel, uint8_t brightness);
  81. int pca9685_all_off(pca9685_t *dev);
  82. int pca9685_all_on(pca9685_t *dev);
  83. int pca9685_all_brightness(pca9685_t *dev, uint8_t brightness);
  84. int pca9685_set_mode2(pca9685_t *dev, uint8_t mode2_val);
  85. int pca9685_set_open_drain(pca9685_t *dev, bool enable);
  86. int pca9685_set_output_invert(pca9685_t *dev, bool invert);
  87. void pca9685_print_status(pca9685_t *dev);
  88. int pca9685_verify_connection(pca9685_t *dev);
  89. #endif