16-channel, 12-bit PWM Fm I2C-bus LED controller

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?

UserRevisionLine numberNew 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