APA102C全彩色LED控制IC
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了APA102C全彩色LED控制IC相关的知识,希望对你有一定的参考价值。
简 介: 测试了APA102C的工作机制。利用MM32F3277 MicroPython中的SPI控制APA102C工作。
关键词
: APA102C,MM32F3277,SPI
§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进行控制。
SPI管脚 | SCK | MOSI | MISO |
---|---|---|---|
SPI0 | PA5 | PA7 | PA6 |
SPI1 | PA3 | PB4 | PB3 |
SPI2 | PC9 | PA8 | PB9 |
(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的主要内容,如果未能解决你的问题,请参考以下文章