收藏官网首页
查看: 10764|回复: 0

RGB LED驱动

321

主题

1054

帖子

4502

积分

论坛元老

Rank: 8Rank: 8

积分
4502
QQ
跳转到指定楼层
楼主
发表于 2017-5-11 21:09:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
免费使用STM32、APP自动代码生成工具
本帖最后由 bigfanofloT 于 2017-5-16 19:42 编辑

一、RGB5050 LED及其驱动P9813介绍
5050rgb灯珠是LED灯珠的一种,内部不带数字驱动器,5050是以产品尺寸命名而来,RGB是指红光、绿光、蓝光三基色。由于驱动它需要比较大的电流,所以一般不会直接用MCU的GPIO来驱动,而是通过专用的IC,gokit V2.3扩展板使用的是p9813。
P9813是一款全彩点光源LED驱动芯片,采用CMOS工艺,提供三路恒流驱动及256级灰度调制输出。采用双线传输方式(DATA与CLK),内建再生,可提升传输距离。用于驱动显示灯光变换、各式字符变换、彩色动漫图案。根据不同控制器和客户不同形式要求,进行脱机或联机运行。
IC输入电压 5V~6.5V;
内置LDO 4.5V 稳压输出;
外置单电阻反馈模式,三路驱动,每路驱动电流 0-45mA;  
带有输入信号校验功能;
二、硬件连线
由于RGB5050需要的电流较大,一般我们不会直接使用MCU的GPIO来驱动,而是通过专有IC。对于gokit V2.3扩展板,板载p9813的数据IO连接到了arduino UNO接口的SDA,时钟IO连接到了arduino UNO接口的SCL,通过MOS管的通断来控制RGB5050的电源开关,若A0输出高电平则电源开启,若A0输出低电平,则电源关闭,如图1所示:
图1 Gokit V2.3扩展板RGB5050原理图
根据Nucleo-F767ZI的原理图,图2可以知道,STM32F767ZIT6的GPIO PA3连接到了Arduino UNO接口的A0,PB8连接到了Arduino UNO接口的SCL,PB9连接到了Arduino UNO接口的SDA。
图2 Nucleo-F767ZI的Arduino UNO接口原理图
三、p9813时序
p981和MCU通信只需2根线即可,数据和时钟线。
四、完整程序

如下Hal_rgb_led.h文件定义了3个GPIO及其读写宏,十分方便移植到其它MCU:
  1. #ifndef _HAL_RGB_LED_H
  2. #define _HAL_RGB_LED_H

  3. #include <stdio.h>
  4. #include "stm32f7xx_hal.h"
  5. #include <stdio.h>

  6. #define  R_MAX  255
  7. #define  G_MAX  255
  8. #define  B_MAX  255

  9. #define RGB_LED_EN_Pin GPIO_PIN_3
  10. #define RGB_EN_GPIO_Port GPIOA
  11. #define RGBLED_CLK_Pin GPIO_PIN_8
  12. #define RGBLED_CLK_GPIO_Port GPIOB
  13. #define RGBLED_DIN_Pin GPIO_PIN_9
  14. #define RGBLED_DIN_GPIO_Port GPIOB

  15. #define SCL_LOW         HAL_GPIO_WritePin(RGBLED_CLK_GPIO_Port, RGBLED_CLK_Pin, GPIO_PIN_RESET)
  16. #define SCL_HIGH         HAL_GPIO_WritePin(RGBLED_CLK_GPIO_Port, RGBLED_CLK_Pin, GPIO_PIN_SET)

  17. #define SDA_LOW                HAL_GPIO_WritePin(RGBLED_DIN_GPIO_Port, RGBLED_DIN_Pin, GPIO_PIN_RESET)
  18. #define SDA_HIGH        HAL_GPIO_WritePin(RGBLED_DIN_GPIO_Port, RGBLED_DIN_Pin, GPIO_PIN_SET)

  19. ///*兼容V2.2及以上,RGB开关IO*/
  20. #define RGB_Enable()                HAL_GPIO_WritePin(RGB_EN_GPIO_Port, RGB_LED_EN_Pin, GPIO_PIN_SET)
  21. #define RGB_Disable()         HAL_GPIO_WritePin(RGB_EN_GPIO_Port, RGB_LED_EN_Pin, GPIO_PIN_RESET)

  22. void rgbLedInit(void);
  23. void ledRgbControl(uint8_t R,uint8_t B,uint8_t G);


  24. #endif /*_HAL_RGB_LED_H*/
复制代码
Hal_rgb_led.c文件如下:
  1. /**
  2. ******************
  3. *
  4. * @file      Hal_rgb_led.c
  5. * @author    Gizwtis
  6. * @version   V03010100
  7. * @date      2016-07-05
  8. *
  9. * @brief     机智云.只为智能硬件而生
  10. *            Gizwits Smart Cloud  for Smart Products
  11. *            链接|增值ֵ|开放|中立|安全|自有|自由|生态
  12. *            www.gizwits.com
  13. *
  14. ******************/
  15. #include "hal_rgb_led.h"


  16. void ledDelay(unsigned int ms)
  17. {
  18.     volatile unsigned  int i=0;
  19.     for(i=0; i<ms; i++);

  20. }


  21. /**** generation clock *******/
  22. void clkProduce(void)
  23. {
  24.     SCL_LOW;        // SCL=0
  25.     ledDelay(5);
  26.     SCL_HIGH;       // SCL=1
  27.     ledDelay(5);
  28. }


  29. /****  send 32 zero *******/
  30. void send32Zero(void)
  31. {
  32.     unsigned char i;
  33.     SDA_LOW;   // SDA=0
  34.     for (i=0; i<32; i++)
  35.     {
  36.         clkProduce();
  37.     }
  38. }

  39. /*** invert the grey value of the first two bits *****/
  40. uint8_t takeAntiCode(uint8_t dat)
  41. {
  42.     uint8_t tmp = 0;

  43.     tmp=((~dat) & 0xC0)>>6;
  44.     return tmp;
  45. }


  46. /** send gray data ***/
  47. void datSend(uint32_t dx)
  48. {
  49.     uint8_t i;

  50.     for (i=0; i<32; i++)
  51.     {
  52.         if ((dx & 0x80000000) != 0)
  53.         {

  54.             SDA_HIGH;     //  SDA=1;
  55.         }
  56.         else
  57.         {
  58.             SDA_LOW;    //  SDA=0;
  59.         }

  60.         dx <<= 1;
  61.         clkProduce();        
  62.     }
  63. }

  64. /*** data processing  *******/
  65. void dataDealWithAndSend(uint8_t r, uint8_t g, uint8_t b)
  66. {
  67.     uint32_t dx = 0;

  68.     dx |= (uint32_t)0x03 << 30;             // The front of the two bits 1 is flag bits
  69.     dx |= (uint32_t)takeAntiCode(b) << 28;
  70.     dx |= (uint32_t)takeAntiCode(g) << 26;
  71.     dx |= (uint32_t)takeAntiCode(r) << 24;

  72.     dx |= (uint32_t)b << 16;
  73.     dx |= (uint32_t)g << 8;
  74.     dx |= r;

  75.     datSend(dx);
  76. }

  77. void rgbLedInit(void)
  78. {
  79.         GPIO_InitTypeDef GPIO_InitStruct;
  80.           __HAL_RCC_GPIOA_CLK_ENABLE();
  81.           __HAL_RCC_GPIOB_CLK_ENABLE();
  82.         
  83.   /*Configure GPIO pin Output Level */
  84.   HAL_GPIO_WritePin(GPIOB, RGBLED_CLK_Pin|RGBLED_DIN_Pin, GPIO_PIN_RESET);
  85.         /*Configure GPIO pin Output Level */
  86.   HAL_GPIO_WritePin(GPIOA, RGB_LED_EN_Pin, GPIO_PIN_RESET);

  87.   /*Configure GPIO pins : PBPin PBPin PBPin */
  88.   GPIO_InitStruct.Pin = RGBLED_CLK_Pin|RGBLED_DIN_Pin;
  89.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  90.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  91.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  92.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  93.         
  94.         /*Configure GPIO pins : PAPin PAPin */
  95.   GPIO_InitStruct.Pin = RGB_LED_EN_Pin;
  96.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  97.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  98.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  99.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  100.   /**/
  101. //  HAL_I2CEx_EnableFastModePlus(I2C_FASTMODEPLUS_PB8);

  102. //  /**/
  103. //  HAL_I2CEx_EnableFastModePlus(I2C_FASTMODEPLUS_PB9);
  104.         
  105.                 RGB_Enable();
  106.     send32Zero();
  107.     dataDealWithAndSend(0,0,0);         
  108.     dataDealWithAndSend(0,0,0);
  109. }

  110. void ledRgbControl(uint8_t r, uint8_t g, uint8_t b)
  111. {
  112.     send32Zero();
  113.     dataDealWithAndSend(r, g, b);
  114.     dataDealWithAndSend(r, g, b);  
  115. }
复制代码

1、机智云QQ群:G1群:104975951 G2群:491509598 G3群:287087942
机智云爱好者-APP开发群: 599735135
QQ群目前非常活跃,欢迎大家参与进来,交流,讨论,答疑,解惑~~
2、机智云微信公众号: 机智云 gizwits、 机智云智能宠物屋go-iot
关注机智云Gizwits官方公众号随时掌握最新资讯和活动信息
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表