我正在使用具有6针I / O的Atmel ATtiny13。我想控制约15个LED,但不确定如何连接所有组件。如果没有任何形式的多路复用,似乎我一次只能控制6个LED。由于微控制器的尺寸,我是否仅限于6个LED?
我正在使用具有6针I / O的Atmel ATtiny13。我想控制约15个LED,但不确定如何连接所有组件。如果没有任何形式的多路复用,似乎我一次只能控制6个LED。由于微控制器的尺寸,我是否仅限于6个LED?
Answers:
有几种方法可用于通过几个IO引脚驱动大量LED。
最简单的是标准的行/列显示多路复用。使用这种技术,您可以通过n个 IO引脚驱动 LED 。从数学上讲,占空比为:
这意味着,当所有LED都点亮(或所有行或所有列都相同)时,此技术的占空比为100%,占空比为对角线需要点亮(或所有行均不同)。仅在点亮每个LED或一个LED(或零个LED,但这并不是很重要)时,才保证100%的占空比。
Charlieplexing稍微复杂一些。使用这种技术,您可以通过n个 IO引脚驱动 LED 。只有ñ - 1米的LED可以同时使用这种技术点亮。从数学上讲,占空比为:
我要提到的最后一种方法是使用移位寄存器或IO扩展器。通过两个引脚(原始数据/时钟接口,I2C或单向SPI),您可以控制任意数量的LED。任何图案的占空比均为100%,但更新速率与LED数量成反比。这是最昂贵的方法。对于15个LED,仅升级到具有这么多IO引脚的微型灯可能会更便宜。
范例:
3个引脚上的六个LED:
PINS LEDS
0 1 2 1 2 3 4 5 6
0 0 0 0 0 0 0 0 0
0 1 Z 1 0 0 0 0 0
1 0 Z 0 1 0 0 0 0
Z 0 1 0 0 1 0 0 0
Z 1 0 0 0 0 1 0 0
0 Z 1 0 0 0 0 1 0
1 Z 0 0 0 0 0 0 1
0 0 1 0 0 1 0 1 0
0 1 0 1 0 0 1 0 0
0 1 1 1 0 0 0 1 0
1 0 0 0 1 0 0 0 1
1 0 1 0 1 1 0 0 0
1 1 0 0 0 0 1 0 1
1 1 1 0 0 0 0 0 0
如果没有多路复用(直接驱动),则只能有6个LED。
通过charlieplexing,您可以从n个引脚驱动n *(n-1)个LED。
使用I / O扩展器或移位寄存器,您可以驱动几乎无限数量的LED。
示例:MCP23008 8位I2C I / O扩展器
这是我构建的charlieplexing的示例。
这是一个灯塔光束模拟器,使用一系列与12个LED灯串并与4个GPIO交错的灯来扫描光盘周围的光束。这里有一个录像带。
该项目基于PIC,我使用的PIC12f683也是8pin uP,可以认为与8pin AVR相当。
LED的强度由中断驱动,该中断在60Hz左右提供32阶PWM。一次只能允许两个LED点亮,每个LED的占空比为50%,这是我所需要的。它还可以很好地权衡PWM刷新率与分辨率。
如果坚持“经典”方法,即在任何时间点仅以非常快的刷新率点亮单个LED,则使用charlieplexing的编码实际上非常简单。我先在纸上计算出所需的PORT和TRIS(图形专用寄存器),然后将结果存储在静态数组中。要点亮LED x,PIC只需在阵列的index [x]处查找值,然后将其直接写入PORT(稍加掩盖即可保留charliplex中未使用的其他引脚的状态)
我的项目只有12个LED而不是15个LED,或者5个GPIO允许的最大20个LED,因为我想保留一个GPIO备用用于将来的开发。
无论如何...我只是想拥有一个与您的要求相似的工作示例可能会有所帮助。
完整的源代码和原理图可在我的博客上找到。