简 介: 测试了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(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 呼吸灯测试结果
※ 测试总结 ※
测试了APA102C的工作机制。利用MM32F3277 MicroPython中的SPI控制APA102C工作。
■ 相关文献链接:
- APA102C 5050 RGB 灯珠 内置IC 单点控全彩灯珠 APA102正品灯珠5V
- APA102C
- WS2812串行可控彩色LED灯珠
- 设计带有SD卡的 MM32F3277 MicroPython 实验板
● 相关图表链接:
- 图1.2.1 APA102C放大图片
- 图1.2.2 APA102C 管脚封装信息
- 图1.2.3 根据APA102C封装图像测量对应的封装尺寸
- 图1.2.4 元器件库
- 图1.2.5 APA102C 应用电路参考图
- 图1.2.6 测试电路原理图
- 图1.2.7 快速制版测试PCB
- 图1.2.8 焊接之后的测试PCB
- 图1.3.1 级联控制协议
- 图1.3.2 发送字节协议
- 表1-3-2 MM32 SPI端口定义
- 图1.3.3 面包板上搭建测试电路
- 图1.3.4 SPI中的SCK,MOSI的波形
- 图1.3.5 第一个APA102C被点亮
- 图1.3.6 点亮三个LED
- 图1.3.7 测试流水灯的效果
- 图1.3.8 发送四个LED,可以完全将最后一个熄灭
- 图1.3.9 呼吸灯测试结果