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

[资料] 《机智云Gokit3开发篇》4 RGB灯的介绍与驱动移植(HAL库)

跳转到指定楼层
楼主
 楼主| 发表于 昨天 21:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
汉枫LPB120模块
注:文章结尾附本文章源码、原理图 资料链接

概述:本文先介绍了RGB灯和gokit3板载的RGB的驱动芯片P9813的原理和RGB 灯 HAL 库驱动移植 + RGB红绿蓝颜色轮询实现(源码全解析)

这次实验使用Gokit3 开发板 MCU 模式(主控 STM32F103C8T6),基于HAL库移植RGB 灯驱动
一、RGB和P9813驱动芯片原理介绍:
在 Gokit3 的原理图中,RGB 灯的驱动核心是P9813 芯片(图中 U3),它是一款单总线控制的 RGB 全彩 LED 驱动芯片,专门用于简化 RGB 灯的硬件控制 —— 仅需 2 根控制信号线,即可实现 RGB 颜色的精准调节





引脚介绍:
9 脚(VCC) 接 VCC5V + R5(3.6Ω 电阻) 芯片电源输入(5V 供电),R5 是限流电阻,避免电源冲击
4 脚(GND) 接 GND 芯片接地引脚,保证电源回路
1 脚(DIN) 接 “DIN” 接口(对应 STM32 PB9) 串行数据输入引脚:接收 STM32 发送的颜色控制数据(对应STM32中 PB9)
2 脚(CIN) 接 “The Key” 接口(对应 STM32 PB8) 时钟输入引脚:接收 STM32 发送的同步时钟信号(对应STM32中 PB8)
5 脚(R)、6 脚(G)、7 脚(B) 接 RGB 灯的红、绿、蓝通道 直接驱动 RGB 灯的三个颜色通道,输出对应亮度的电流
14 脚(COUT)、13 脚(VOUT) 悬空(未连接) 级联输出引脚:用于多颗 P9813 串联控制(Gokit3 仅用 1 颗,故未使用)
12 脚(MODE) 接 C18(100nF 电容)→ GND 模式选择引脚:通过电容下拉至 GND,配置为 “单线模式”(Gokit3 用的单总线通信)
11 脚(CLKSEL) 接 C18(100nF 电容)→ GND 时钟模式选择引脚:电容下拉配置为 “外部时钟模式”(时钟由 STM32 的 PB8 提供)
3 脚(JEN) 接 R13(10KΩ 电阻)→ GND 使能引脚:下拉至 GND 表示 “使能芯片工作”(默认处于工作状态)
10 脚(VOUT) 悬空(未连接) 级联电源输出(同 VCC,级联时给下一颗芯片供电)

l  单总线通信,仅需 2 根线(时钟 SCL + 数据 SDA)即可控制,无需复杂硬件(如 SPI/I2C) PB8=SCL、PB9=SDA,无外设初始化
   24 位颜色控制,红(R)、绿(G)、蓝(B)各分配 8 位数据,亮度范围 0~255 R_MAX/G_MAX/B_MAX=255
l  内置反码校验,颜色数据高 2 位需传输反码,
l  帧格式固定 通信必须以 “起始帧 + 数据帧 + 重复帧” 完成
l  5V 电压兼容 适配 Gokit3 的 5V 供电,无需额外电平转换 源码无电平转换逻辑

二、Gokit3 板载的RGB 灯的介绍:
1.Gokit3 板载 RGB 灯由 P9813 驱动芯片全彩 LED 驱动芯片控制,核心特性:
通信:仅需(原理图上的SCL连PB8)+ (原理图上的SDA连PB9)2 根线即可控制颜色
颜色编码:24 位颜色数据(R/G/B 各 8 位,亮度范围 0~255)
通信规则:
先发送 32 个 0 作为起始帧,再发送 32 位颜色数据(含标志位 + 反码 + RGB 值),最后重复发送颜色数据确保生效
原理图及实物图

2. GPIO硬件配置(MCU 模式)
PA0:RGB 灯总开关,高电平使能(源码中ledRgbControl函数首行置高 PA0)
PB8/PB9:推挽输出模式,通过高低电平模拟 P9813 通信时序,无需硬件 SPI/I2C


三、Gokit3的RGB灯源码移植
本次使用的驱动文件为hal_rgb_led.h和hal_rgb_led.c这两个RGB的驱动文件
头文件:hal_rgb_led.h(宏定义 + 函数**)
源文件:hal_rgb_led.c(核心功能实现)
(1)PA0 初始化函数:rgbKeyGpioInit
void rgbKeyGpioInit(void)


解析:实现 PA0 推挽输出配置,为了兼容2.2


(2)延时函数:ledDelay


解析:给P9813 通信时序延时作用

(3)时钟生成函数:clkProduce


解析:P9813 核心时序函数,通过拉低 / 拉高 PB8 生成时钟信号,延时 40 个空循环保证时序满足 P9813 要求。

(4)起始帧发送函数:send32Zero


解析:P9813 通信必须以 32 个 0 作为起始帧,此函数通过循环生成 32 个时钟,且 SDA 始终为低,完成起始帧发送。
(5)反码处理函数:takeAntiCode



解析:P9813 协议要求颜色数据高 2 位需传输反码,此函数提取 R/G/B 值的高 2 位并取反,是官方驱动的核心协议适配逻辑。

(6)32 位数据发送函数:datSend


解析:按 P9813 ,逐位发送 32 位颜色数据,每发送 1 位生成 1 个时钟信号,是数据传输的核心函数。
(7)数据处理函数:dataDealWithAndSend


解析:将 R/G/B 值组装为 P9813 要求的 32 位数据格式(标志位 + 反码 + 颜色数据),再调用datSend发送。
(8)RGB 初始化函数:rgbLedInit


解析:初始化 PB8/PB9 为推挽输出,发送起始帧并将 RGB 灯初始化为灭灯状态,是驱动使用前必须调用的初始化函数。
(9)颜色控制函数:ledRgbControl

解析:对外提供的核心调用函数,参数为 R/G/B 亮度值(0~255),调用:如果向亮什么颜色的灯就可以调用这个函数实现RGB亮灯,一个颜色的灯有255种亮度,三个颜色的灯组合起来可以实现任何颜色的亮灯


三、实验:实现RGB几个颜色灯轮转效果(驱动移植)
整体过程:添加两个RGB驱动文件---- 工程配置好---- 调用RGB初始化函数----调用亮灯控制函数实现亮灯-----  使用delay实现简单几个颜色轮转
1、驱动文件添加
将hal_rgb_led.h放入工程Inc文件夹,hal_rgb_led.c放入Src文件夹;
在 Keil 中添加hal_rgb_led.c到工程,并配置头文件路径(确保#include "hal_rgb_led.h"不报错)。
2、初始化调用
调用:rgbLedInit();实现初始化


3、调用RGB亮灯函数,实现任何颜色的亮灯(需要颜色组合)
以下各种颜色为例,实现亮灯循环


编译烧录,观察现象,可以看到RGB灯成功驱动起来了




本文到此结束,谢谢大家!

源码、原理图资料链接
原理图:
链接: https://pan.baidu.com/s/19mmg4zj4c9RA-ejn64NxfQ?pwd=WPC1 提取码: WPC1


源码:
链接: https://pan.baidu.com/s/1Vv1K9Z519fMrRUr_dVow7A?pwd=WPC1 提取码: WPC1


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

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

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