bigfanofloT 发表于 2017-5-11 21:09:20

RGB LED驱动

本帖最后由 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>

#defineR_MAX255
#defineG_MAX255
#defineB_MAX255

#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 Cloudfor Smart Products
*            链接|增值ֵ|开放|中立|安全|自有|自由|生态
*            www.gizwits.com
*
******************/
#include "hal_rgb_led.h"


void ledDelay(unsigned int ms)
{
    volatile unsignedint 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);
}

本系列帖子目录:
http://club.gizwits.com/thread-6544-1-1.html
页: [1]
查看完整版本: RGB LED驱动