APA102C全彩色LED控制IC

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

关键词 APA102CMM32F3277SPI

APA102C
目 录
Contents
背景介绍
设计测试板
测试APA102C
测试总结

§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.2.1 APA102C放大图片

(1)封装尺寸

▲ 图1.2.2 APA102C 管脚封装信息

▲ 图1.2.2 APA102C 管脚封装信息

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

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

(2)建立元器件AD库
AD元器件库:
原理图:APA102C
PCB:APA102C

▲ 图1.2.4 元器件库

▲ 图1.2.4 元器件库

2、测试电路板

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

▲ 图1.2.5 APA102C 应用电路参考图

AD\Test\2021\LED\TestAPA102C.PcbDoc

(1)测试电路板

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

▲ 图1.2.6 测试电路原理图

▲ 图1.2.6 测试电路原理图

▲ 图1.2.7 快速制版测试PCB

▲ 图1.2.7 快速制版测试PCB

(2)焊接PCB

▲ 图1.2.8 焊接之后的测试PCB

▲ 图1.2.8 焊接之后的测试PCB

三、测试APA102C

1、APA102C控制协议

(1)级联控制协议

▲ 图1.3.1 级联控制协议

▲ 图1.3.1 级联控制协议

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

▲ 图1.3.2 发送字节协议

▲ 图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 面包板上搭建测试电路

▲ 图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的波形

▲ 图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被点亮

▲ 图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

▲ 图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  测试流水灯的效果

▲ 图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,可以完全将最后一个熄灭

▲ 图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(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((0xff,l1[2],l1[1],l1[0])) + bytes((0xff,l2[2],l2[1],l2[0])) + bytes((0xff,l3[2],l3[1],l3[0])) + bytes([0xff]*4)

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

count = 0
flag = 0
while True:
    led(led()^1)
    utime.sleep_ms(1)

    if flag == 0:
        count += 5
        if count >= 0xff:
            flag = 1
            count = 0xff
    else:
        count -= 5
        if count <= 0:
            flag = 0
            count = 0

    buf = led3light(count,count,count)
    spi.write(buf)

▲ 图1.3.9  呼吸灯测试结果

▲ 图1.3.9 呼吸灯测试结果

 

试总结 ※


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


■ 相关文献链接:

● 相关图表链接:

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值