16-channel, 12-bit PWM Fm I2C-bus LED controller
PCA9685.h@2:fa75aff130cc, 2017-11-07 (annotated)
- Committer:
- mcm
- Date:
- Tue Nov 07 14:52:15 2017 +0000
- Revision:
- 2:fa75aff130cc
- Parent:
- 1:6e7731f14aac
- Child:
- 3:f69f4e2c35b6
The function file is ready to test
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mcm | 1:6e7731f14aac | 1 | /** |
mcm | 1:6e7731f14aac | 2 | * @brief PCA9685.h |
mcm | 1:6e7731f14aac | 3 | * @details 16-channel, 12-bit PWM Fm+ I2C-bus LED controller. |
mcm | 1:6e7731f14aac | 4 | * Header file. |
mcm | 1:6e7731f14aac | 5 | * |
mcm | 1:6e7731f14aac | 6 | * |
mcm | 1:6e7731f14aac | 7 | * @return NA |
mcm | 1:6e7731f14aac | 8 | * |
mcm | 1:6e7731f14aac | 9 | * @author Manuel Caballero |
mcm | 1:6e7731f14aac | 10 | * @date 31/October/2017 |
mcm | 1:6e7731f14aac | 11 | * @version 31/October/2017 The ORIGIN |
mcm | 1:6e7731f14aac | 12 | * @pre NaN. |
mcm | 1:6e7731f14aac | 13 | * @warning NaN |
mcm | 1:6e7731f14aac | 14 | * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ). |
mcm | 1:6e7731f14aac | 15 | */ |
mcm | 1:6e7731f14aac | 16 | #ifndef PCA9685_H |
mcm | 1:6e7731f14aac | 17 | #define PCA9685_H |
mcm | 1:6e7731f14aac | 18 | |
mcm | 1:6e7731f14aac | 19 | #include "mbed.h" |
mcm | 1:6e7731f14aac | 20 | |
mcm | 1:6e7731f14aac | 21 | |
mcm | 1:6e7731f14aac | 22 | /** |
mcm | 1:6e7731f14aac | 23 | Example: |
mcm | 1:6e7731f14aac | 24 | |
mcm | 1:6e7731f14aac | 25 | [todo] |
mcm | 1:6e7731f14aac | 26 | */ |
mcm | 1:6e7731f14aac | 27 | |
mcm | 1:6e7731f14aac | 28 | |
mcm | 1:6e7731f14aac | 29 | /*! |
mcm | 1:6e7731f14aac | 30 | Library for the PCA9685 16-channel, 12-bit PWM Fm+ I2C-bus LED controller. |
mcm | 1:6e7731f14aac | 31 | */ |
mcm | 1:6e7731f14aac | 32 | class PCA9685 |
mcm | 1:6e7731f14aac | 33 | { |
mcm | 1:6e7731f14aac | 34 | public: |
mcm | 1:6e7731f14aac | 35 | /** |
mcm | 1:6e7731f14aac | 36 | * @brief DEFAULT ADDRESSES. NOTE: There are a maximum of 64 possible programmable addresses using the 6 hardware |
mcm | 1:6e7731f14aac | 37 | * address pins. Two of these addresses, Software Reset and LED All Call, cannot be used |
mcm | 1:6e7731f14aac | 38 | * because their default power-up state is ON, leaving a maximum of 62 addresses. Using |
mcm | 1:6e7731f14aac | 39 | * other reserved addresses, as well as any other subcall address, will reduce the total |
mcm | 1:6e7731f14aac | 40 | * number of possible addresses even further. |
mcm | 1:6e7731f14aac | 41 | * |
mcm | 1:6e7731f14aac | 42 | * To access to a certain address just use the following method: PCA9685_ADDRESS_0 + Counter_Address |
mcm | 1:6e7731f14aac | 43 | * Ex: |
mcm | 1:6e7731f14aac | 44 | * PCA9685_ADDRESS_0 + 1 = 0x40 + 1 = 0x41 ( 0b1000001 ) |
mcm | 1:6e7731f14aac | 45 | * PCA9685_ADDRESS_0 + 10 = 0x40 + 10 = 0x4A ( 0b1001010 ) |
mcm | 1:6e7731f14aac | 46 | * and so on... |
mcm | 1:6e7731f14aac | 47 | */ |
mcm | 1:6e7731f14aac | 48 | typedef enum { |
mcm | 1:6e7731f14aac | 49 | PCA9685_ADDRESS_0 = ( 0x40 << 1 ) /*!< A5 A4 A3 A2 A1 A0: 000 000 */ |
mcm | 1:6e7731f14aac | 50 | } PCA9685_address_t; |
mcm | 1:6e7731f14aac | 51 | |
mcm | 1:6e7731f14aac | 52 | |
mcm | 1:6e7731f14aac | 53 | // REGISTERS |
mcm | 1:6e7731f14aac | 54 | /** |
mcm | 1:6e7731f14aac | 55 | * @brief REGISTER DEFINITIONS |
mcm | 1:6e7731f14aac | 56 | */ |
mcm | 1:6e7731f14aac | 57 | typedef enum { |
mcm | 1:6e7731f14aac | 58 | MODE1 = 0x00, /*!< Mode register 1 */ |
mcm | 1:6e7731f14aac | 59 | MODE2 = 0x01, /*!< Mode register 2 */ |
mcm | 1:6e7731f14aac | 60 | SUBADR1 = 0x02, /*!< I2C-bus subaddress 1 */ |
mcm | 1:6e7731f14aac | 61 | SUBADR2 = 0x03, /*!< I2C-bus subaddress 2 */ |
mcm | 1:6e7731f14aac | 62 | SUBADR3 = 0x04, /*!< I2C-bus subaddress 3 */ |
mcm | 1:6e7731f14aac | 63 | ALLCALLADR = 0x05, /*!< LED All Call I2C-bus address */ |
mcm | 1:6e7731f14aac | 64 | LED0_ON_L = 0x06, /*!< LED0 output and brightness control byte 0 */ |
mcm | 1:6e7731f14aac | 65 | LED0_ON_H = 0x07, /*!< LED0 output and brightness control byte 1 */ |
mcm | 1:6e7731f14aac | 66 | LED0_OFF_L = 0x08, /*!< LED0 output and brightness control byte 2 */ |
mcm | 1:6e7731f14aac | 67 | LED0_OFF_H = 0x09, /*!< LED0 output and brightness control byte 3 */ |
mcm | 1:6e7731f14aac | 68 | LED1_ON_L = 0x0A, /*!< LED1 output and brightness control byte 0 */ |
mcm | 1:6e7731f14aac | 69 | LED1_ON_H = 0x0B, /*!< LED1 output and brightness control byte 1 */ |
mcm | 1:6e7731f14aac | 70 | LED1_OFF_L = 0x0C, /*!< LED1 output and brightness control byte 2 */ |
mcm | 1:6e7731f14aac | 71 | LED1_OFF_H = 0x0D, /*!< LED1 output and brightness control byte 3 */ |
mcm | 1:6e7731f14aac | 72 | LED2_ON_L = 0x0E, /*!< LED2 output and brightness control byte 0 */ |
mcm | 1:6e7731f14aac | 73 | LED2_ON_H = 0x0F, /*!< LED2 output and brightness control byte 1 */ |
mcm | 1:6e7731f14aac | 74 | LED2_OFF_L = 0x10, /*!< LED2 output and brightness control byte 2 */ |
mcm | 1:6e7731f14aac | 75 | LED2_OFF_H = 0x11, /*!< LED2 output and brightness control byte 3 */ |
mcm | 1:6e7731f14aac | 76 | LED3_ON_L = 0x12, /*!< LED3 output and brightness control byte 0 */ |
mcm | 1:6e7731f14aac | 77 | LED3_ON_H = 0x13, /*!< LED3 output and brightness control byte 1 */ |
mcm | 1:6e7731f14aac | 78 | LED3_OFF_L = 0x14, /*!< LED3 output and brightness control byte 2 */ |
mcm | 1:6e7731f14aac | 79 | LED3_OFF_H = 0x15, /*!< LED3 output and brightness control byte 3 */ |
mcm | 1:6e7731f14aac | 80 | LED4_ON_L = 0x16, /*!< LED4 output and brightness control byte 0 */ |
mcm | 1:6e7731f14aac | 81 | LED4_ON_H = 0x17, /*!< LED4 output and brightness control byte 1 */ |
mcm | 1:6e7731f14aac | 82 | LED4_OFF_L = 0x18, /*!< LED4 output and brightness control byte 2 */ |
mcm | 1:6e7731f14aac | 83 | LED4_OFF_H = 0x19, /*!< LED4 output and brightness control byte 3 */ |
mcm | 1:6e7731f14aac | 84 | LED5_ON_L = 0x1A, /*!< LED5 output and brightness control byte 0 */ |
mcm | 1:6e7731f14aac | 85 | LED5_ON_H = 0x1B, /*!< LED5 output and brightness control byte 1 */ |
mcm | 1:6e7731f14aac | 86 | LED5_OFF_L = 0x1C, /*!< LED5 output and brightness control byte 2 */ |
mcm | 1:6e7731f14aac | 87 | LED5_OFF_H = 0x1D, /*!< LED5 output and brightness control byte 3 */ |
mcm | 1:6e7731f14aac | 88 | LED6_ON_L = 0x1E, /*!< LED6 output and brightness control byte 0 */ |
mcm | 1:6e7731f14aac | 89 | LED6_ON_H = 0x1F, /*!< LED6 output and brightness control byte 1 */ |
mcm | 1:6e7731f14aac | 90 | LED6_OFF_L = 0x20, /*!< LED6 output and brightness control byte 2 */ |
mcm | 1:6e7731f14aac | 91 | LED6_OFF_H = 0x21, /*!< LED6 output and brightness control byte 3 */ |
mcm | 1:6e7731f14aac | 92 | LED7_ON_L = 0x22, /*!< LED7 output and brightness control byte 0 */ |
mcm | 1:6e7731f14aac | 93 | LED7_ON_H = 0x23, /*!< LED7 output and brightness control byte 1 */ |
mcm | 1:6e7731f14aac | 94 | LED7_OFF_L = 0x24, /*!< LED7 output and brightness control byte 2 */ |
mcm | 1:6e7731f14aac | 95 | LED7_OFF_H = 0x25, /*!< LED7 output and brightness control byte 3 */ |
mcm | 1:6e7731f14aac | 96 | LED8_ON_L = 0x26, /*!< LED8 output and brightness control byte 0 */ |
mcm | 1:6e7731f14aac | 97 | LED8_ON_H = 0x27, /*!< LED8 output and brightness control byte 1 */ |
mcm | 1:6e7731f14aac | 98 | LED8_OFF_L = 0x28, /*!< LED8 output and brightness control byte 2 */ |
mcm | 1:6e7731f14aac | 99 | LED8_OFF_H = 0x29, /*!< LED8 output and brightness control byte 3 */ |
mcm | 1:6e7731f14aac | 100 | LED9_ON_L = 0x2A, /*!< LED9 output and brightness control byte 0 */ |
mcm | 1:6e7731f14aac | 101 | LED9_ON_H = 0x2B, /*!< LED9 output and brightness control byte 1 */ |
mcm | 1:6e7731f14aac | 102 | LED9_OFF_L = 0x2C, /*!< LED9 output and brightness control byte 2 */ |
mcm | 1:6e7731f14aac | 103 | LED9_OFF_H = 0x2D, /*!< LED9 output and brightness control byte 3 */ |
mcm | 1:6e7731f14aac | 104 | LED10_ON_L = 0x2E, /*!< LED10 output and brightness control byte 0 */ |
mcm | 1:6e7731f14aac | 105 | LED10_ON_H = 0x2F, /*!< LED10 output and brightness control byte 1 */ |
mcm | 1:6e7731f14aac | 106 | LED10_OFF_L = 0x30, /*!< LED10 output and brightness control byte 2 */ |
mcm | 1:6e7731f14aac | 107 | LED10_OFF_H = 0x31, /*!< LED10 output and brightness control byte 3 */ |
mcm | 1:6e7731f14aac | 108 | LED11_ON_L = 0x32, /*!< LED11 output and brightness control byte 0 */ |
mcm | 1:6e7731f14aac | 109 | LED11_ON_H = 0x33, /*!< LED11 output and brightness control byte 1 */ |
mcm | 1:6e7731f14aac | 110 | LED11_OFF_L = 0x34, /*!< LED11 output and brightness control byte 2 */ |
mcm | 1:6e7731f14aac | 111 | LED11_OFF_H = 0x35, /*!< LED11 output and brightness control byte 3 */ |
mcm | 1:6e7731f14aac | 112 | LED12_ON_L = 0x36, /*!< LED12 output and brightness control byte 0 */ |
mcm | 1:6e7731f14aac | 113 | LED12_ON_H = 0x37, /*!< LED12 output and brightness control byte 1 */ |
mcm | 1:6e7731f14aac | 114 | LED12_OFF_L = 0x38, /*!< LED12 output and brightness control byte 2 */ |
mcm | 1:6e7731f14aac | 115 | LED12_OFF_H = 0x39, /*!< LED12 output and brightness control byte 3 */ |
mcm | 1:6e7731f14aac | 116 | LED13_ON_L = 0x3A, /*!< LED13 output and brightness control byte 0 */ |
mcm | 1:6e7731f14aac | 117 | LED13_ON_H = 0x3B, /*!< LED13 output and brightness control byte 1 */ |
mcm | 1:6e7731f14aac | 118 | LED13_OFF_L = 0x3C, /*!< LED13 output and brightness control byte 2 */ |
mcm | 1:6e7731f14aac | 119 | LED13_OFF_H = 0x3D, /*!< LED13 output and brightness control byte 3 */ |
mcm | 1:6e7731f14aac | 120 | LED14_ON_L = 0x3E, /*!< LED14 output and brightness control byte 0 */ |
mcm | 1:6e7731f14aac | 121 | LED14_ON_H = 0x3F, /*!< LED14 output and brightness control byte 1 */ |
mcm | 1:6e7731f14aac | 122 | LED14_OFF_L = 0x40, /*!< LED14 output and brightness control byte 2 */ |
mcm | 1:6e7731f14aac | 123 | LED14_OFF_H = 0x41, /*!< LED14 output and brightness control byte 3 */ |
mcm | 1:6e7731f14aac | 124 | LED15_ON_L = 0x42, /*!< LED15 output and brightness control byte 0 */ |
mcm | 1:6e7731f14aac | 125 | LED15_ON_H = 0x43, /*!< LED15 output and brightness control byte 1 */ |
mcm | 1:6e7731f14aac | 126 | LED15_OFF_L = 0x44, /*!< LED15 output and brightness control byte 2 */ |
mcm | 1:6e7731f14aac | 127 | LED15_OFF_H = 0x45, /*!< LED15 output and brightness control byte 3 */ |
mcm | 1:6e7731f14aac | 128 | ALL_LED_ON_L = 0xFA, /*!< load all the LEDn_ON registers, byte 0 */ |
mcm | 1:6e7731f14aac | 129 | ALL_LED_ON_H = 0xFB, /*!< load all the LEDn_ON registers, byte 1 */ |
mcm | 1:6e7731f14aac | 130 | ALL_LED_OFF_L = 0xFC, /*!< load all the LEDn_OFF registers, byte 0 */ |
mcm | 1:6e7731f14aac | 131 | ALL_LED_OFF_H = 0xFD, /*!< load all the LEDn_OFF registers, byte 1 */ |
mcm | 1:6e7731f14aac | 132 | PRE_SCALE = 0xFE, /*!< prescaler for PWM output frequency */ |
mcm | 1:6e7731f14aac | 133 | TESTMODE = 0xFF /*!< defines the test mode to be entered */ |
mcm | 1:6e7731f14aac | 134 | } PCA9685_registers_t; |
mcm | 1:6e7731f14aac | 135 | |
mcm | 1:6e7731f14aac | 136 | |
mcm | 1:6e7731f14aac | 137 | |
mcm | 1:6e7731f14aac | 138 | // LED Sub Call I2C-bus addresses |
mcm | 1:6e7731f14aac | 139 | /** |
mcm | 1:6e7731f14aac | 140 | * @brief SUBADDRESS. NOTE: At power-up, Sub Call I2C-bus addresses are disabled. PCA9685 does not send an |
mcm | 1:6e7731f14aac | 141 | * ACK when E2h (R/W = 0) or E3h (R/W = 1), E4h (R/W = 0) or E5h (R/W = 1), or |
mcm | 1:6e7731f14aac | 142 | * E8h (R/W = 0) or E9h (R/W = 1) is sent by the master. |
mcm | 1:6e7731f14aac | 143 | */ |
mcm | 1:6e7731f14aac | 144 | typedef enum { |
mcm | 1:6e7731f14aac | 145 | SUBADR1_REG = ( 0xE2 << 1 ), /*!< Subaddress 1 */ |
mcm | 1:6e7731f14aac | 146 | SUBADR2_REG = ( 0xE4 << 1 ), /*!< Subaddress 2 */ |
mcm | 1:6e7731f14aac | 147 | SUBADR3_REG = ( 0xE8 << 1 ) /*!< Subaddress 3 */ |
mcm | 1:6e7731f14aac | 148 | } PCA9685_subaddresses_t; |
mcm | 1:6e7731f14aac | 149 | |
mcm | 1:6e7731f14aac | 150 | |
mcm | 1:6e7731f14aac | 151 | |
mcm | 1:6e7731f14aac | 152 | |
mcm | 1:6e7731f14aac | 153 | // Software Reset I2C-bus address |
mcm | 1:6e7731f14aac | 154 | /** |
mcm | 1:6e7731f14aac | 155 | * @brief SWRST. NOTE: The Software Reset address (SWRST Call) must be used with |
mcm | 1:6e7731f14aac | 156 | * R/#W = logic 0. If R/#W = logic 1, the PCA9685 does not acknowledge the SWRST. |
mcm | 1:6e7731f14aac | 157 | */ |
mcm | 1:6e7731f14aac | 158 | typedef enum { |
mcm | 1:6e7731f14aac | 159 | GENERAL_CALL_ADDRESS = ( 0x00 << 1 ), /*!< Software reset */ |
mcm | 1:6e7731f14aac | 160 | SWRST = ( 0x06 << 1 ) /*!< Software reset */ |
mcm | 1:6e7731f14aac | 161 | } PCA9685_software_reset_t; |
mcm | 1:6e7731f14aac | 162 | |
mcm | 1:6e7731f14aac | 163 | |
mcm | 1:6e7731f14aac | 164 | |
mcm | 1:6e7731f14aac | 165 | |
mcm | 1:6e7731f14aac | 166 | // MODE REGISTER 1, MODE1 |
mcm | 1:6e7731f14aac | 167 | /** |
mcm | 1:6e7731f14aac | 168 | * @brief RESTART |
mcm | 1:6e7731f14aac | 169 | */ |
mcm | 1:6e7731f14aac | 170 | typedef enum { |
mcm | 1:6e7731f14aac | 171 | MODE1_RESTART_MASK = ( 1 << 7 ), /*!< RESTART bit mask */ |
mcm | 1:6e7731f14aac | 172 | MODE1_RESTART_ENABLED = ( 1 << 7 ), /*!< Restart enabled */ |
mcm | 1:6e7731f14aac | 173 | MODE1_RESTART_DISABLED = ( 0 << 7 ) /*!< Restart disabled ( default ) */ |
mcm | 1:6e7731f14aac | 174 | } PCA9685_mode1_restart_t; |
mcm | 1:6e7731f14aac | 175 | |
mcm | 1:6e7731f14aac | 176 | |
mcm | 1:6e7731f14aac | 177 | /** |
mcm | 1:6e7731f14aac | 178 | * @brief EXTCLK |
mcm | 1:6e7731f14aac | 179 | */ |
mcm | 1:6e7731f14aac | 180 | typedef enum { |
mcm | 1:6e7731f14aac | 181 | MODE1_EXTCLK_MASK = ( 1 << 6 ), /*!< EXTCLK bit mask */ |
mcm | 1:6e7731f14aac | 182 | MODE1_EXTCLK_ENABLED = ( 1 << 6 ), /*!< Use EXTERNAL clock */ |
mcm | 1:6e7731f14aac | 183 | MODE1_EXTCLK_DISABLED = ( 0 << 6 ) /*!< Use INTERNAL clock ( default ) */ |
mcm | 1:6e7731f14aac | 184 | } PCA9685_mode1_extclk_t; |
mcm | 1:6e7731f14aac | 185 | |
mcm | 1:6e7731f14aac | 186 | |
mcm | 1:6e7731f14aac | 187 | /** |
mcm | 1:6e7731f14aac | 188 | * @brief AI |
mcm | 1:6e7731f14aac | 189 | */ |
mcm | 1:6e7731f14aac | 190 | typedef enum { |
mcm | 1:6e7731f14aac | 191 | MODE1_AI_MASK = ( 1 << 5 ), /*!< AI bit mask */ |
mcm | 1:6e7731f14aac | 192 | MODE1_AI_ENABLED = ( 1 << 5 ), /*!< Auto-Increment enabled */ |
mcm | 1:6e7731f14aac | 193 | MODE1_AI_DISABLED = ( 0 << 5 ) /*!< Auto-Increment disabled ( default ) */ |
mcm | 1:6e7731f14aac | 194 | } PCA9685_mode1_ai_t; |
mcm | 1:6e7731f14aac | 195 | |
mcm | 1:6e7731f14aac | 196 | |
mcm | 1:6e7731f14aac | 197 | /** |
mcm | 1:6e7731f14aac | 198 | * @brief SLEEP |
mcm | 1:6e7731f14aac | 199 | */ |
mcm | 1:6e7731f14aac | 200 | typedef enum { |
mcm | 1:6e7731f14aac | 201 | MODE1_SLEEP_MASK = ( 1 << 4 ), /*!< SLEEP bit mask */ |
mcm | 1:6e7731f14aac | 202 | MODE1_SLEEP_ENABLED = ( 1 << 4 ), /*!< Low power mode. Oscillator off ( default ) */ |
mcm | 1:6e7731f14aac | 203 | MODE1_SLEEP_DISABLED = ( 0 << 4 ) /*!< Normal mode */ |
mcm | 1:6e7731f14aac | 204 | } PCA9685_mode1_sleep_t; |
mcm | 1:6e7731f14aac | 205 | |
mcm | 1:6e7731f14aac | 206 | |
mcm | 1:6e7731f14aac | 207 | /** |
mcm | 1:6e7731f14aac | 208 | * @brief SUB1 |
mcm | 1:6e7731f14aac | 209 | */ |
mcm | 1:6e7731f14aac | 210 | typedef enum { |
mcm | 1:6e7731f14aac | 211 | MODE1_SUB1_MASK = ( 1 << 3 ), /*!< SUB1 bit mask */ |
mcm | 1:6e7731f14aac | 212 | MODE1_SUB1_ENABLED = ( 1 << 3 ), /*!< PCA9685 responds to I2C-bus subaddress 1 */ |
mcm | 1:6e7731f14aac | 213 | MODE1_SUB1_DISABLED = ( 0 << 3 ) /*!< PCA9685 does not respond to I2C-bus subaddress 1 ( default ) */ |
mcm | 1:6e7731f14aac | 214 | } PCA9685_mode1_sub1_t; |
mcm | 1:6e7731f14aac | 215 | |
mcm | 1:6e7731f14aac | 216 | |
mcm | 1:6e7731f14aac | 217 | /** |
mcm | 1:6e7731f14aac | 218 | * @brief SUB2 |
mcm | 1:6e7731f14aac | 219 | */ |
mcm | 1:6e7731f14aac | 220 | typedef enum { |
mcm | 1:6e7731f14aac | 221 | MODE1_SUB2_MASK = ( 1 << 2 ), /*!< SUB2 bit mask */ |
mcm | 1:6e7731f14aac | 222 | MODE1_SUB2_ENABLED = ( 1 << 2 ), /*!< PCA9685 responds to I2C-bus subaddress 2 */ |
mcm | 1:6e7731f14aac | 223 | MODE1_SUB2_DISABLED = ( 0 << 2 ) /*!< PCA9685 does not respond to I2C-bus subaddress 2 ( default ) */ |
mcm | 1:6e7731f14aac | 224 | } PCA9685_mode1_sub2_t; |
mcm | 1:6e7731f14aac | 225 | |
mcm | 1:6e7731f14aac | 226 | |
mcm | 1:6e7731f14aac | 227 | /** |
mcm | 1:6e7731f14aac | 228 | * @brief SUB3 |
mcm | 1:6e7731f14aac | 229 | */ |
mcm | 1:6e7731f14aac | 230 | typedef enum { |
mcm | 1:6e7731f14aac | 231 | MODE1_SUB3_MASK = ( 1 << 1 ), /*!< SUB1 bit mask */ |
mcm | 1:6e7731f14aac | 232 | MODE1_SUB3_ENABLED = ( 1 << 1 ), /*!< PCA9685 responds to I2C-bus subaddress 3 */ |
mcm | 1:6e7731f14aac | 233 | MODE1_SUB3_DISABLED = ( 0 << 1 ) /*!< PCA9685 does not respond to I2C-bus subaddress 3 ( default ) */ |
mcm | 1:6e7731f14aac | 234 | } PCA9685_mode1_sub3_t; |
mcm | 1:6e7731f14aac | 235 | |
mcm | 1:6e7731f14aac | 236 | |
mcm | 1:6e7731f14aac | 237 | /** |
mcm | 1:6e7731f14aac | 238 | * @brief ALLCALL |
mcm | 1:6e7731f14aac | 239 | */ |
mcm | 1:6e7731f14aac | 240 | typedef enum { |
mcm | 1:6e7731f14aac | 241 | MODE1_ALLCALL_MASK = ( 1 << 0 ), /*!< ALLCALL bit mask */ |
mcm | 1:6e7731f14aac | 242 | MODE1_ALLCALL_ENABLED = ( 1 << 0 ), /*!< PCA9685 responds to LED All Call I2C-bus address ( default ) */ |
mcm | 1:6e7731f14aac | 243 | MODE1_ALLCALL_DISABLED = ( 0 << 0 ) /*!< PCA9685 does not respond to LED All Call I2C-bus address */ |
mcm | 1:6e7731f14aac | 244 | } PCA9685_mode1_allcall_t; |
mcm | 1:6e7731f14aac | 245 | |
mcm | 1:6e7731f14aac | 246 | |
mcm | 1:6e7731f14aac | 247 | |
mcm | 1:6e7731f14aac | 248 | // MODE REGISTER 2, MODE2 |
mcm | 1:6e7731f14aac | 249 | /** |
mcm | 1:6e7731f14aac | 250 | * @brief INVRT |
mcm | 1:6e7731f14aac | 251 | */ |
mcm | 1:6e7731f14aac | 252 | typedef enum { |
mcm | 1:6e7731f14aac | 253 | MODE2_INVRT_MASK = ( 1 << 4 ), /*!< INVRT bit mask */ |
mcm | 1:6e7731f14aac | 254 | MODE2_INVRT_ENABLED = ( 1 << 4 ), /*!< Output logic state inverted. Value to use when no external driver used. Applicable when OE = 0 */ |
mcm | 1:6e7731f14aac | 255 | MODE2_INVRT_DISABLED = ( 0 << 4 ) /*!< Output logic state not inverted. Value to use when external driver used. Applicable when OE = 0. ( default ) */ |
mcm | 1:6e7731f14aac | 256 | } PCA9685_mode2_invrt_t; |
mcm | 1:6e7731f14aac | 257 | |
mcm | 1:6e7731f14aac | 258 | |
mcm | 1:6e7731f14aac | 259 | /** |
mcm | 1:6e7731f14aac | 260 | * @brief OCH |
mcm | 1:6e7731f14aac | 261 | */ |
mcm | 1:6e7731f14aac | 262 | typedef enum { |
mcm | 1:6e7731f14aac | 263 | MODE2_OCH_MASK = ( 1 << 3 ), /*!< ALLCALL bit mask */ |
mcm | 1:6e7731f14aac | 264 | MODE2_OCH_OUTPUT_CHANGE_STOP_CMD = ( 0 << 3 ), /*!< Outputs change on STOP command ( default ) */ |
mcm | 1:6e7731f14aac | 265 | MODE2_OCH_OUTPUT_CHANGE_ACK_CMD = ( 1 << 3 ) /*!< Outputs change on ACK */ |
mcm | 1:6e7731f14aac | 266 | } PCA9685_mode2_och_t; |
mcm | 1:6e7731f14aac | 267 | |
mcm | 1:6e7731f14aac | 268 | |
mcm | 1:6e7731f14aac | 269 | /** |
mcm | 1:6e7731f14aac | 270 | * @brief OUTDRV |
mcm | 1:6e7731f14aac | 271 | */ |
mcm | 1:6e7731f14aac | 272 | typedef enum { |
mcm | 1:6e7731f14aac | 273 | MODE2_OUTDRV_MASK = ( 1 << 2 ), /*!< OUTDRV bit mask */ |
mcm | 1:6e7731f14aac | 274 | MODE2_OUTDRV_TOTEM_POLE_STRUCTURE = ( 1 << 2 ), /*!< The 16 LEDn outputs are configured with a totem pole structure ( default ) */ |
mcm | 1:6e7731f14aac | 275 | MODE2_OUTDRV_OPEN_DRAIN_STRUCTURE = ( 0 << 2 ) /*!< The 16 LEDn outputs are configured with an open-drain structure */ |
mcm | 1:6e7731f14aac | 276 | } PCA9685_mode2_outdrv_t; |
mcm | 1:6e7731f14aac | 277 | |
mcm | 1:6e7731f14aac | 278 | |
mcm | 1:6e7731f14aac | 279 | /** |
mcm | 1:6e7731f14aac | 280 | * @brief OUTNE |
mcm | 1:6e7731f14aac | 281 | */ |
mcm | 1:6e7731f14aac | 282 | typedef enum { |
mcm | 1:6e7731f14aac | 283 | MODE2_OUTNE_MASK = ( 3 << 0 ), /*!< OUTNE bit mask */ |
mcm | 1:6e7731f14aac | 284 | MODE2_OUTNE_LEDn_LOW = ( 0 << 0 ), /*!< When #OE = 1 (output drivers not enabled), LEDn = 0 ( default ) */ |
mcm | 1:6e7731f14aac | 285 | MODE2_OUTNE_LEDn_HIGH = ( 1 << 0 ), /*!< When #OE = 1 (output drivers not enabled): LEDn = 1 when OUTDRV = 1 |
mcm | 1:6e7731f14aac | 286 | LEDn = high-impedance when OUTDRV = 0 (same as OUTNE[1:0] = 10) */ |
mcm | 1:6e7731f14aac | 287 | MODE2_OUTNE_LEDn_HIGH_IMPEDANCE = ( 2 << 0 ) /*!< When #OE = 1 (output drivers not enabled), LEDn = high-impedance */ |
mcm | 1:6e7731f14aac | 288 | } PCA9685_mode2_outne_t; |
mcm | 1:6e7731f14aac | 289 | |
mcm | 1:6e7731f14aac | 290 | |
mcm | 1:6e7731f14aac | 291 | |
mcm | 1:6e7731f14aac | 292 | |
mcm | 1:6e7731f14aac | 293 | /** |
mcm | 1:6e7731f14aac | 294 | * @brief INTERNAL CONSTANTS |
mcm | 1:6e7731f14aac | 295 | */ |
mcm | 1:6e7731f14aac | 296 | typedef enum { |
mcm | 1:6e7731f14aac | 297 | PCA9685_INTERNAL_CLOCK = 25000000, /*!< Internal clock frequency */ |
mcm | 1:6e7731f14aac | 298 | PCA9685_ADC_STEPS = 4096 /*!< ADC 12-bits */ |
mcm | 1:6e7731f14aac | 299 | } PCA9685_internal_parameters_t; |
mcm | 1:6e7731f14aac | 300 | |
mcm | 1:6e7731f14aac | 301 | |
mcm | 1:6e7731f14aac | 302 | typedef enum { |
mcm | 1:6e7731f14aac | 303 | PCA9685_LED0 = 0x00, /*!< LED0 channel */ |
mcm | 1:6e7731f14aac | 304 | PCA9685_LED1 = 0x01, /*!< LED1 channel */ |
mcm | 1:6e7731f14aac | 305 | PCA9685_LED2 = 0x02, /*!< LED2 channel */ |
mcm | 1:6e7731f14aac | 306 | PCA9685_LED3 = 0x03, /*!< LED3 channel */ |
mcm | 1:6e7731f14aac | 307 | PCA9685_LED4 = 0x04, /*!< LED4 channel */ |
mcm | 1:6e7731f14aac | 308 | PCA9685_LED5 = 0x05, /*!< LED5 channel */ |
mcm | 1:6e7731f14aac | 309 | PCA9685_LED6 = 0x06, /*!< LED6 channel */ |
mcm | 1:6e7731f14aac | 310 | PCA9685_LED7 = 0x07, /*!< LED7 channel */ |
mcm | 1:6e7731f14aac | 311 | PCA9685_LED8 = 0x08, /*!< LED8 channel */ |
mcm | 1:6e7731f14aac | 312 | PCA9685_LED9 = 0x09, /*!< LED9 channel */ |
mcm | 1:6e7731f14aac | 313 | PCA9685_LED10 = 0x0A, /*!< LED10 channel */ |
mcm | 1:6e7731f14aac | 314 | PCA9685_LED11 = 0x0B, /*!< LED11 channel */ |
mcm | 1:6e7731f14aac | 315 | PCA9685_LED12 = 0x0C, /*!< LED12 channel */ |
mcm | 1:6e7731f14aac | 316 | PCA9685_LED13 = 0x0D, /*!< LED13 channel */ |
mcm | 1:6e7731f14aac | 317 | PCA9685_LED14 = 0x0E, /*!< LED14 channel */ |
mcm | 1:6e7731f14aac | 318 | PCA9685_LED15 = 0x0F /*!< LED15 channel */ |
mcm | 1:6e7731f14aac | 319 | } PCA9685_led_channel_t; |
mcm | 1:6e7731f14aac | 320 | |
mcm | 1:6e7731f14aac | 321 | |
mcm | 1:6e7731f14aac | 322 | |
mcm | 1:6e7731f14aac | 323 | |
mcm | 1:6e7731f14aac | 324 | |
mcm | 1:6e7731f14aac | 325 | /** |
mcm | 1:6e7731f14aac | 326 | * @brief INTERNAL CONSTANTS |
mcm | 1:6e7731f14aac | 327 | */ |
mcm | 1:6e7731f14aac | 328 | typedef enum { |
mcm | 1:6e7731f14aac | 329 | PCA9685_SUCCESS = 0, |
mcm | 1:6e7731f14aac | 330 | PCA9685_FAILURE = 1, |
mcm | 1:6e7731f14aac | 331 | I2C_SUCCESS = 0 /*!< I2C communication was fine */ |
mcm | 1:6e7731f14aac | 332 | } PCA9685_status_t; |
mcm | 1:6e7731f14aac | 333 | |
mcm | 1:6e7731f14aac | 334 | |
mcm | 2:fa75aff130cc | 335 | // MACRO: round function |
mcm | 2:fa75aff130cc | 336 | #define _MYROUND( x ) ({ \ |
mcm | 2:fa75aff130cc | 337 | uint32_t aux_pre; \ |
mcm | 2:fa75aff130cc | 338 | float aux_x; \ |
mcm | 2:fa75aff130cc | 339 | \ |
mcm | 2:fa75aff130cc | 340 | aux_x = (x); \ |
mcm | 2:fa75aff130cc | 341 | aux_pre = (x); \ |
mcm | 2:fa75aff130cc | 342 | aux_x -= aux_pre; \ |
mcm | 2:fa75aff130cc | 343 | aux_x *= 10; \ |
mcm | 2:fa75aff130cc | 344 | \ |
mcm | 2:fa75aff130cc | 345 | if ( aux_x >= 5 ) \ |
mcm | 2:fa75aff130cc | 346 | aux_pre++; \ |
mcm | 2:fa75aff130cc | 347 | \ |
mcm | 2:fa75aff130cc | 348 | aux_pre; \ |
mcm | 2:fa75aff130cc | 349 | }) |
mcm | 2:fa75aff130cc | 350 | |
mcm | 2:fa75aff130cc | 351 | |
mcm | 2:fa75aff130cc | 352 | |
mcm | 1:6e7731f14aac | 353 | |
mcm | 1:6e7731f14aac | 354 | |
mcm | 1:6e7731f14aac | 355 | /** Create an PCA9685 object connected to the specified I2C pins. |
mcm | 1:6e7731f14aac | 356 | * |
mcm | 1:6e7731f14aac | 357 | * @param sda I2C data pin |
mcm | 1:6e7731f14aac | 358 | * @param scl I2C clock pin |
mcm | 1:6e7731f14aac | 359 | * @param addr I2C slave address |
mcm | 1:6e7731f14aac | 360 | * @param freq I2C frequency in Hz. |
mcm | 1:6e7731f14aac | 361 | */ |
mcm | 1:6e7731f14aac | 362 | PCA9685 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq ); |
mcm | 1:6e7731f14aac | 363 | |
mcm | 1:6e7731f14aac | 364 | /** Delete PCA9685 object. |
mcm | 1:6e7731f14aac | 365 | */ |
mcm | 1:6e7731f14aac | 366 | ~PCA9685(); |
mcm | 1:6e7731f14aac | 367 | |
mcm | 1:6e7731f14aac | 368 | /** It resets the device by software. |
mcm | 1:6e7731f14aac | 369 | */ |
mcm | 1:6e7731f14aac | 370 | PCA9685_status_t PCA9685_SoftReset ( void ); |
mcm | 1:6e7731f14aac | 371 | |
mcm | 1:6e7731f14aac | 372 | /** It configures the mode of the device: Sleep or Normal operation mode. |
mcm | 1:6e7731f14aac | 373 | */ |
mcm | 1:6e7731f14aac | 374 | PCA9685_status_t PCA9685_SetMode ( PCA9685_mode1_sleep_t myMode ); |
mcm | 1:6e7731f14aac | 375 | |
mcm | 1:6e7731f14aac | 376 | /** It configures a new PWM frequency. |
mcm | 1:6e7731f14aac | 377 | */ |
mcm | 1:6e7731f14aac | 378 | PCA9685_status_t PCA9685_SetPWM_Freq ( float myNewFrequency ); |
mcm | 1:6e7731f14aac | 379 | |
mcm | 1:6e7731f14aac | 380 | /** It configures a new PWM duty cycle on a given LED. |
mcm | 1:6e7731f14aac | 381 | */ |
mcm | 1:6e7731f14aac | 382 | PCA9685_status_t PCA9685_SetPWM_DutyCycle ( PCA9685_led_channel_t myLEDchannel, uint8_t myDelay, uint8_t myPWM_DutyCycle ); |
mcm | 1:6e7731f14aac | 383 | |
mcm | 1:6e7731f14aac | 384 | /** It configures a new PWM duty cycle on all LEDs. |
mcm | 1:6e7731f14aac | 385 | */ |
mcm | 1:6e7731f14aac | 386 | PCA9685_status_t PCA9685_SetPWM_DutyCycle_AllLEDs ( uint8_t myDelay, uint8_t myPWM_DutyCycle ); |
mcm | 1:6e7731f14aac | 387 | |
mcm | 1:6e7731f14aac | 388 | /** It sets the LEDn ON. |
mcm | 1:6e7731f14aac | 389 | */ |
mcm | 1:6e7731f14aac | 390 | PCA9685_status_t PCA9685_SetLED_ON ( PCA9685_led_channel_t myLEDchannel ); |
mcm | 1:6e7731f14aac | 391 | |
mcm | 1:6e7731f14aac | 392 | /** It sets the LEDn OFF. |
mcm | 1:6e7731f14aac | 393 | */ |
mcm | 1:6e7731f14aac | 394 | PCA9685_status_t PCA9685_SetLED_OFF ( PCA9685_led_channel_t myLEDchannel ); |
mcm | 1:6e7731f14aac | 395 | |
mcm | 1:6e7731f14aac | 396 | /** It sets All LEDs ON. |
mcm | 1:6e7731f14aac | 397 | */ |
mcm | 1:6e7731f14aac | 398 | PCA9685_status_t PCA9685_SetAllLED_ON ( void ); |
mcm | 1:6e7731f14aac | 399 | |
mcm | 1:6e7731f14aac | 400 | /** It sets All LEDs OFF. |
mcm | 1:6e7731f14aac | 401 | */ |
mcm | 1:6e7731f14aac | 402 | PCA9685_status_t PCA9685_SetAllLED_OFF ( void ); |
mcm | 1:6e7731f14aac | 403 | |
mcm | 1:6e7731f14aac | 404 | /** It sets SUB1 mode. |
mcm | 1:6e7731f14aac | 405 | */ |
mcm | 1:6e7731f14aac | 406 | PCA9685_status_t PCA9685_SetSUB1 ( PCA9685_mode1_sub1_t mySUB1_mode ); |
mcm | 1:6e7731f14aac | 407 | |
mcm | 1:6e7731f14aac | 408 | /** It sets SUB2 mode. |
mcm | 1:6e7731f14aac | 409 | */ |
mcm | 1:6e7731f14aac | 410 | PCA9685_status_t PCA9685_SetSUB2 ( PCA9685_mode1_sub2_t mySUB2_mode ); |
mcm | 1:6e7731f14aac | 411 | |
mcm | 1:6e7731f14aac | 412 | /** It sets SUB3 mode. |
mcm | 1:6e7731f14aac | 413 | */ |
mcm | 1:6e7731f14aac | 414 | PCA9685_status_t PCA9685_SetSUB3 ( PCA9685_mode1_sub3_t mySUB3_mode ); |
mcm | 1:6e7731f14aac | 415 | |
mcm | 1:6e7731f14aac | 416 | /** It sets ALLCALL mode. |
mcm | 1:6e7731f14aac | 417 | */ |
mcm | 1:6e7731f14aac | 418 | PCA9685_status_t PCA9685_SetALLCALL ( PCA9685_mode1_allcall_t myALLCALL_mode ); |
mcm | 1:6e7731f14aac | 419 | |
mcm | 1:6e7731f14aac | 420 | /** It sets INVERT mode. |
mcm | 1:6e7731f14aac | 421 | */ |
mcm | 1:6e7731f14aac | 422 | PCA9685_status_t PCA9685_SetINVERT ( PCA9685_mode2_invrt_t myINVERT_mode ); |
mcm | 1:6e7731f14aac | 423 | |
mcm | 1:6e7731f14aac | 424 | /** It sets OCH mode. |
mcm | 1:6e7731f14aac | 425 | */ |
mcm | 1:6e7731f14aac | 426 | PCA9685_status_t PCA9685_SetOCH ( PCA9685_mode2_och_t myOCH_mode ); |
mcm | 1:6e7731f14aac | 427 | |
mcm | 1:6e7731f14aac | 428 | /** It sets OUTDRV mode. |
mcm | 1:6e7731f14aac | 429 | */ |
mcm | 1:6e7731f14aac | 430 | PCA9685_status_t PCA9685_SetOUTDRV ( PCA9685_mode2_outdrv_t myOUTDRV_mode ); |
mcm | 1:6e7731f14aac | 431 | |
mcm | 1:6e7731f14aac | 432 | |
mcm | 1:6e7731f14aac | 433 | |
mcm | 1:6e7731f14aac | 434 | private: |
mcm | 1:6e7731f14aac | 435 | I2C i2c; |
mcm | 1:6e7731f14aac | 436 | uint32_t PCA9685_Addr; |
mcm | 1:6e7731f14aac | 437 | }; |
mcm | 1:6e7731f14aac | 438 | |
mcm | 1:6e7731f14aac | 439 | #endif |