IC解密STM32控制PCA9685程序源码
IC解密PCA9685 在stm32下的程序设计
- IC解密#include "pca9685.h"
- IC解密#include "pca9685_reg.h" /* Light Driver Chip */
- IC解密#include "bsp_i2c_gpio.h"
- IC解密#define MAX_OUTPUT_INDEX 15
- IC解密#define MAX_OUTPUT_VALUE 0xFFF
- /******************************************/
- /* */
- /* Probe the I2C bus, and show the */
- /* user what we have found */
- /* */
- /* */
- /* */
- /******************************************/
- /******************************************/
- /* */
- /* Philips PCA9685 I2C Driver, 16 channel */
- /* Lighting controler chip */
- /* */
- /* */
- /******************************************/
- /******************************************/
- /* */
- /* Init code for the PCA9685 */
- /* */
- /******************************************/
- void init_pca9685(unsigned char address)
- {
- unsigned char buf[30];
-
- printf("Setting up channel %d\n\r",address);
-
- buf[0] = PCA9685_MODE1;
- buf[1] = PCA9685_AI;
- // buf[2] = PCA9685_OUTDRV;
- buf[2] = PCA9685_INVRT;
- i2c_WriteBuffer(address,(char *) buf, 3);
- }
- /******************************************/
- /* */
- /* Send data to a given channel of a */
- /* given PCA9685 chip */
- /* */
- /******************************************/
- void pca9685_led(unsigned char addr, int led, unsigned char *values)
- {
- unsigned char buf[5];
-
- if (led == PCA9685_ALL_LEDS) {
- buf[0] = PCA9685_ALL_LED_ON_L;
- } else {
- buf[0] = PCA9685_BASE(led);
- }
- buf[1] = values[0];
- buf[2] = values[1];
- buf[3] = values[2];
- buf[4] = values[3];
- i2c_WriteBuffer(addr, (char *)buf, 5);
- }
- /******************************************/
- /* */
- /* Send all the data to a single rgba led */
- /* at once to the PCA9685 chip */
- /* */
- /* */
- /* */
- /* color[0] = red (0-255) */
- /* color[1] = green (0-255) */
- /* color[2] = blue (0-255) */
- /* color[3] = amber (0-100%) */
- /* total brightness = level (0-100%) */
- /******************************************/
- void pca9685_rgba_led(unsigned char addr, int rgba_led, unsigned char *color, unsigned char level)
- {
- int led;
- unsigned int on, off;
- unsigned char buf[17];
-
- if (level > 100){
- //printf("Level percentage range 0 - 100 (Trying for %d)\n\r",level);
- return;
- }
- if (color[3] > 100) {
- //printf("Amber percentage range 0 - 100 (Trying for %d)\n\r",color[3]);
- return;
- }
- on=0;
- if (rgba_led == PCA9685_ALL_LEDS) {
- buf[0] = PCA9685_ALL_LED_ON_L;
- if (color[0]==0 || level==0){
- buf[1]=0;
- buf[1+PCA9685_LED_ON_H] = 0;//buf[2]
- buf[3]=0;
- buf[1+PCA9685_LED_OFF_H] = PCA9685_LED_OFF;//buf[4]
- //printf("all on, zero brightness\r\n");
- }
- else if (color[0]==0xff && level==100){
- buf[1]=0;
- buf[1+PCA9685_LED_ON_H] = PCA9685_LED_ON;//buf[2]
- buf[3]=0;
- buf[1+PCA9685_LED_OFF_H] = 0;//buf[4]
- //printf("all on, full brightness\r\n");
- }
- else{
- off = (4096 * color[0]*level) / 0xff / 100;
- buf[1+PCA9685_LED_ON_L] = on & 0xff;//buf[1]
- buf[1+PCA9685_LED_ON_H] = (on >> 8) & 0xf;//buf[2]
- buf[1+PCA9685_LED_OFF_L] = off & 0xff;//buf[3]
- buf[1+PCA9685_LED_OFF_H] = (off >> 8) & 0xf;//buf[4]
- }
- i2c_WriteBuffer(addr, (char *)buf, 5);
- //printf("All leds on\r\n");
- return;
- } else {
- buf[0] = PCA9685_BASE(rgba_led);
- }

芯片解密