久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5393|回復: 2
收起左側

STM32控制PCA9685程序源碼

[復制鏈接]
ID:278905 發表于 2018-1-23 13:56 | 顯示全部樓層 |閱讀模式
PCA9685 在stm32下的程序設計

  1. #include "pca9685.h"
  2. #include "pca9685_reg.h"    /* Light Driver Chip */
  3. #include "bsp_i2c_gpio.h"
  4. #define MAX_OUTPUT_INDEX        15
  5. #define MAX_OUTPUT_VALUE        0xFFF
  6. /******************************************/
  7. /*                                        */
  8. /*   Probe the I2C bus, and show the      */
  9. /*   user what we have found              */
  10. /*                                        */
  11. /*                                        */
  12. /*                                        */
  13. /******************************************/

  14. /******************************************/
  15. /*                                        */
  16. /* Philips PCA9685 I2C Driver, 16 channel */
  17. /* Lighting controler chip                */
  18. /*                                        */
  19. /*                                        */
  20. /******************************************/

  21. /******************************************/
  22. /*                                        */
  23. /* Init code for the PCA9685              */
  24. /*                                        */
  25. /******************************************/

  26. void init_pca9685(unsigned char address)
  27. {
  28.     unsigned char buf[30];
  29.    
  30.     printf("Setting up channel %d\n\r",address);
  31.    
  32.     buf[0] = PCA9685_MODE1;
  33.     buf[1] = PCA9685_AI;
  34.    // buf[2] = PCA9685_OUTDRV;
  35.     buf[2] = PCA9685_INVRT;
  36.     i2c_WriteBuffer(address,(char *) buf, 3);
  37. }

  38. /******************************************/
  39. /*                                        */
  40. /* Send data to a given channel of a      */
  41. /* given PCA9685 chip                     */
  42. /*                                        */
  43. /******************************************/

  44. void pca9685_led(unsigned char addr, int led, unsigned char *values)
  45. {
  46.     unsigned char buf[5];
  47.    
  48.     if (led == PCA9685_ALL_LEDS) {
  49.         buf[0] = PCA9685_ALL_LED_ON_L;
  50.     } else {
  51.         buf[0] = PCA9685_BASE(led);
  52.     }

  53.     buf[1] = values[0];
  54.     buf[2] = values[1];
  55.     buf[3] = values[2];
  56.     buf[4] = values[3];
  57.     i2c_WriteBuffer(addr, (char *)buf, 5);
  58. }

  59. /******************************************/
  60. /*                                        */
  61. /* Send all the data to a single rgba led */
  62. /* at once to the PCA9685 chip            */
  63. /*                                        */
  64. /*                                        */
  65. /*                                        */
  66. /* color[0] = red (0-255)                 */
  67. /* color[1] = green (0-255)               */
  68. /* color[2] = blue (0-255)                */
  69. /* color[3] = amber (0-100%)              */
  70. /* total brightness = level (0-100%)      */
  71. /******************************************/
  72. void pca9685_rgba_led(unsigned char addr, int rgba_led, unsigned char *color, unsigned char level)
  73. {
  74.     int led;
  75.     unsigned int on, off;
  76.     unsigned char buf[17];
  77.    
  78.     if (level > 100){
  79.         //printf("Level percentage range 0 - 100 (Trying for %d)\n\r",level);
  80.         return;
  81.         }
  82.     if (color[3] > 100) {
  83.         //printf("Amber percentage range 0 - 100 (Trying for %d)\n\r",color[3]);
  84.         return;
  85.         }
  86.     on=0;
  87.     if (rgba_led == PCA9685_ALL_LEDS) {
  88.         buf[0] = PCA9685_ALL_LED_ON_L;
  89.         if (color[0]==0 || level==0){
  90.             buf[1]=0;
  91.             buf[1+PCA9685_LED_ON_H] = 0;//buf[2]
  92.             buf[3]=0;
  93.             buf[1+PCA9685_LED_OFF_H] = PCA9685_LED_OFF;//buf[4]
  94.             //printf("all on, zero brightness\r\n");
  95.         }
  96.         else if (color[0]==0xff && level==100){
  97.             buf[1]=0;
  98.             buf[1+PCA9685_LED_ON_H] = PCA9685_LED_ON;//buf[2]
  99.             buf[3]=0;
  100.             buf[1+PCA9685_LED_OFF_H] = 0;//buf[4]
  101.             //printf("all on, full brightness\r\n");
  102.         }
  103.         else{
  104.             off = (4096 * color[0]*level) / 0xff / 100;
  105.             buf[1+PCA9685_LED_ON_L] = on & 0xff;//buf[1]
  106.             buf[1+PCA9685_LED_ON_H] = (on >> 8) & 0xf;//buf[2]
  107.             buf[1+PCA9685_LED_OFF_L] = off & 0xff;//buf[3]
  108.             buf[1+PCA9685_LED_OFF_H] = (off >> 8) & 0xf;//buf[4]
  109.         }
  110.         i2c_WriteBuffer(addr, (char *)buf, 5);
  111.         //printf("All leds on\r\n");
  112.         return;
  113.     } else {
  114.         buf[0] = PCA9685_BASE(rgba_led);
  115.     }   
  116.     for (led=0;led<=3;led++){
  117.         if (color[led]==0 || level==0){
  118.         buf[led*4+1+PCA9685_LED_ON_H] = 0;
  119.         buf[led*4+1+PCA9685_LED_OFF_H] = PCA9685_LED_OFF;
  120.         continue;
  121.         }
  122.         if (((color[led]==100 && led==3)|| color[led]==0xff)&& level==100) {
  123.         buf[led*4+1+PCA9685_LED_ON_H] = PCA9685_LED_ON;
  124.         buf[led*4+1+PCA9685_LED_OFF_H] = 0;
  125.         continue;
  126.         }
  127.         off = (4096 * color[led]*level) / 0xff / 100;
  128.         buf[led*4+1+PCA9685_LED_ON_L] = on & 0xff;
  129.         buf[led*4+1+PCA9685_LED_ON_H] = (on >> 8) & 0xf;
  130.         buf[led*4+1+PCA9685_LED_OFF_L] = off & 0xff;
  131.         buf[led*4+1+PCA9685_LED_OFF_H] = (off >> 8) & 0xf;
  132.     }
  133.     i2c_WriteBuffer(addr, (char *)buf, 17);
  134. }
  135. /******************************************/
  136. /*                                        */
  137. /* Calculate the register values for a    */
  138. /* given brightness percentage            */
  139. /*                                        */
  140. /******************************************/

  141. void pca9685_brightness(int percent, unsigned char *values)
  142. {
  143.     unsigned int on, off;

  144.     if (percent == 0) {
  145.     values[PCA9685_LED_ON_H] = 0;
  146.     values[PCA9685_LED_OFF_H] = PCA9685_LED_OFF;
  147.     return;
  148.     }
  149.     if (percent == 100) {
  150.     values[PCA9685_LED_ON_H] = PCA9685_LED_ON;
  151.     values[PCA9685_LED_OFF_H] = 0;
  152.     return;
  153.     }
  154.     on = 0;
  155.     off = (4096 * percent) / 100;
  156.     values[PCA9685_LED_ON_L] = on & 0xff;//0
  157.     values[PCA9685_LED_ON_H] = (on >> 8) & 0xf;//1
  158.     values[PCA9685_LED_OFF_L] = off & 0xff;//2
  159.     values[PCA9685_LED_OFF_H] = (off >> 8) & 0xf;//3
  160. }

  161. /******************************************/
  162. /*                                        */
  163. /* Set a given channel to a given level   */
  164. /*                                        */
  165. /******************************************/
  166. void channel_light(unsigned char ch, unsigned char lev)
  167. {
  168.     char            chip,led;     /* Chip Number, channel number */
  169.     unsigned char   v[4];         /* register data for givern level */
  170.    
  171.     led = ch%16;
  172.     v[0]=0;
  173.     v[1]=0;
  174.     v[2]=0;
  175.     v[3]=0;
  176.    
  177.     if(lev > 100){
  178.         printf("Level percentage range 0 - 100 (Trying for %d)\n\r",lev);
  179.         return;
  180.     }
  181.    
  182.     switch(ch/16){
  183.         case    0    :
  184.             chip=LEDDRV1;
  185.             break;
  186.         case    1    :
  187.             chip=LEDDRV2;
  188.             break;
  189.         case    2    :
  190.             chip=LEDDRV3;
  191.             break;
  192.         case    3    :
  193.             chip=LEDDRV4;
  194.             break;
  195.         case    4    :
  196.             chip=LEDDRV5;
  197.             break;
  198.         case    5    :
  199.             chip=LEDDRV6;
  200.             break;
  201.         default      :
  202.             printf("Error unknown chip %d\n\r",ch/16);
  203.             return;
  204.     }
  205.    
  206.     printf("Setting channel %d to brightness level %d chip = %d(%d),%d\n\r",
  207.         ch,lev,chip,ch/16,led);
  208.     pca9685_brightness(lev,v);    /* Calculate the brightness level */
  209.     printf("Brightness level is %02x,%02x,%02x,%02x\n\r",v[0],v[1],v[2],v[3]);
  210.     pca9685_led(chip,led,v);      /* Send to chip */
  211. }

  212. void PCA9685_SetOutput(uint8_t Address, uint8_t Output, uint16_t OnValue, uint16_t OffValue)
  213. {
  214.          
  215.         // Optional: PCA9685_I2C_SlaveAtAddress(Address), might make things slower
  216.         if (Output <= MAX_OUTPUT_INDEX && OnValue <= MAX_OUTPUT_VALUE && OffValue <= MAX_OUTPUT_VALUE)
  217.         {
  218.            uint8_t temp[4];
  219.                  temp[0]=OnValue & 0xFF;
  220.                  temp[1]=(OnValue >> 8) & 0xF;
  221.                  temp[2]=OffValue & 0xFF;
  222.                  temp[3]=(OffValue >> 8) & 0xF;
  223.                  i2c_ReadBuffer(Address,LEDn_ON_L(Output),4,temp);
  224.         }
  225. }
復制代碼


單片機源程序如下:

  1.   #include "stm32f10x.h"
  2. #include "bsp_usart1.h"
  3. #include "bsp_i2c_ee.h"
  4. #include "bsp_i2c_gpio.h"
  5. #include "pca9685_reg.h"
  6. #include "pca9685.h"
  7. #define address 0x94//pca9685 i2c器件地址,需要硬件上設置
  8. /**
  9.   * @brief  主函數
  10.   * @param  無
  11.   * @retval 無
  12.   */
  13. int main(void)
  14. {
  15.         /* USART1 config 115200 8-N-1 */
  16.         unsigned char date[4];
  17.         unsigned char rx[4],buf,i;
  18.         unsigned int delay;
  19.         USART1_Config();

  20.         // i2c_probe();//搜索iic器件id
  21.        
  22.   init_pca9685(address);
  23.        
  24.        
  25.         pca9685_brightness(100,date);//把轉空比為100%的數據填入date
  26.         pca9685_led(address,14,date);//把占空比為100%的數據寫入pca9685控制14號燈
  27.         pca9685_brightness(100,date);
  28.         pca9685_led(address,15,date);

  29.                 for(;;)                {               

  30.                 }
  31. }
  32. ……………………

  33. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
stm32-pca9685.rar (311.59 KB, 下載次數: 91)
回復

使用道具 舉報

ID:309183 發表于 2018-6-14 17:33 | 顯示全部樓層
謝謝分享,最近在弄PCA9685,,,搞機器人
回復

使用道具 舉報

ID:413119 發表于 2019-4-2 22:41 | 顯示全部樓層
謝謝樓主分享,感謝
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区四区电影视频在线观看 | 国产二区视频 | 久久99精品久久久久久 | 亚洲欧美日韩精品久久亚洲区 | 日本爱爱视频 | 天天综合永久 | 亚洲福利在线观看 | 欧美日韩在线一区二区 | 免费黄色在线 | 九九热精品在线视频 | 精品久久一区 | 亚洲精品一区二区三区在线 | 久久久久久久久久久久91 | 国产精品久久久久久久久久 | 99精品99| 玖玖免费 | 精品视频久久久 | 日韩高清一区 | 亚洲欧洲在线观看视频 | 精品欧美一区二区三区久久久小说 | 国产精品欧美一区二区三区不卡 | 日日夜夜天天干 | 91视频精选 | 亚洲高清免费视频 | 亚洲精品美女 | 欧美一级欧美一级在线播放 | 久久天堂网 | 亚洲www | 欧美aⅴ片 | 成人亚洲精品久久久久软件 | 久久久91精品国产一区二区三区 | www.4hu影院 | 一级电影免费看 | av在线免费观看网址 | 91免费观看国产 | 亚洲成人av在线 | 国产精品亚洲综合 | 国产三级在线观看播放 | 亚洲精品视频一区二区三区 | 九色综合网| 99成人|