树莓派GPIO入门10-使用TLC5940芯片输出多路PWM
在之前的章节,我们曾经用树莓派的IO口输出不同调宽的PWM信号来控制LED灯的亮度。
本文使用芯片TLC5940来输出多路PWM信号以同时控制多达16个LED的亮度。
在本文的基础上你可以发挥想象,制作出各种有趣的彩灯效果。
最终效果TODO
视频演示
硬件
- TLC5940芯片 X 1
- LED X 3
- 2-3k电阻一只
原理说明
简单的说,TLC5940是一个拥有16路输出的LED驱动芯片,每一路输出支持4096级!亮度调节。
老规矩,看一下它的引脚图:
跟本文无关的内容或设置在此不做说明,请自己查询datasheet:
引脚 | 功能 |
---|---|
OUT0-15 | 16路PWM信号输出(负极) |
VPRG | 指定工作模式,接GND是我们需要的PWM模式 |
SIN | 串行移位输入 |
SCLK | 串行移位寄存器时钟(上升沿有效) |
XLAT | 从移位寄存器写入GS寄存器(下文介绍)时钟(上升沿有效) |
BLANK | 当设为高电平时,关闭所有输出,GS计数器(下文介绍)也将重置 |
IREF | 跟GND之间连接一个电阻,阻值决定了输出电流的最大值 |
GSCLK | GS时钟输入(下文介绍) |
SOUT | 串行输出,级联多块芯片时使用 |
- 先将BLANK设置为H,关闭所有输出。
- 输入各组亮度信息。跟我们之前学过的芯片一样,这款芯片同样是通过移位寄存器来输入数据的。
移位寄存器用于传送12bit X 16组PWM数值GSn(n=0-15),共192bit。每组数据的值范围是0-4095。
传送顺序是倒序的:GS15,GS14。。。GS0。先传输的是OUT15的12位数据,其次是OUT14的12位数据。。。最后是OUT0的12位数据。
GSn决定了OUTn的PWM调宽。(GSn / 4095 = 0% - 100%) - 192位数据全部传送完毕后制造XLAT的上升沿,将移位寄存器里的数据写入GS寄存器。
- BLANK设置为L,打开所有输出
- 准备工作完毕,为了让TLC5940芯片正常工作,还需要向GSCLK输送时钟信号。
啥是时钟信号?简单的说就是高低电平不停交替的信号,也称作方波信号。
TLC5940会根据这个时钟信号进行从0-4095的计数(高低电平每交替一次数一次),一边计数一边检查各GSn的设定值,一旦到达GSn的值,则切换OUTn的电平一直计数到4095为止,再从0开始重新计数。从0计数到4095就是一个高低电平的切换周期。所以我们给5940提供的时钟频率越快,最后输出的PWM频率就越快。最后输出的PWM的频率 = 时钟信号的频率 / 4095。
比如时钟频率是8M,则最后从各OUT口输出的PWM频率是8MHz / 4095 = 1.953KHz。
根据TLC5940的官方文档,GSCLK可支持最高30MHz的时钟频率,也就是最高可以输出7.3KHz的PWM信号。如果是控制LED的亮度,那么让人眼感觉不到闪烁的最低频率应该是50Hz以上,所以我们应该至少给GSCLK提供不低于50 X 4095 = 200KHz的方波。树莓派Python的GPIO库翻转IO口的速度不高,实测速度只能达到60KHz,导致最后输出的PWM频率只有14Hz,会有明显的闪烁感。但我们主要是为了说明原理,明白原理了可以用别的方法来实现功能,比如使用c语言的wiringPi库的话效率会高不少,甚至可以使用外部的单片机或其他电路来产生高频率的时钟信号提供给TLC5940,这个作者也在探索中。以后有空再更新。
硬件连接
模块1 | 引脚 | 模块2 | 引脚 |
---|---|---|---|
TLC5940 | VPRG | 树莓派 | GPIO17 |
TLC5940 | SIN | 树莓派 | GPIO13 |
TLC5940 | SCLK | 树莓派 | GPIO19 |
TLC5940 | XLAT | 树莓派 | GPIO27 |
TLC5940 | BLANK | 树莓派 | GPIO23 |
TLC5940 | IREF | 树莓派 | GND(中间串联一个2-3k的电阻) |
TLC5940 | SOUT | 树莓派 | GPIO4 |
TLC5940 | OUT0 | LED0 | 负极 |
TLC5940 | OUT1 | LED1 | 负极 |
TLC5940 | OUT2 | LED2 | 负极 |
TLC5940 | VCC | 树莓派 | 5V |
TLC5940 | GND | 树莓派 | GND |
LED0,1,2 | 正极 | 树莓派 | 5V |
代码(Python)
1 | #!/usr/bin/env python |