APA102C全彩色LED控制IC

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了APA102C全彩色LED控制IC相关的知识,希望对你有一定的参考价值。

简 介: 测试了APA102C的工作机制。利用MM32F3277 MicroPython中的SPI控制APA102C工作。

关键词 APA102CMM32F3277SPI

APA102C
文章目录
背景介绍
设计测试板
管脚封装
测试电路板
测试APA102C
APA102C控制协议
测试平台
测试LED点亮
复杂LED控制
测试总结

§01 APA102C


一、背景介绍

  最初是由学生在公众号(TSINGHUAZHUOQING)提问,是否允许使用APA102C制作无线充电车模的电压显示。从TB( APA102C 5050 RGB 灯珠 内置IC 单点控全彩灯珠 APA102正品灯珠5V , ¥0.5/piece)购买到一些样品进行测试。

  APA102C 是一款集成有亮度控制的彩色(RGB)LED灯珠,采用两线控制方式,适合大多数MCU的IO口控制。比起 WS2812 使用单线脉冲序列来说,APA102C对于信号的波形没有太多的要求,因此使用起来应该是更加的方便。

二、设计测试板

1、管脚封装

  下面是APA102C放大后的图片,可以看到:

  • 内部的R,G,BLED的分布;
  • PIN1 对应的斜三角的标志;

▲ 图1.2.1 APA102C放大图片

(1)封装尺寸

▲ 图1.2.2 APA102C 管脚封装信息

▲ 图1.2.3 根据APA102C封装图像测量对应的封装尺寸

(2)建立元器件AD库

AD元器件库:
原理图:APA102C
PCB:APA102C

▲ 图1.2.4 元器件库

2、测试电路板

  下面是APA102C 应用电路参考图。

▲ 图1.2.5 APA102C 应用电路参考图

AD\\Test\\2021\\LED\\TestAPA102C.PcbDoc

(1)测试电路板

  下面设计由三个APA102C组成的测试电路。

▲ 图1.2.6 测试电路原理图

▲ 图1.2.7 快速制版测试PCB

(2)焊接PCB

▲ 图1.2.8 焊接之后的测试PCB

三、测试APA102C

1、APA102C控制协议

(1)级联控制协议

▲ 图1.3.1 级联控制协议

  下面是单个字节发送协议。

▲ 图1.3.2 发送字节协议

  因此可以使用MCU的SPI进行控制。SPI的模式:

SPI的模式:
Polarity:1
Phase:1

2、测试平台

  使用 设计带有SD卡的 MM32F3277 MicroPython 实验板 ,通过MicroPython编程,使用其中的SoftSPI进行控制。

【表1-3-2 MM32 SPI端口定义】

SPI管脚SCKMOSIMISO
SPI0PA5PA7PA6
SPI1PA3PB4PB3
SPI2PC9PA8PB9

(1)搭建测试平台

  在面包板上搭建测试电路。利用MM32F3277的SPI0,对应的SPI端口:

SPI端口:
SCK:PA5
MOSI:PA7
MISO:PA6

▲ 图1.3.3 面包板上搭建测试电路

(2)测试SPI发送字符

Ⅰ.测试代码
from machine                import Pin,SPI
import utime

spi = SPI(0, baudrate=100000, polarity=1, phase=1)
print(spi)

buf = bytes((0x55,))
while True:
    spi.write(buf)
    utime.sleep_ms(100)
Ⅱ.SPI波形

  如下是SPI中的SCK,MOSI的波形。可以看到它符合APA102c的串行通信协议。

▲ 图1.3.4 SPI中的SCK,MOSI的波形

3、测试LED点亮

(1)控制一个APA102C

Ⅰ.测试代码
def led1buf(r,g,b):
    '''
    led1buf: Construct one APA102C data
    Param r: Red LED light
    Param g: Green LED light
    Param b: Blue LED light
    Return: buf : 8+4=12bytes
    '''
    return bytes([0]*4) + bytes((0x1f, b, g, r)) + bytes([0xff]*4)

buf = led1buf(0x80, 0xff, 0x20)
print(buf)

  测试输出:

SPI(id=0, baudrate=100000, polarity=1, phase=1)
b'\\x00\\x00\\x00\\x00\\x1f \\xff\\x80\\xff\\xff\\xff\\xff'
Ⅱ.点亮第一个灯
from machine                import Pin,SPI
import utime

spi = SPI(0, baudrate=100000, polarity=1, phase=1)
print(spi)

led = Pin('PB2', Pin.OUT_PUSHPULL)

def led1buf(r,g,b):
    '''
    led1buf: Construct one APA102C data
    Param r: Red LED light
    Param g: Green LED light
    Param b: Blue LED light
    Return: buf : 8+4=12bytes
    '''
    return bytes([0]*4) + bytes((0x1f, b, g, r)) + bytes([0xff]*4)

buf = led1buf(0x80, 0xff, 0x20)
print(buf)

spi.write(buf)

while True:
    led(led()^1)
    utime.sleep_ms(100)

▲ 图1.3.5 第一个APA102C被点亮

(2)点亮三个LED

Ⅰ.测试代码
def led3buf(l1,l2,l3):
    '''
    led3buf: Construct three APA102C LED data
    Param l1: LED 1 (rgb)
    Param l2: LED 2 (rgb)
    Param l3: LED 3 (rgb)
    Return: buf : 8+4*3=20bytess
    '''
    return bytes([0]*4) + bytes((0x1f,l1[2],l1[1],l1[0])) + bytes((0x1f,l2[2],l2[1],l2[0])) + bytes((0x1f,l3[2],l3[1],l3[0])) + bytes([0xff]*4)

buf = led3buf((0xff,0xff,0xff),(0xff,0xff,0xff),(0xff,0xff,0xff))
print(buf)

spi.write(buf)
Ⅱ.测试结果

▲ 图1.3.6 点亮三个LED

4、复杂LED控制

(1)流水灯

Ⅰ.测试代码
#------------------------------------------------------------
def led3light(l1,l2,l3):
    return bytes([0]*4) + bytes((0x1f,l1,l1,l1)) + bytes((0x1f,l2,l2,l2)) + bytes((0x1f,l3,l3,l3)) + bytes([0xff]*4)

#------------------------------------------------------------
count = 0
while True:
    led(led()^1)
    utime.sleep_ms(100)

    #--------------------------------------------------------
    count += 1
    if count >= 3: count = 0

    if count == 0:
        buf = led3light(0xff, 0, 0)
    elif count == 1:
        buf = led3light(0, 0xff, 0)
    else:
        buf = led3light(0, 0, 0xff)

    spi.write(buf)
Ⅱ.测试结果

▲ 图1.3.7 测试流水灯的效果

  注意:从上述测量结果来看,最后一个LED并没有完全熄灭。因此。在输出数据的时候,最后不足一个(0000),看是否可以将最后一个LED完全熄灭?

  错误: 看错了!将LED控制的第一个字节修改为0xff,便可以满足控制要求了。

def led3light(l1,l2,l3):
    return bytes([0]*4) + bytes((0x1f,l1,l1,l1)) + bytes((0x1f,l2,l2,l2)) + bytes((0x1f,l3,l3,l3)) + bytes([0]*4) + bytes([0xff]*4)

▲ 图1.3.8 发送四个LED,可以完全将最后一个熄灭

(2)呼吸灯
from machine                import Pin,SPI
import utime

spi = SPI(0, baudrate=100000, polarity=1, phase=1)
print(spi)

led = Pin('PB2', Pin.OUT_PUSHPULL)

def led1buf(r,g,b):
    '''
    led1buf: Construct one APA102C data
    Param r: Red LED light
    Param g: Green LED light
    Param b: Blue LED light
    Return: buf : 8+4=12bytes
    '''
    return bytes([0]*4) + bytes((0xff, b, g, r)) + bytes([0xff]*4)

def led3buf以上是关于APA102C全彩色LED控制IC的主要内容,如果未能解决你的问题,请参考以下文章

Processing控制彩色LED灯

Processing控制彩色LED灯

全彩LED灯

VK1650 LED数码显示驱动IC

LED数显驱动控制电路.LED数码管显示驱动芯片(IC)-VK1629-高段位显示屏驱动

LED点阵P4.75与P5表贴三合一室内显示屏比较优缺点?