本帖最后由 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: - #ifndef _HAL_RGB_LED_H
- #define _HAL_RGB_LED_H
- #include <stdio.h>
- #include "stm32f7xx_hal.h"
- #include <stdio.h>
- #define R_MAX 255
- #define G_MAX 255
- #define B_MAX 255
- #define RGB_LED_EN_Pin GPIO_PIN_3
- #define RGB_EN_GPIO_Port GPIOA
- #define RGBLED_CLK_Pin GPIO_PIN_8
- #define RGBLED_CLK_GPIO_Port GPIOB
- #define RGBLED_DIN_Pin GPIO_PIN_9
- #define RGBLED_DIN_GPIO_Port GPIOB
- #define SCL_LOW HAL_GPIO_WritePin(RGBLED_CLK_GPIO_Port, RGBLED_CLK_Pin, GPIO_PIN_RESET)
- #define SCL_HIGH HAL_GPIO_WritePin(RGBLED_CLK_GPIO_Port, RGBLED_CLK_Pin, GPIO_PIN_SET)
- #define SDA_LOW HAL_GPIO_WritePin(RGBLED_DIN_GPIO_Port, RGBLED_DIN_Pin, GPIO_PIN_RESET)
- #define SDA_HIGH HAL_GPIO_WritePin(RGBLED_DIN_GPIO_Port, RGBLED_DIN_Pin, GPIO_PIN_SET)
- ///*兼容V2.2及以上,RGB开关IO*/
- #define RGB_Enable() HAL_GPIO_WritePin(RGB_EN_GPIO_Port, RGB_LED_EN_Pin, GPIO_PIN_SET)
- #define RGB_Disable() HAL_GPIO_WritePin(RGB_EN_GPIO_Port, RGB_LED_EN_Pin, GPIO_PIN_RESET)
- void rgbLedInit(void);
- void ledRgbControl(uint8_t R,uint8_t B,uint8_t G);
- #endif /*_HAL_RGB_LED_H*/
复制代码Hal_rgb_led.c文件如下: - /**
- ******************
- *
- * @file Hal_rgb_led.c
- * @author Gizwtis
- * @version V03010100
- * @date 2016-07-05
- *
- * @brief 机智云.只为智能硬件而生
- * Gizwits Smart Cloud for Smart Products
- * 链接|增值ֵ|开放|中立|安全|自有|自由|生态
- * www.gizwits.com
- *
- ******************/
- #include "hal_rgb_led.h"
- void ledDelay(unsigned int ms)
- {
- volatile unsigned int i=0;
- for(i=0; i<ms; i++);
- }
- /**** generation clock *******/
- void clkProduce(void)
- {
- SCL_LOW; // SCL=0
- ledDelay(5);
- SCL_HIGH; // SCL=1
- ledDelay(5);
- }
- /**** send 32 zero *******/
- void send32Zero(void)
- {
- unsigned char i;
- SDA_LOW; // SDA=0
- for (i=0; i<32; i++)
- {
- clkProduce();
- }
- }
- /*** invert the grey value of the first two bits *****/
- uint8_t takeAntiCode(uint8_t dat)
- {
- uint8_t tmp = 0;
- tmp=((~dat) & 0xC0)>>6;
- return tmp;
- }
- /** send gray data ***/
- void datSend(uint32_t dx)
- {
- uint8_t i;
- for (i=0; i<32; i++)
- {
- if ((dx & 0x80000000) != 0)
- {
- SDA_HIGH; // SDA=1;
- }
- else
- {
- SDA_LOW; // SDA=0;
- }
- dx <<= 1;
- clkProduce();
- }
- }
- /*** data processing *******/
- void dataDealWithAndSend(uint8_t r, uint8_t g, uint8_t b)
- {
- uint32_t dx = 0;
- dx |= (uint32_t)0x03 << 30; // The front of the two bits 1 is flag bits
- dx |= (uint32_t)takeAntiCode(b) << 28;
- dx |= (uint32_t)takeAntiCode(g) << 26;
- dx |= (uint32_t)takeAntiCode(r) << 24;
- dx |= (uint32_t)b << 16;
- dx |= (uint32_t)g << 8;
- dx |= r;
- datSend(dx);
- }
- void rgbLedInit(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- __HAL_RCC_GPIOA_CLK_ENABLE();
- __HAL_RCC_GPIOB_CLK_ENABLE();
-
- /*Configure GPIO pin Output Level */
- HAL_GPIO_WritePin(GPIOB, RGBLED_CLK_Pin|RGBLED_DIN_Pin, GPIO_PIN_RESET);
- /*Configure GPIO pin Output Level */
- HAL_GPIO_WritePin(GPIOA, RGB_LED_EN_Pin, GPIO_PIN_RESET);
- /*Configure GPIO pins : PBPin PBPin PBPin */
- GPIO_InitStruct.Pin = RGBLED_CLK_Pin|RGBLED_DIN_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
-
- /*Configure GPIO pins : PAPin PAPin */
- GPIO_InitStruct.Pin = RGB_LED_EN_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- /**/
- // HAL_I2CEx_EnableFastModePlus(I2C_FASTMODEPLUS_PB8);
- // /**/
- // HAL_I2CEx_EnableFastModePlus(I2C_FASTMODEPLUS_PB9);
-
- RGB_Enable();
- send32Zero();
- dataDealWithAndSend(0,0,0);
- dataDealWithAndSend(0,0,0);
- }
- void ledRgbControl(uint8_t r, uint8_t g, uint8_t b)
- {
- send32Zero();
- dataDealWithAndSend(r, g, b);
- dataDealWithAndSend(r, g, b);
- }
复制代码
|